blob: 686ba3cd6a02f4a9faa3b0aca250173504b6254f [file] [log] [blame]
Tarek Ziadéd5eb9852009-02-06 00:31:59 +00001"""Tests for distutils.file_util."""
2import unittest
3import os
4import shutil
5
Tarek Ziadéeea9d0d2009-07-03 19:01:12 +00006from distutils.file_util import move_file, write_file, copy_file
Tarek Ziadéd5eb9852009-02-06 00:31:59 +00007from distutils import log
Tarek Ziadé13699002009-02-14 14:10:23 +00008from distutils.tests import support
Éric Araujo54274ad2011-02-03 00:12:18 +00009from test.test_support import run_unittest
Tarek Ziadéd5eb9852009-02-06 00:31:59 +000010
Antoine Pitrou78be2f42014-10-30 19:37:07 +010011
12requires_os_link = unittest.skipUnless(hasattr(os, "link"),
13 "test requires os.link()")
14
15
Tarek Ziadé13699002009-02-14 14:10:23 +000016class FileUtilTestCase(support.TempdirManager, unittest.TestCase):
Tarek Ziadéd5eb9852009-02-06 00:31:59 +000017
18 def _log(self, msg, *args):
19 if len(args) > 0:
20 self._logs.append(msg % args)
21 else:
22 self._logs.append(msg)
23
24 def setUp(self):
Tarek Ziadé3e3eace2009-05-29 08:08:07 +000025 super(FileUtilTestCase, self).setUp()
Tarek Ziadéd5eb9852009-02-06 00:31:59 +000026 self._logs = []
27 self.old_log = log.info
28 log.info = self._log
Tarek Ziadé13699002009-02-14 14:10:23 +000029 tmp_dir = self.mkdtemp()
30 self.source = os.path.join(tmp_dir, 'f1')
31 self.target = os.path.join(tmp_dir, 'f2')
32 self.target_dir = os.path.join(tmp_dir, 'd1')
Tarek Ziadéd5eb9852009-02-06 00:31:59 +000033
34 def tearDown(self):
35 log.info = self.old_log
Tarek Ziadé3e3eace2009-05-29 08:08:07 +000036 super(FileUtilTestCase, self).tearDown()
Tarek Ziadéd5eb9852009-02-06 00:31:59 +000037
38 def test_move_file_verbosity(self):
Tarek Ziadéd5eb9852009-02-06 00:31:59 +000039 f = open(self.source, 'w')
Éric Araujod1feff72010-11-06 04:06:18 +000040 try:
41 f.write('some content')
42 finally:
43 f.close()
Tarek Ziadéd5eb9852009-02-06 00:31:59 +000044
45 move_file(self.source, self.target, verbose=0)
46 wanted = []
Ezio Melotti2623a372010-11-21 13:34:58 +000047 self.assertEqual(self._logs, wanted)
Tarek Ziadéd5eb9852009-02-06 00:31:59 +000048
49 # back to original state
50 move_file(self.target, self.source, verbose=0)
51
52 move_file(self.source, self.target, verbose=1)
53 wanted = ['moving %s -> %s' % (self.source, self.target)]
Ezio Melotti2623a372010-11-21 13:34:58 +000054 self.assertEqual(self._logs, wanted)
Tarek Ziadéd5eb9852009-02-06 00:31:59 +000055
56 # back to original state
57 move_file(self.target, self.source, verbose=0)
58
59 self._logs = []
60 # now the target is a dir
61 os.mkdir(self.target_dir)
62 move_file(self.source, self.target_dir, verbose=1)
63 wanted = ['moving %s -> %s' % (self.source, self.target_dir)]
Ezio Melotti2623a372010-11-21 13:34:58 +000064 self.assertEqual(self._logs, wanted)
Tarek Ziadéd5eb9852009-02-06 00:31:59 +000065
Tarek Ziadéeea9d0d2009-07-03 19:01:12 +000066 def test_write_file(self):
67 lines = ['a', 'b', 'c']
68 dir = self.mkdtemp()
69 foo = os.path.join(dir, 'foo')
70 write_file(foo, lines)
71 content = [line.strip() for line in open(foo).readlines()]
Ezio Melotti2623a372010-11-21 13:34:58 +000072 self.assertEqual(content, lines)
Tarek Ziadéeea9d0d2009-07-03 19:01:12 +000073
74 def test_copy_file(self):
75 src_dir = self.mkdtemp()
76 foo = os.path.join(src_dir, 'foo')
77 write_file(foo, 'content')
78 dst_dir = self.mkdtemp()
79 copy_file(foo, dst_dir)
80 self.assertTrue(os.path.exists(os.path.join(dst_dir, 'foo')))
Tarek Ziadéd5eb9852009-02-06 00:31:59 +000081
Antoine Pitrou78be2f42014-10-30 19:37:07 +010082 @requires_os_link
83 def test_copy_file_hard_link(self):
84 with open(self.source, 'w') as f:
85 f.write('some content')
86 st = os.stat(self.source)
87 copy_file(self.source, self.target, link='hard')
88 st2 = os.stat(self.source)
89 st3 = os.stat(self.target)
90 self.assertTrue(os.path.samestat(st, st2), (st, st2))
91 self.assertTrue(os.path.samestat(st2, st3), (st2, st3))
92 with open(self.source, 'r') as f:
93 self.assertEqual(f.read(), 'some content')
94
95 @requires_os_link
96 def test_copy_file_hard_link_failure(self):
97 # If hard linking fails, copy_file() falls back on copying file
98 # (some special filesystems don't support hard linking even under
99 # Unix, see issue #8876).
100 with open(self.source, 'w') as f:
101 f.write('some content')
102 st = os.stat(self.source)
103 def _os_link(*args):
104 raise OSError(0, "linking unsupported")
105 old_link = os.link
106 os.link = _os_link
107 try:
108 copy_file(self.source, self.target, link='hard')
109 finally:
110 os.link = old_link
111 st2 = os.stat(self.source)
112 st3 = os.stat(self.target)
113 self.assertTrue(os.path.samestat(st, st2), (st, st2))
114 self.assertFalse(os.path.samestat(st2, st3), (st2, st3))
115 for fn in (self.source, self.target):
116 with open(fn, 'r') as f:
117 self.assertEqual(f.read(), 'some content')
118
119
Tarek Ziadéd5eb9852009-02-06 00:31:59 +0000120def test_suite():
121 return unittest.makeSuite(FileUtilTestCase)
122
123if __name__ == "__main__":
Éric Araujo54274ad2011-02-03 00:12:18 +0000124 run_unittest(test_suite())