]> granicus.if.org Git - python/commitdiff
#15872: Add tests for a 3.3 regression in the new fd-based shutil.rmtree
authorHynek Schlawack <hs@ox.cx>
Mon, 10 Dec 2012 08:00:09 +0000 (09:00 +0100)
committerHynek Schlawack <hs@ox.cx>
Mon, 10 Dec 2012 08:00:09 +0000 (09:00 +0100)
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.

Lib/test/test_shutil.py
Misc/NEWS

index 1a016b90ddf113341f3c89caa1def89d1860e140..da4260492273110d772f86f30f18763ff790facf 100644 (file)
@@ -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.
index b43799fd201afd814c8b4c1514100ff783d5f898..d6f575463dc08afdee4c79b910f58db93d5e3c8a 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.