1 """ test_path.py - Test the path module.
2
3 This only runs on Posix and NT right now. I would like to have more
4 tests. You can help! Just add appropriate pathnames for your
5 platform (os.name) in each place where the p() function is called.
6 Then send me the result. If you can't get the test to run at all on
7 your platform, there's probably a bug in path.py -- please let me
8 know!
9
10 TempDirTestCase.testTouch() takes a while to run. It sleeps a few
11 seconds to allow some time to pass between calls to check the modify
12 time on files.
13
14 URL: http://www.jorendorff.com/articles/python/path
15 Author: Jason Orendorff <jason@jorendorff.com>
16 Date: 7 Mar 2004
17 Modified by Björn Lindqvist <bjourne@gmail.com>, January 2006
18 """
19
20 import unittest
21 import codecs, os, random, shutil, tempfile, time
22 from path import path, __version__ as path_version
23
24
25 __version__ = '2.0.4'
26
27
28
29
30 def p(**choices):
31 """ Choose a value from several possible values, based on os.name """
32 return choices[os.name]
33
34 class BasicTestCase(unittest.TestCase):
35 def testRelpath(self):
36 root = path(p(nt='C:\\', posix='/'))
37 foo = path(root, 'foo')
38 quux = path(foo, 'quux')
39 bar = path(foo, 'bar')
40 boz = path(bar, 'Baz', 'Boz')
41 up = path(os.pardir)
42
43
44 self.assertEqual(root.relpathto(boz),
45 path('foo', 'bar', 'Baz', 'Boz'))
46 self.assertEqual(bar.relpathto(boz), path('Baz', 'Boz'))
47 self.assertEqual(quux.relpathto(boz), path(up, 'bar', 'Baz', 'Boz'))
48 self.assertEqual(boz.relpathto(quux), path(up, up, up, 'quux'))
49 self.assertEqual(boz.relpathto(bar), path(up, up))
50
51
52 self.assertEqual(root.relpathto(root), os.curdir)
53 self.assertEqual(boz.relpathto(boz), os.curdir)
54
55 self.assertEqual(boz.relpathto(boz.normcase()), os.curdir)
56
57
58 cwd = path(os.getcwd())
59 self.assertEqual(boz.relpath(), cwd.relpathto(boz))
60
61 if os.name == 'nt':
62
63 d = path('D:\\')
64 self.assertEqual(d.relpathto(boz), boz)
65
66 def testStringCompatibility(self):
67 """ Test compatibility with ordinary strings. """
68 x = path('xyzzy')
69 self.assert_(x == 'xyzzy')
70 self.assert_(x == u'xyzzy')
71
72
73 items = [path('fhj'),
74 path('fgh'),
75 'E',
76 path('d'),
77 'A',
78 path('B'),
79 'c']
80 items.sort()
81 self.assert_(items == ['A', 'B', 'E', 'c', 'd', 'fgh', 'fhj'])
82
83 def testProperties(self):
84
85 f = p(nt='C:\\Program Files\\Python\\Lib\\xyzzy.py',
86 posix='/usr/local/python/lib/xyzzy.py')
87 f = path(f)
88
89
90 self.assertEqual(f.parent, p(nt='C:\\Program Files\\Python\\Lib',
91 posix='/usr/local/python/lib'))
92
93
94 self.assertEqual(f.name, 'xyzzy.py')
95 self.assertEqual(f.parent.name, p(nt='Lib', posix='lib'))
96
97
98 self.assertEqual(f.ext, '.py')
99 self.assertEqual(f.parent.ext, '')
100
101
102 self.assertEqual(f.drive, p(nt='C:', posix=''))
103
104 def testMethods(self):
105
106 self.assertEqual(path(os.curdir).abspath(), os.getcwd())
107
108
109 cwd = path.cwd()
110 self.assert_(isinstance(cwd, path))
111 self.assertEqual(cwd, os.getcwd())
112
113 def testUNC(self):
114 if hasattr(os.path, 'splitunc'):
115 p = path(r'\\python1\share1\dir1\file1.txt')
116 self.assert_(p.uncshare == r'\\python1\share1')
117 self.assert_(p.splitunc() == os.path.splitunc(str(p)))
118
119 def testDefaultCtor(self):
120 self.assert_(os.getcwd() == path().abspath())
121
122
123 self.assert_(path() == ".")
124
125
126 self.assert_(path() != path().cwd())
127
128 def testSplittingAndStripping(self):
129 p = path("~/python/config.h.in")
130 noext = p.stripext()
131 self.assert_(isinstance(p, path))
132 self.assertEquals(noext, "~/python/config.h")
133
134 def testTimeProperties(self):
135 p = path("tempfile")
136 p.touch()
137 now = int(time.time())
138 self.assertEquals(p.ctime(), now)
139 self.assertEquals(p.mtime(), now)
140 self.assertEquals(p.atime(), now)
141
142
143 class TempDirTestCase(unittest.TestCase):
144 def setUp(self):
145
146 f = tempfile.mktemp()
147 system_tmp_dir = os.path.dirname(f)
148 my_dir = 'testpath_tempdir_' + str(random.random())[2:]
149 self.tempdir = os.path.join(system_tmp_dir, my_dir)
150 os.mkdir(self.tempdir)
151
152 def tearDown(self):
153 shutil.rmtree(self.tempdir)
154
155 def testTouch(self):
156
157
158
159
160
161
162
163 d = path(self.tempdir)
164 f = path(d, 'test.txt')
165 t0 = time.time() - 3
166 f.touch()
167 t1 = time.time() + 3
168 try:
169 self.assert_(f.exists())
170 self.assert_(f.isfile())
171 self.assertEqual(f.size(), 0)
172 self.assert_(t0 <= f.mtime <= t1)
173 ct = f.ctime
174 self.assert_(t0 <= ct <= t1)
175
176 time.sleep(5)
177 fobj = file(f, 'ab')
178 fobj.write('some bytes')
179 fobj.close()
180
181 time.sleep(5)
182 t2 = time.time() - 3
183 f.touch()
184 t3 = time.time() + 3
185
186 assert t0 <= t1 < t2 <= t3
187
188 self.assert_(f.exists())
189 self.assert_(f.isfile())
190 self.assertEqual(f.size(), 10)
191 self.assert_(t2 <= f.mtime <= t3)
192 if hasattr(os.path, 'getctime'):
193 ct2 = f.ctime
194 if os.name == 'nt':
195
196 self.assertEqual(ct, ct2)
197 self.assert_(ct2 < t2)
198 else:
199
200
201 self.failUnless(ct == ct2 or ct2 == f.mtime)
202 finally:
203 f.remove()
204
205 def testListing(self):
206 d = path(self.tempdir)
207 self.assertEqual(d.listdir(), [])
208
209 f = 'testfile.txt'
210 af = path(d, f)
211 self.assertEqual(af, os.path.join(d, f))
212 af.touch()
213 try:
214 self.assert_(af.exists())
215
216 self.assertEqual(d.listdir(), [af])
217
218
219 self.assertEqual(d.glob('testfile.txt'), [af])
220 self.assertEqual(d.glob('test*.txt'), [af])
221 self.assertEqual(d.glob('*.txt'), [af])
222 self.assertEqual(d.glob('*txt'), [af])
223 self.assertEqual(d.glob('*'), [af])
224 self.assertEqual(d.glob('*.html'), [])
225 self.assertEqual(d.glob('testfile'), [])
226 finally:
227 af.remove()
228
229
230 files = [path(d, '%d.txt' % i) for i in range(20)]
231 for f in files:
232 fobj = file(f, 'w')
233 fobj.write('some text\n')
234 fobj.close()
235 try:
236 files2 = d.listdir()
237 files.sort()
238 files2.sort()
239 self.assertEqual(files, files2)
240 finally:
241 for f in files:
242 try:
243 f.remove()
244 except:
245 pass
246
247 def testMakeDirs(self):
248 d = path(self.tempdir)
249
250
251
252 tempf = path(d, 'temp.txt')
253 tempf.touch()
254 try:
255 foo = path(d, 'foo')
256 boz = path(foo, 'bar', 'baz', 'boz')
257 boz.makedirs()
258 try:
259 self.assert_(boz.isdir())
260 finally:
261 boz.removedirs()
262 self.failIf(foo.exists())
263 self.assert_(d.exists())
264
265 foo.mkdir(0750)
266 boz.makedirs(0700)
267 try:
268 self.assert_(boz.isdir())
269 finally:
270 boz.removedirs()
271 self.failIf(foo.exists())
272 self.assert_(d.exists())
273 finally:
274 os.remove(tempf)
275
276 def assertSetsEqual(self, a, b):
277 ad = {}
278 for i in a: ad[i] = None
279 bd = {}
280 for i in b: bd[i] = None
281 self.assertEqual(ad, bd)
282
283 def testShutil(self):
284
285
286
287
288 d = path(self.tempdir)
289 testDir = path(d, 'testdir')
290 testFile = path(testDir, 'testfile.txt')
291 testA = path(testDir, 'A')
292 testCopy = path(testA, 'testcopy.txt')
293 testLink = path(testA, 'testlink.txt')
294 testB = path(testDir, 'B')
295 testC = path(testB, 'C')
296 testCopyOfLink = path(testC, testA.relpathto(testLink))
297
298
299 testDir.mkdir()
300 testA.mkdir()
301 testB.mkdir()
302
303 f = open(testFile, 'w')
304 f.write('x' * 10000)
305 f.close()
306
307
308 testFile.copyfile(testCopy)
309 self.assert_(testCopy.isfile())
310
311
312 testCopy2 = path(testA, testFile.name)
313 testFile.copy(testA)
314 self.assert_(testCopy2.isfile())
315
316
317 if hasattr(os, 'symlink'):
318 testFile.symlink(testLink)
319 else:
320 testFile.copy(testLink)
321
322
323 testA.copytree(testC)
324 self.assert_(testC.isdir())
325 self.assertSetsEqual(
326 testC.listdir(),
327 [path(testC, testCopy.name),
328 path(testC, testFile.name),
329 testCopyOfLink])
330 self.assert_(not testCopyOfLink.islink())
331
332
333 testC.rmtree()
334 self.assert_(not testC.exists())
335
336
337 testA.copytree(testC, True)
338 self.assert_(testC.isdir())
339 self.assertSetsEqual(
340 testC.listdir(),
341 [path(testC, testCopy.name),
342 path(testC, testFile.name),
343 testCopyOfLink])
344 if hasattr(os, 'symlink'):
345 self.assert_(testCopyOfLink.islink())
346 self.assert_(testCopyOfLink.readlink() == testFile)
347
348
349 testDir.rmtree()
350 self.assert_(not testDir.exists())
351 self.assertList(d.listdir(), [])
352
353 def assertList(self, listing, expected):
354 listing = list(listing)
355 listing.sort()
356 expected = list(expected)
357 expected.sort()
358 self.assertEqual(listing, expected)
359
360 def testPatterns(self):
361 d = path(self.tempdir)
362 names = [ 'x.tmp', 'x.xtmp', 'x2g', 'x22', 'x.txt' ]
363 dirs = [d, path(d, 'xdir'), path(d, 'xdir.tmp'),
364 path(d, 'xdir.tmp', 'xsubdir')]
365
366 for e in dirs:
367 if not e.isdir():
368 e.makedirs()
369 for name in names:
370 path(e, name).touch()
371 self.assertList(d.listdir('*.tmp'), [path(d, 'x.tmp'),
372 path(d, 'xdir.tmp')])
373 self.assertList(d.files('*.tmp'), [path(d, 'x.tmp')])
374 self.assertList(d.dirs('*.tmp'), [path(d, 'xdir.tmp')])
375 self.assertList(d.walk(),
376 [e for e in dirs if e != d] +
377 [path(e, n) for e in dirs for n in names])
378 self.assertList(d.walk('*.tmp'),
379 [path(e, 'x.tmp') for e in dirs] +
380 [path(d, 'xdir.tmp')])
381 self.assertList(d.walkfiles('*.tmp'),
382 [path(e, 'x.tmp') for e in dirs])
383 self.assertList(d.walkdirs('*.tmp'), [path(d, 'xdir.tmp')])
384
385 self.assert_(path("/foobar/file.png").match("*.png"))
386 self.assert_(not path("/foobar/FILE.PNG").matchcase("*.png"))
387
388
389
390 if __name__ == '__main__':
391 if __version__ != path_version:
392 print ("Version mismatch: test_path.py version %s, path version %s" %
393 (__version__, path_version))
394 unittest.main()