diff options
Diffstat (limited to 'Lib/test/test_pathlib/test_pathlib.py')
-rw-r--r-- | Lib/test/test_pathlib/test_pathlib.py | 181 |
1 files changed, 16 insertions, 165 deletions
diff --git a/Lib/test/test_pathlib/test_pathlib.py b/Lib/test/test_pathlib/test_pathlib.py index 080b8df..f4449b1 100644 --- a/Lib/test/test_pathlib/test_pathlib.py +++ b/Lib/test/test_pathlib/test_pathlib.py @@ -41,9 +41,6 @@ root_in_posix = False if hasattr(os, 'geteuid'): root_in_posix = (os.geteuid() == 0) -delete_use_fd_functions = ( - {os.open, os.stat, os.unlink, os.rmdir} <= os.supports_dir_fd and - os.listdir in os.supports_fd and os.stat in os.supports_follow_symlinks) def patch_replace(old_test): def new_replace(self, target): @@ -776,11 +773,6 @@ class PathTest(test_pathlib_abc.DummyPathTest, PurePathTest): target = base / 'copyE' self.assertRaises(PermissionError, source.copy, target) self.assertFalse(target.exists()) - errors = [] - source.copy(target, on_error=errors.append) - self.assertEqual(len(errors), 1) - self.assertIsInstance(errors[0], PermissionError) - self.assertFalse(target.exists()) def test_copy_dir_preserve_metadata(self): base = self.cls(self.base) @@ -980,27 +972,6 @@ class PathTest(test_pathlib_abc.DummyPathTest, PurePathTest): self.assertEqual(expected_gid, gid_2) self.assertEqual(expected_name, link.group(follow_symlinks=False)) - def test_delete_uses_safe_fd_version_if_available(self): - if delete_use_fd_functions: - self.assertTrue(self.cls.delete.avoids_symlink_attacks) - d = self.cls(self.base, 'a') - d.mkdir() - try: - real_open = os.open - - class Called(Exception): - pass - - def _raiser(*args, **kwargs): - raise Called - - os.open = _raiser - self.assertRaises(Called, d.delete) - finally: - os.open = real_open - else: - self.assertFalse(self.cls.delete.avoids_symlink_attacks) - @unittest.skipIf(sys.platform[:6] == 'cygwin', "This test can't be run on Cygwin (issue #1071513).") @os_helper.skip_if_dac_override @@ -1022,10 +993,7 @@ class PathTest(test_pathlib_abc.DummyPathTest, PurePathTest): child_dir_path.chmod(new_mode) tmp.chmod(new_mode) - errors = [] - tmp.delete(on_error=errors.append) - # Test whether onerror has actually been called. - self.assertEqual(len(errors), 3) + self.assertRaises(PermissionError, tmp._delete) finally: tmp.chmod(old_dir_mode) child_file_path.chmod(old_child_file_mode) @@ -1050,7 +1018,7 @@ class PathTest(test_pathlib_abc.DummyPathTest, PurePathTest): link3 = dir1 / 'link3' _winapi.CreateJunction(str(file1), str(link3)) # make sure junctions are removed but not followed - dir1.delete() + dir1._delete() self.assertFalse(dir1.exists()) self.assertTrue(dir3.exists()) self.assertTrue(file1.exists()) @@ -1060,76 +1028,16 @@ class PathTest(test_pathlib_abc.DummyPathTest, PurePathTest): import _winapi tmp = self.cls(self.base, 'delete') tmp.mkdir() - try: - src = tmp / 'cheese' - dst = tmp / 'shop' - src.mkdir() - spam = src / 'spam' - spam.write_text('') - _winapi.CreateJunction(str(src), str(dst)) - self.assertRaises(OSError, dst.delete) - dst.delete(ignore_errors=True) - finally: - tmp.delete(ignore_errors=True) - - @needs_windows - def test_delete_outer_junction_on_error(self): - import _winapi - tmp = self.cls(self.base, 'delete') - tmp.mkdir() - dir_ = tmp / 'dir' - dir_.mkdir() - link = tmp / 'link' - _winapi.CreateJunction(str(dir_), str(link)) - try: - self.assertRaises(OSError, link.delete) - self.assertTrue(dir_.exists()) - self.assertTrue(link.exists(follow_symlinks=False)) - errors = [] - - def on_error(error): - errors.append(error) - - link.delete(on_error=on_error) - self.assertEqual(len(errors), 1) - self.assertIsInstance(errors[0], OSError) - self.assertEqual(errors[0].filename, str(link)) - finally: - os.unlink(str(link)) - - @unittest.skipUnless(delete_use_fd_functions, "requires safe delete") - def test_delete_fails_on_close(self): - # Test that the error handler is called for failed os.close() and that - # os.close() is only called once for a file descriptor. - tmp = self.cls(self.base, 'delete') - tmp.mkdir() - dir1 = tmp / 'dir1' - dir1.mkdir() - dir2 = dir1 / 'dir2' - dir2.mkdir() - - def close(fd): - orig_close(fd) - nonlocal close_count - close_count += 1 - raise OSError - - close_count = 0 - with swap_attr(os, 'close', close) as orig_close: - with self.assertRaises(OSError): - dir1.delete() - self.assertTrue(dir2.is_dir()) - self.assertEqual(close_count, 2) - - close_count = 0 - errors = [] - - with swap_attr(os, 'close', close) as orig_close: - dir1.delete(on_error=errors.append) - self.assertEqual(len(errors), 2) - self.assertEqual(errors[0].filename, str(dir2)) - self.assertEqual(errors[1].filename, str(dir1)) - self.assertEqual(close_count, 2) + src = tmp / 'cheese' + dst = tmp / 'shop' + src.mkdir() + spam = src / 'spam' + spam.write_text('') + _winapi.CreateJunction(str(src), str(dst)) + dst._delete() + self.assertFalse(dst.exists()) + self.assertTrue(spam.exists()) + self.assertTrue(src.exists()) @unittest.skipUnless(hasattr(os, "mkfifo"), 'requires os.mkfifo()') @unittest.skipIf(sys.platform == "vxworks", @@ -1137,79 +1045,22 @@ class PathTest(test_pathlib_abc.DummyPathTest, PurePathTest): def test_delete_on_named_pipe(self): p = self.cls(self.base, 'pipe') os.mkfifo(p) - p.delete() + p._delete() self.assertFalse(p.exists()) p = self.cls(self.base, 'dir') p.mkdir() os.mkfifo(p / 'mypipe') - p.delete() + p._delete() self.assertFalse(p.exists()) - @unittest.skipIf(sys.platform[:6] == 'cygwin', - "This test can't be run on Cygwin (issue #1071513).") - @os_helper.skip_if_dac_override - @os_helper.skip_unless_working_chmod - def test_delete_deleted_race_condition(self): - # bpo-37260 - # - # Test that a file or a directory deleted after it is enumerated - # by scandir() but before unlink() or rmdr() is called doesn't - # generate any errors. - def on_error(exc): - assert exc.filename - if not isinstance(exc, PermissionError): - raise - # Make the parent and the children writeable. - for p, mode in zip(paths, old_modes): - p.chmod(mode) - # Remove other dirs except one. - keep = next(p for p in dirs if str(p) != exc.filename) - for p in dirs: - if p != keep: - p.rmdir() - # Remove other files except one. - keep = next(p for p in files if str(p) != exc.filename) - for p in files: - if p != keep: - p.unlink() - - tmp = self.cls(self.base, 'delete') - tmp.mkdir() - paths = [tmp] + [tmp / f'child{i}' for i in range(6)] - dirs = paths[1::2] - files = paths[2::2] - for path in dirs: - path.mkdir() - for path in files: - path.write_text('') - - old_modes = [path.stat().st_mode for path in paths] - - # Make the parent and the children non-writeable. - new_mode = stat.S_IREAD | stat.S_IEXEC - for path in reversed(paths): - path.chmod(new_mode) - - try: - tmp.delete(on_error=on_error) - except: - # Test failed, so cleanup artifacts. - for path, mode in zip(paths, old_modes): - try: - path.chmod(mode) - except OSError: - pass - tmp.delete() - raise - def test_delete_does_not_choke_on_failing_lstat(self): try: orig_lstat = os.lstat tmp = self.cls(self.base, 'delete') def raiser(fn, *args, **kwargs): - if fn != str(tmp): + if fn != tmp: raise OSError() else: return orig_lstat(fn) @@ -1219,7 +1070,7 @@ class PathTest(test_pathlib_abc.DummyPathTest, PurePathTest): tmp.mkdir() foo = tmp / 'foo' foo.write_text('') - tmp.delete() + tmp._delete() finally: os.lstat = orig_lstat |