| 
									
										
										
										
											2009-02-06 00:38:35 +00:00
										 |  |  | """Tests for distutils.file_util.""" | 
					
						
							|  |  |  | import unittest | 
					
						
							|  |  |  | import os | 
					
						
							| 
									
										
										
										
											2014-08-29 07:07:35 +03:00
										 |  |  | import errno | 
					
						
							|  |  |  | from unittest.mock import patch | 
					
						
							| 
									
										
										
										
											2009-02-06 00:38:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-30 19:37:07 +01:00
										 |  |  | from distutils.file_util import move_file, copy_file | 
					
						
							| 
									
										
										
										
											2009-02-06 00:38:35 +00:00
										 |  |  | from distutils import log | 
					
						
							| 
									
										
										
										
											2009-02-14 14:35:51 +00:00
										 |  |  | from distutils.tests import support | 
					
						
							| 
									
										
										
										
											2014-08-29 07:07:35 +03:00
										 |  |  | from distutils.errors import DistutilsFileError | 
					
						
							| 
									
										
										
										
											2017-11-18 18:17:16 +01:00
										 |  |  | from test.support import run_unittest, unlink | 
					
						
							| 
									
										
										
										
											2009-02-06 00:38:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-14 14:35:51 +00:00
										 |  |  | class FileUtilTestCase(support.TempdirManager, unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2009-02-06 00:38:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def _log(self, msg, *args): | 
					
						
							|  |  |  |         if len(args) > 0: | 
					
						
							|  |  |  |             self._logs.append(msg % args) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             self._logs.append(msg) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							| 
									
										
										
										
											2009-05-29 09:14:04 +00:00
										 |  |  |         super(FileUtilTestCase, self).setUp() | 
					
						
							| 
									
										
										
										
											2009-02-06 00:38:35 +00:00
										 |  |  |         self._logs = [] | 
					
						
							|  |  |  |         self.old_log = log.info | 
					
						
							|  |  |  |         log.info = self._log | 
					
						
							| 
									
										
										
										
											2009-02-14 14:35:51 +00:00
										 |  |  |         tmp_dir = self.mkdtemp() | 
					
						
							|  |  |  |         self.source = os.path.join(tmp_dir, 'f1') | 
					
						
							|  |  |  |         self.target = os.path.join(tmp_dir, 'f2') | 
					
						
							|  |  |  |         self.target_dir = os.path.join(tmp_dir, 'd1') | 
					
						
							| 
									
										
										
										
											2009-02-06 00:38:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         log.info = self.old_log | 
					
						
							| 
									
										
										
										
											2009-05-29 09:14:04 +00:00
										 |  |  |         super(FileUtilTestCase, self).tearDown() | 
					
						
							| 
									
										
										
										
											2009-02-06 00:38:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_move_file_verbosity(self): | 
					
						
							|  |  |  |         f = open(self.source, 'w') | 
					
						
							| 
									
										
										
										
											2010-11-05 23:51:56 +00:00
										 |  |  |         try: | 
					
						
							|  |  |  |             f.write('some content') | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             f.close() | 
					
						
							| 
									
										
										
										
											2009-02-06 00:38:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         move_file(self.source, self.target, verbose=0) | 
					
						
							|  |  |  |         wanted = [] | 
					
						
							| 
									
										
										
										
											2010-11-20 19:04:17 +00:00
										 |  |  |         self.assertEqual(self._logs, wanted) | 
					
						
							| 
									
										
										
										
											2009-02-06 00:38:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # back to original state | 
					
						
							|  |  |  |         move_file(self.target, self.source, verbose=0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         move_file(self.source, self.target, verbose=1) | 
					
						
							|  |  |  |         wanted = ['moving %s -> %s' % (self.source, self.target)] | 
					
						
							| 
									
										
										
										
											2010-11-20 19:04:17 +00:00
										 |  |  |         self.assertEqual(self._logs, wanted) | 
					
						
							| 
									
										
										
										
											2009-02-06 00:38:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # back to original state | 
					
						
							|  |  |  |         move_file(self.target, self.source, verbose=0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self._logs = [] | 
					
						
							|  |  |  |         # now the target is a dir | 
					
						
							|  |  |  |         os.mkdir(self.target_dir) | 
					
						
							|  |  |  |         move_file(self.source, self.target_dir, verbose=1) | 
					
						
							|  |  |  |         wanted = ['moving %s -> %s' % (self.source, self.target_dir)] | 
					
						
							| 
									
										
										
										
											2010-11-20 19:04:17 +00:00
										 |  |  |         self.assertEqual(self._logs, wanted) | 
					
						
							| 
									
										
										
										
											2009-02-06 00:38:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-20 11:53:12 -04:00
										 |  |  |     def test_move_file_exception_unpacking_rename(self): | 
					
						
							| 
									
										
										
										
											2014-08-29 07:07:35 +03:00
										 |  |  |         # see issue 22182 | 
					
						
							| 
									
										
										
										
											2014-09-20 11:53:12 -04:00
										 |  |  |         with patch("os.rename", side_effect=OSError("wrong", 1)), \ | 
					
						
							|  |  |  |              self.assertRaises(DistutilsFileError): | 
					
						
							| 
									
										
										
										
											2014-08-29 07:07:35 +03:00
										 |  |  |             with open(self.source, 'w') as fobj: | 
					
						
							|  |  |  |                 fobj.write('spam eggs') | 
					
						
							|  |  |  |             move_file(self.source, self.target, verbose=0) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-20 11:53:12 -04:00
										 |  |  |     def test_move_file_exception_unpacking_unlink(self): | 
					
						
							| 
									
										
										
										
											2014-08-29 07:07:35 +03:00
										 |  |  |         # see issue 22182 | 
					
						
							| 
									
										
										
										
											2014-09-20 11:53:12 -04:00
										 |  |  |         with patch("os.rename", side_effect=OSError(errno.EXDEV, "wrong")), \ | 
					
						
							|  |  |  |              patch("os.unlink", side_effect=OSError("wrong", 1)), \ | 
					
						
							|  |  |  |              self.assertRaises(DistutilsFileError): | 
					
						
							| 
									
										
										
										
											2014-08-29 07:07:35 +03:00
										 |  |  |             with open(self.source, 'w') as fobj: | 
					
						
							|  |  |  |                 fobj.write('spam eggs') | 
					
						
							|  |  |  |             move_file(self.source, self.target, verbose=0) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-30 19:37:07 +01:00
										 |  |  |     def test_copy_file_hard_link(self): | 
					
						
							|  |  |  |         with open(self.source, 'w') as f: | 
					
						
							|  |  |  |             f.write('some content') | 
					
						
							| 
									
										
										
										
											2017-11-18 18:17:16 +01:00
										 |  |  |         # Check first that copy_file() will not fall back on copying the file | 
					
						
							|  |  |  |         # instead of creating the hard link. | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             os.link(self.source, self.target) | 
					
						
							|  |  |  |         except OSError as e: | 
					
						
							|  |  |  |             self.skipTest('os.link: %s' % e) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             unlink(self.target) | 
					
						
							| 
									
										
										
										
											2014-10-30 19:37:07 +01:00
										 |  |  |         st = os.stat(self.source) | 
					
						
							|  |  |  |         copy_file(self.source, self.target, link='hard') | 
					
						
							|  |  |  |         st2 = os.stat(self.source) | 
					
						
							|  |  |  |         st3 = os.stat(self.target) | 
					
						
							|  |  |  |         self.assertTrue(os.path.samestat(st, st2), (st, st2)) | 
					
						
							|  |  |  |         self.assertTrue(os.path.samestat(st2, st3), (st2, st3)) | 
					
						
							|  |  |  |         with open(self.source, 'r') as f: | 
					
						
							|  |  |  |             self.assertEqual(f.read(), 'some content') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_copy_file_hard_link_failure(self): | 
					
						
							|  |  |  |         # If hard linking fails, copy_file() falls back on copying file | 
					
						
							|  |  |  |         # (some special filesystems don't support hard linking even under | 
					
						
							|  |  |  |         #  Unix, see issue #8876). | 
					
						
							|  |  |  |         with open(self.source, 'w') as f: | 
					
						
							|  |  |  |             f.write('some content') | 
					
						
							|  |  |  |         st = os.stat(self.source) | 
					
						
							|  |  |  |         with patch("os.link", side_effect=OSError(0, "linking unsupported")): | 
					
						
							|  |  |  |             copy_file(self.source, self.target, link='hard') | 
					
						
							|  |  |  |         st2 = os.stat(self.source) | 
					
						
							|  |  |  |         st3 = os.stat(self.target) | 
					
						
							|  |  |  |         self.assertTrue(os.path.samestat(st, st2), (st, st2)) | 
					
						
							|  |  |  |         self.assertFalse(os.path.samestat(st2, st3), (st2, st3)) | 
					
						
							|  |  |  |         for fn in (self.source, self.target): | 
					
						
							|  |  |  |             with open(fn, 'r') as f: | 
					
						
							|  |  |  |                 self.assertEqual(f.read(), 'some content') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-06 00:38:35 +00:00
										 |  |  | def test_suite(): | 
					
						
							|  |  |  |     return unittest.makeSuite(FileUtilTestCase) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							| 
									
										
										
										
											2010-11-06 02:44:43 +00:00
										 |  |  |     run_unittest(test_suite()) |