Kaydet (Commit) d16eacba authored tarafından Hynek Schlawack's avatar Hynek Schlawack

#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.
üst 17519688
...@@ -100,10 +100,56 @@ class TestShutil(unittest.TestCase): ...@@ -100,10 +100,56 @@ class TestShutil(unittest.TestCase):
self.tempdirs.append(d) self.tempdirs.append(d)
return 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): def test_rmtree_errors(self):
# filename is guaranteed not to exist # filename is guaranteed not to exist
filename = tempfile.mktemp() filename = tempfile.mktemp()
self.assertRaises(OSError, shutil.rmtree, filename) 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 # See bug #1071513 for why we don't run this on cygwin
# and bug #1076467 for why we don't run this as root. # and bug #1076467 for why we don't run this as root.
......
...@@ -685,6 +685,10 @@ Extension Modules ...@@ -685,6 +685,10 @@ Extension Modules
Tests 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 - Issue #16559: Add more tests for the json module, including some from the
official test suite at json.org. Patch by Serhiy Storchaka. official test suite at json.org. Patch by Serhiy Storchaka.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment