mirror of https://github.com/python/cpython
#15872: Add tests for a 3.3 regression in the new fd-based shutil.rmtree
It cause shutil.rmtree not ignore all errors. Also add a test ensuring that rmtree fails when being called on a symlink. Patch by Serhiy Storchaka.
This commit is contained in:
parent
175196886e
commit
d16eacba48
|
@ -100,10 +100,56 @@ class TestShutil(unittest.TestCase):
|
|||
self.tempdirs.append(d)
|
||||
return d
|
||||
|
||||
@support.skip_unless_symlink
|
||||
def test_rmtree_fails_on_symlink(self):
|
||||
tmp = self.mkdtemp()
|
||||
dir_ = os.path.join(tmp, 'dir')
|
||||
os.mkdir(dir_)
|
||||
link = os.path.join(tmp, 'link')
|
||||
os.symlink(dir_, link)
|
||||
self.assertRaises(OSError, shutil.rmtree, link)
|
||||
self.assertTrue(os.path.exists(dir_))
|
||||
self.assertTrue(os.path.lexists(link))
|
||||
errors = []
|
||||
def onerror(*args):
|
||||
errors.append(args)
|
||||
shutil.rmtree(link, onerror=onerror)
|
||||
self.assertEqual(len(errors), 1)
|
||||
self.assertIs(errors[0][0], os.path.islink)
|
||||
self.assertEqual(errors[0][1], link)
|
||||
self.assertIsInstance(errors[0][2][1], OSError)
|
||||
|
||||
def test_rmtree_errors(self):
|
||||
# filename is guaranteed not to exist
|
||||
filename = tempfile.mktemp()
|
||||
self.assertRaises(OSError, shutil.rmtree, filename)
|
||||
# test that ignore_errors option is honoured
|
||||
shutil.rmtree(filename, ignore_errors=True)
|
||||
|
||||
# existing file
|
||||
tmpdir = self.mkdtemp()
|
||||
self.write_file((tmpdir, "tstfile"), "")
|
||||
filename = os.path.join(tmpdir, "tstfile")
|
||||
with self.assertRaises(OSError) as cm:
|
||||
shutil.rmtree(filename)
|
||||
self.assertEqual(cm.exception.filename, filename)
|
||||
self.assertTrue(os.path.exists(filename))
|
||||
# test that ignore_errors option is honoured
|
||||
shutil.rmtree(filename, ignore_errors=True)
|
||||
self.assertTrue(os.path.exists(filename))
|
||||
errors = []
|
||||
def onerror(*args):
|
||||
errors.append(args)
|
||||
shutil.rmtree(filename, onerror=onerror)
|
||||
self.assertEqual(len(errors), 2)
|
||||
self.assertIs(errors[0][0], os.listdir)
|
||||
self.assertEqual(errors[0][1], filename)
|
||||
self.assertIsInstance(errors[0][2][1], OSError)
|
||||
self.assertEqual(errors[0][2][1].filename, filename)
|
||||
self.assertIs(errors[1][0], os.rmdir)
|
||||
self.assertEqual(errors[1][1], filename)
|
||||
self.assertIsInstance(errors[1][2][1], OSError)
|
||||
self.assertEqual(errors[1][2][1].filename, filename)
|
||||
|
||||
# See bug #1071513 for why we don't run this on cygwin
|
||||
# and bug #1076467 for why we don't run this as root.
|
||||
|
|
|
@ -685,6 +685,10 @@ Extension Modules
|
|||
Tests
|
||||
-----
|
||||
|
||||
- Issue #15872: Add tests for a 3.3 regression which caused the new fd-based
|
||||
shutil.rmtree not ignore all errors. Also add a test ensuring that rmtree
|
||||
fails when being called on a symlink. Patch by Serhiy Storchaka.
|
||||
|
||||
- Issue #16559: Add more tests for the json module, including some from the
|
||||
official test suite at json.org. Patch by Serhiy Storchaka.
|
||||
|
||||
|
|
Loading…
Reference in New Issue