Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(760)

Side by Side Diff: Lib/test/test_shutil.py

Issue 15202: followlinks/follow_symlinks/symlinks flags unification.
Patch Set: Created 10 months, 3 weeks ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Lib/shutil.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright (C) 2003 Python Software Foundation 1 # Copyright (C) 2003 Python Software Foundation
2 2
3 import unittest 3 import unittest
4 import shutil 4 import shutil
5 import tempfile 5 import tempfile
6 import sys 6 import sys
7 import stat 7 import stat
8 import os 8 import os
9 import os.path 9 import os.path
10 import errno 10 import errno
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 dst_link = os.path.join(tmp_dir, 'quux') 270 dst_link = os.path.join(tmp_dir, 'quux')
271 write_file(src, 'foo') 271 write_file(src, 'foo')
272 write_file(dst, 'foo') 272 write_file(dst, 'foo')
273 os.symlink(src, src_link) 273 os.symlink(src, src_link)
274 os.symlink(dst, dst_link) 274 os.symlink(dst, dst_link)
275 os.chmod(src, stat.S_IRWXU|stat.S_IRWXG) 275 os.chmod(src, stat.S_IRWXU|stat.S_IRWXG)
276 os.chmod(dst, stat.S_IRWXU) 276 os.chmod(dst, stat.S_IRWXU)
277 os.lchmod(src_link, stat.S_IRWXO|stat.S_IRWXG) 277 os.lchmod(src_link, stat.S_IRWXO|stat.S_IRWXG)
278 # link to link 278 # link to link
279 os.lchmod(dst_link, stat.S_IRWXO) 279 os.lchmod(dst_link, stat.S_IRWXO)
280 shutil.copymode(src_link, dst_link, symlinks=True) 280 shutil.copymode(src_link, dst_link, follow_symlinks=False)
281 self.assertEqual(os.lstat(src_link).st_mode, 281 self.assertEqual(os.lstat(src_link).st_mode,
282 os.lstat(dst_link).st_mode) 282 os.lstat(dst_link).st_mode)
283 self.assertNotEqual(os.stat(src).st_mode, os.stat(dst).st_mode) 283 self.assertNotEqual(os.stat(src).st_mode, os.stat(dst).st_mode)
284 # src link - use chmod 284 # src link - use chmod
285 os.lchmod(dst_link, stat.S_IRWXO) 285 os.lchmod(dst_link, stat.S_IRWXO)
286 shutil.copymode(src_link, dst, symlinks=True) 286 shutil.copymode(src_link, dst, follow_symlinks=False)
287 self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) 287 self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode)
288 # dst link - use chmod 288 # dst link - use chmod
289 os.lchmod(dst_link, stat.S_IRWXO) 289 os.lchmod(dst_link, stat.S_IRWXO)
290 shutil.copymode(src, dst_link, symlinks=True) 290 shutil.copymode(src, dst_link, follow_symlinks=False)
291 self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) 291 self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode)
292 292
293 @unittest.skipIf(hasattr(os, 'lchmod'), 'requires os.lchmod to be missing') 293 @unittest.skipIf(hasattr(os, 'lchmod'), 'requires os.lchmod to be missing')
294 @support.skip_unless_symlink 294 @support.skip_unless_symlink
295 def test_copymode_symlink_to_symlink_wo_lchmod(self): 295 def test_copymode_symlink_to_symlink_wo_lchmod(self):
296 tmp_dir = self.mkdtemp() 296 tmp_dir = self.mkdtemp()
297 src = os.path.join(tmp_dir, 'foo') 297 src = os.path.join(tmp_dir, 'foo')
298 dst = os.path.join(tmp_dir, 'bar') 298 dst = os.path.join(tmp_dir, 'bar')
299 src_link = os.path.join(tmp_dir, 'baz') 299 src_link = os.path.join(tmp_dir, 'baz')
300 dst_link = os.path.join(tmp_dir, 'quux') 300 dst_link = os.path.join(tmp_dir, 'quux')
301 write_file(src, 'foo') 301 write_file(src, 'foo')
302 write_file(dst, 'foo') 302 write_file(dst, 'foo')
303 os.symlink(src, src_link) 303 os.symlink(src, src_link)
304 os.symlink(dst, dst_link) 304 os.symlink(dst, dst_link)
305 shutil.copymode(src_link, dst_link, symlinks=True) # silent fail 305 shutil.copymode(src_link, dst_link, follow_symlinks=False) # silent fai l
306 306
307 @support.skip_unless_symlink 307 @support.skip_unless_symlink
308 def test_copystat_symlinks(self): 308 def test_copystat_symlinks(self):
309 tmp_dir = self.mkdtemp() 309 tmp_dir = self.mkdtemp()
310 src = os.path.join(tmp_dir, 'foo') 310 src = os.path.join(tmp_dir, 'foo')
311 dst = os.path.join(tmp_dir, 'bar') 311 dst = os.path.join(tmp_dir, 'bar')
312 src_link = os.path.join(tmp_dir, 'baz') 312 src_link = os.path.join(tmp_dir, 'baz')
313 dst_link = os.path.join(tmp_dir, 'qux') 313 dst_link = os.path.join(tmp_dir, 'qux')
314 write_file(src, 'foo') 314 write_file(src, 'foo')
315 src_stat = os.stat(src) 315 src_stat = os.stat(src)
316 os.utime(src, (src_stat.st_atime, 316 os.utime(src, (src_stat.st_atime,
317 src_stat.st_mtime - 42.0)) # ensure different mtimes 317 src_stat.st_mtime - 42.0)) # ensure different mtimes
318 write_file(dst, 'bar') 318 write_file(dst, 'bar')
319 self.assertNotEqual(os.stat(src).st_mtime, os.stat(dst).st_mtime) 319 self.assertNotEqual(os.stat(src).st_mtime, os.stat(dst).st_mtime)
320 os.symlink(src, src_link) 320 os.symlink(src, src_link)
321 os.symlink(dst, dst_link) 321 os.symlink(dst, dst_link)
322 if hasattr(os, 'lchmod'): 322 if hasattr(os, 'lchmod'):
323 os.lchmod(src_link, stat.S_IRWXO) 323 os.lchmod(src_link, stat.S_IRWXO)
324 if hasattr(os, 'lchflags') and hasattr(stat, 'UF_NODUMP'): 324 if hasattr(os, 'lchflags') and hasattr(stat, 'UF_NODUMP'):
325 os.lchflags(src_link, stat.UF_NODUMP) 325 os.lchflags(src_link, stat.UF_NODUMP)
326 src_link_stat = os.lstat(src_link) 326 src_link_stat = os.lstat(src_link)
327 # follow 327 # follow
328 if hasattr(os, 'lchmod'): 328 if hasattr(os, 'lchmod'):
329 shutil.copystat(src_link, dst_link, symlinks=False) 329 shutil.copystat(src_link, dst_link, follow_symlinks=True)
330 self.assertNotEqual(src_link_stat.st_mode, os.stat(dst).st_mode) 330 self.assertNotEqual(src_link_stat.st_mode, os.stat(dst).st_mode)
331 # don't follow 331 # don't follow
332 shutil.copystat(src_link, dst_link, symlinks=True) 332 shutil.copystat(src_link, dst_link, follow_symlinks=False)
333 dst_link_stat = os.lstat(dst_link) 333 dst_link_stat = os.lstat(dst_link)
334 if os.utime in os.supports_follow_symlinks: 334 if os.utime in os.supports_follow_symlinks:
335 for attr in 'st_atime', 'st_mtime': 335 for attr in 'st_atime', 'st_mtime':
336 # The modification times may be truncated in the new file. 336 # The modification times may be truncated in the new file.
337 self.assertLessEqual(getattr(src_link_stat, attr), 337 self.assertLessEqual(getattr(src_link_stat, attr),
338 getattr(dst_link_stat, attr) + 1) 338 getattr(dst_link_stat, attr) + 1)
339 if hasattr(os, 'lchmod'): 339 if hasattr(os, 'lchmod'):
340 self.assertEqual(src_link_stat.st_mode, dst_link_stat.st_mode) 340 self.assertEqual(src_link_stat.st_mode, dst_link_stat.st_mode)
341 if hasattr(os, 'lchflags') and hasattr(src_link_stat, 'st_flags'): 341 if hasattr(os, 'lchflags') and hasattr(src_link_stat, 'st_flags'):
342 self.assertEqual(src_link_stat.st_flags, dst_link_stat.st_flags) 342 self.assertEqual(src_link_stat.st_flags, dst_link_stat.st_flags)
343 # tell to follow but dst is not a link 343 # tell to follow but dst is not a link
344 shutil.copystat(src_link, dst, symlinks=True) 344 shutil.copystat(src_link, dst, follow_symlinks=False)
345 self.assertTrue(abs(os.stat(src).st_mtime - os.stat(dst).st_mtime) < 345 self.assertTrue(abs(os.stat(src).st_mtime - os.stat(dst).st_mtime) <
346 00000.1) 346 00000.1)
347 347
348 @unittest.skipUnless(hasattr(os, 'chflags') and 348 @unittest.skipUnless(hasattr(os, 'chflags') and
349 hasattr(errno, 'EOPNOTSUPP') and 349 hasattr(errno, 'EOPNOTSUPP') and
350 hasattr(errno, 'ENOTSUP'), 350 hasattr(errno, 'ENOTSUP'),
351 "requires os.chflags, EOPNOTSUPP & ENOTSUP") 351 "requires os.chflags, EOPNOTSUPP & ENOTSUP")
352 def test_copystat_handles_harmless_chflags_errors(self): 352 def test_copystat_handles_harmless_chflags_errors(self):
353 tmpdir = self.mkdtemp() 353 tmpdir = self.mkdtemp()
354 file1 = os.path.join(tmpdir, 'file1') 354 file1 = os.path.join(tmpdir, 'file1')
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
422 src = os.path.join(tmp_dir, 'foo') 422 src = os.path.join(tmp_dir, 'foo')
423 src_link = os.path.join(tmp_dir, 'baz') 423 src_link = os.path.join(tmp_dir, 'baz')
424 write_file(src, 'foo') 424 write_file(src, 'foo')
425 os.symlink(src, src_link) 425 os.symlink(src, src_link)
426 os.setxattr(src, 'trusted.foo', b'42') 426 os.setxattr(src, 'trusted.foo', b'42')
427 os.setxattr(src_link, 'trusted.foo', b'43', follow_symlinks=False) 427 os.setxattr(src_link, 'trusted.foo', b'43', follow_symlinks=False)
428 dst = os.path.join(tmp_dir, 'bar') 428 dst = os.path.join(tmp_dir, 'bar')
429 dst_link = os.path.join(tmp_dir, 'qux') 429 dst_link = os.path.join(tmp_dir, 'qux')
430 write_file(dst, 'bar') 430 write_file(dst, 'bar')
431 os.symlink(dst, dst_link) 431 os.symlink(dst, dst_link)
432 shutil._copyxattr(src_link, dst_link, symlinks=True) 432 shutil._copyxattr(src_link, dst_link, follow_symlinks=False)
433 self.assertEqual(os.getxattr(dst_link, 'trusted.foo', follow_symlinks=Fa lse), b'43') 433 self.assertEqual(os.getxattr(dst_link, 'trusted.foo', follow_symlinks=Fa lse), b'43')
434 self.assertRaises(OSError, os.getxattr, dst, 'trusted.foo') 434 self.assertRaises(OSError, os.getxattr, dst, 'trusted.foo')
435 shutil._copyxattr(src_link, dst, symlinks=True) 435 shutil._copyxattr(src_link, dst, follow_symlinks=False)
436 self.assertEqual(os.getxattr(dst, 'trusted.foo'), b'43') 436 self.assertEqual(os.getxattr(dst, 'trusted.foo'), b'43')
437 437
438 @support.skip_unless_symlink 438 @support.skip_unless_symlink
439 def test_copy_symlinks(self): 439 def test_copy_symlinks(self):
440 tmp_dir = self.mkdtemp() 440 tmp_dir = self.mkdtemp()
441 src = os.path.join(tmp_dir, 'foo') 441 src = os.path.join(tmp_dir, 'foo')
442 dst = os.path.join(tmp_dir, 'bar') 442 dst = os.path.join(tmp_dir, 'bar')
443 src_link = os.path.join(tmp_dir, 'baz') 443 src_link = os.path.join(tmp_dir, 'baz')
444 write_file(src, 'foo') 444 write_file(src, 'foo')
445 os.symlink(src, src_link) 445 os.symlink(src, src_link)
446 if hasattr(os, 'lchmod'): 446 if hasattr(os, 'lchmod'):
447 os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO) 447 os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO)
448 # don't follow 448 # don't follow
449 shutil.copy(src_link, dst, symlinks=False) 449 shutil.copy(src_link, dst, follow_symlinks=True)
450 self.assertFalse(os.path.islink(dst)) 450 self.assertFalse(os.path.islink(dst))
451 self.assertEqual(read_file(src), read_file(dst)) 451 self.assertEqual(read_file(src), read_file(dst))
452 os.remove(dst) 452 os.remove(dst)
453 # follow 453 # follow
454 shutil.copy(src_link, dst, symlinks=True) 454 shutil.copy(src_link, dst, follow_symlinks=False)
455 self.assertTrue(os.path.islink(dst)) 455 self.assertTrue(os.path.islink(dst))
456 self.assertEqual(os.readlink(dst), os.readlink(src_link)) 456 self.assertEqual(os.readlink(dst), os.readlink(src_link))
457 if hasattr(os, 'lchmod'): 457 if hasattr(os, 'lchmod'):
458 self.assertEqual(os.lstat(src_link).st_mode, 458 self.assertEqual(os.lstat(src_link).st_mode,
459 os.lstat(dst).st_mode) 459 os.lstat(dst).st_mode)
460 460
461 @support.skip_unless_symlink 461 @support.skip_unless_symlink
462 def test_copy2_symlinks(self): 462 def test_copy2_symlinks(self):
463 tmp_dir = self.mkdtemp() 463 tmp_dir = self.mkdtemp()
464 src = os.path.join(tmp_dir, 'foo') 464 src = os.path.join(tmp_dir, 'foo')
465 dst = os.path.join(tmp_dir, 'bar') 465 dst = os.path.join(tmp_dir, 'bar')
466 src_link = os.path.join(tmp_dir, 'baz') 466 src_link = os.path.join(tmp_dir, 'baz')
467 write_file(src, 'foo') 467 write_file(src, 'foo')
468 os.symlink(src, src_link) 468 os.symlink(src, src_link)
469 if hasattr(os, 'lchmod'): 469 if hasattr(os, 'lchmod'):
470 os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO) 470 os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO)
471 if hasattr(os, 'lchflags') and hasattr(stat, 'UF_NODUMP'): 471 if hasattr(os, 'lchflags') and hasattr(stat, 'UF_NODUMP'):
472 os.lchflags(src_link, stat.UF_NODUMP) 472 os.lchflags(src_link, stat.UF_NODUMP)
473 src_stat = os.stat(src) 473 src_stat = os.stat(src)
474 src_link_stat = os.lstat(src_link) 474 src_link_stat = os.lstat(src_link)
475 # follow 475 # follow
476 shutil.copy2(src_link, dst, symlinks=False) 476 shutil.copy2(src_link, dst, follow_symlinks=True)
477 self.assertFalse(os.path.islink(dst)) 477 self.assertFalse(os.path.islink(dst))
478 self.assertEqual(read_file(src), read_file(dst)) 478 self.assertEqual(read_file(src), read_file(dst))
479 os.remove(dst) 479 os.remove(dst)
480 # don't follow 480 # don't follow
481 shutil.copy2(src_link, dst, symlinks=True) 481 shutil.copy2(src_link, dst, follow_symlinks=False)
482 self.assertTrue(os.path.islink(dst)) 482 self.assertTrue(os.path.islink(dst))
483 self.assertEqual(os.readlink(dst), os.readlink(src_link)) 483 self.assertEqual(os.readlink(dst), os.readlink(src_link))
484 dst_stat = os.lstat(dst) 484 dst_stat = os.lstat(dst)
485 if os.utime in os.supports_follow_symlinks: 485 if os.utime in os.supports_follow_symlinks:
486 for attr in 'st_atime', 'st_mtime': 486 for attr in 'st_atime', 'st_mtime':
487 # The modification times may be truncated in the new file. 487 # The modification times may be truncated in the new file.
488 self.assertLessEqual(getattr(src_link_stat, attr), 488 self.assertLessEqual(getattr(src_link_stat, attr),
489 getattr(dst_stat, attr) + 1) 489 getattr(dst_stat, attr) + 1)
490 if hasattr(os, 'lchmod'): 490 if hasattr(os, 'lchmod'):
491 self.assertEqual(src_link_stat.st_mode, dst_stat.st_mode) 491 self.assertEqual(src_link_stat.st_mode, dst_stat.st_mode)
(...skipping 17 matching lines...) Expand all
509 @support.skip_unless_symlink 509 @support.skip_unless_symlink
510 def test_copyfile_symlinks(self): 510 def test_copyfile_symlinks(self):
511 tmp_dir = self.mkdtemp() 511 tmp_dir = self.mkdtemp()
512 src = os.path.join(tmp_dir, 'src') 512 src = os.path.join(tmp_dir, 'src')
513 dst = os.path.join(tmp_dir, 'dst') 513 dst = os.path.join(tmp_dir, 'dst')
514 dst_link = os.path.join(tmp_dir, 'dst_link') 514 dst_link = os.path.join(tmp_dir, 'dst_link')
515 link = os.path.join(tmp_dir, 'link') 515 link = os.path.join(tmp_dir, 'link')
516 write_file(src, 'foo') 516 write_file(src, 'foo')
517 os.symlink(src, link) 517 os.symlink(src, link)
518 # don't follow 518 # don't follow
519 shutil.copyfile(link, dst_link, symlinks=True) 519 shutil.copyfile(link, dst_link, follow_symlinks=False)
520 self.assertTrue(os.path.islink(dst_link)) 520 self.assertTrue(os.path.islink(dst_link))
521 self.assertEqual(os.readlink(link), os.readlink(dst_link)) 521 self.assertEqual(os.readlink(link), os.readlink(dst_link))
522 # follow 522 # follow
523 shutil.copyfile(link, dst) 523 shutil.copyfile(link, dst)
524 self.assertFalse(os.path.islink(dst)) 524 self.assertFalse(os.path.islink(dst))
525 525
526 def test_rmtree_uses_safe_fd_version_if_available(self): 526 def test_rmtree_uses_safe_fd_version_if_available(self):
527 _use_fd_functions = ({os.open, os.stat, os.unlink, os.rmdir} <= 527 _use_fd_functions = ({os.open, os.stat, os.unlink, os.rmdir} <=
528 os.supports_dir_fd and 528 os.supports_dir_fd and
529 os.listdir in os.supports_fd and 529 os.listdir in os.supports_fd and
(...skipping 1071 matching lines...) Expand 10 before | Expand all | Expand 10 after
1601 1601
1602 self.assertEqual(expected, actual) 1602 self.assertEqual(expected, actual)
1603 1603
1604 1604
1605 def test_main(): 1605 def test_main():
1606 support.run_unittest(TestShutil, TestMove, TestCopyFile, 1606 support.run_unittest(TestShutil, TestMove, TestCopyFile,
1607 TermsizeTests, TestWhich) 1607 TermsizeTests, TestWhich)
1608 1608
1609 if __name__ == '__main__': 1609 if __name__ == '__main__':
1610 test_main() 1610 test_main()
OLDNEW
« no previous file with comments | « Lib/shutil.py ('k') | no next file » | no next file with comments »

RSS Feeds Recent Issues | This issue
This is Rietveld cbc36f91f3f7