Skip to content

pathlib tests: create test hierarchy without using class under test #128200

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Dec 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 36 additions & 2 deletions Lib/test/test_pathlib/test_pathlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -578,10 +578,44 @@ def setUp(self):
if name in _tests_needing_symlinks and not self.can_symlink:
self.skipTest('requires symlinks')
super().setUp()
os.chmod(self.parser.join(self.base, 'dirE'), 0)

def createTestHierarchy(self):
os.mkdir(self.base)
os.mkdir(os.path.join(self.base, 'dirA'))
os.mkdir(os.path.join(self.base, 'dirB'))
os.mkdir(os.path.join(self.base, 'dirC'))
os.mkdir(os.path.join(self.base, 'dirC', 'dirD'))
os.mkdir(os.path.join(self.base, 'dirE'))
with open(os.path.join(self.base, 'fileA'), 'wb') as f:
f.write(b"this is file A\n")
with open(os.path.join(self.base, 'dirB', 'fileB'), 'wb') as f:
f.write(b"this is file B\n")
with open(os.path.join(self.base, 'dirC', 'fileC'), 'wb') as f:
f.write(b"this is file C\n")
with open(os.path.join(self.base, 'dirC', 'novel.txt'), 'wb') as f:
f.write(b"this is a novel\n")
with open(os.path.join(self.base, 'dirC', 'dirD', 'fileD'), 'wb') as f:
f.write(b"this is file D\n")
os.chmod(os.path.join(self.base, 'dirE'), 0)
if self.can_symlink:
# Relative symlinks.
os.symlink('fileA', os.path.join(self.base, 'linkA'))
os.symlink('non-existing', os.path.join(self.base, 'brokenLink'))
os.symlink('dirB',
os.path.join(self.base, 'linkB'),
target_is_directory=True)
os.symlink(os.path.join('..', 'dirB'),
os.path.join(self.base, 'dirA', 'linkC'),
target_is_directory=True)
# This one goes upwards, creating a loop.
os.symlink(os.path.join('..', 'dirB'),
os.path.join(self.base, 'dirB', 'linkD'),
target_is_directory=True)
# Broken symlink (pointing to itself).
os.symlink('brokenLinkLoop', os.path.join(self.base, 'brokenLinkLoop'))

def tearDown(self):
os.chmod(self.parser.join(self.base, 'dirE'), 0o777)
os.chmod(os.path.join(self.base, 'dirE'), 0o777)
os_helper.rmtree(self.base)

def tempdir(self):
Expand Down
46 changes: 19 additions & 27 deletions Lib/test/test_pathlib/test_pathlib_abc.py
Original file line number Diff line number Diff line change
Expand Up @@ -1437,33 +1437,25 @@ class DummyPathTest(DummyPurePathTest):

def setUp(self):
super().setUp()
parser = self.cls.parser
p = self.cls(self.base)
p.mkdir(parents=True)
p.joinpath('dirA').mkdir()
p.joinpath('dirB').mkdir()
p.joinpath('dirC').mkdir()
p.joinpath('dirC', 'dirD').mkdir()
p.joinpath('dirE').mkdir()
with p.joinpath('fileA').open('wb') as f:
f.write(b"this is file A\n")
with p.joinpath('dirB', 'fileB').open('wb') as f:
f.write(b"this is file B\n")
with p.joinpath('dirC', 'fileC').open('wb') as f:
f.write(b"this is file C\n")
with p.joinpath('dirC', 'novel.txt').open('wb') as f:
f.write(b"this is a novel\n")
with p.joinpath('dirC', 'dirD', 'fileD').open('wb') as f:
f.write(b"this is file D\n")
if self.can_symlink:
p.joinpath('linkA').symlink_to('fileA')
p.joinpath('brokenLink').symlink_to('non-existing')
p.joinpath('linkB').symlink_to('dirB', target_is_directory=True)
p.joinpath('dirA', 'linkC').symlink_to(
parser.join('..', 'dirB'), target_is_directory=True)
p.joinpath('dirB', 'linkD').symlink_to(
parser.join('..', 'dirB'), target_is_directory=True)
p.joinpath('brokenLinkLoop').symlink_to('brokenLinkLoop')
self.createTestHierarchy()

def createTestHierarchy(self):
cls = self.cls
cls._files = {
f'{self.base}/fileA': b'this is file A\n',
f'{self.base}/dirB/fileB': b'this is file B\n',
f'{self.base}/dirC/fileC': b'this is file C\n',
f'{self.base}/dirC/dirD/fileD': b'this is file D\n',
f'{self.base}/dirC/novel.txt': b'this is a novel\n',
}
cls._directories = {
f'{self.base}': {'fileA', 'dirA', 'dirB', 'dirC', 'dirE'},
f'{self.base}/dirA': set(),
f'{self.base}/dirB': {'fileB'},
f'{self.base}/dirC': {'fileC', 'dirD', 'novel.txt'},
f'{self.base}/dirC/dirD': {'fileD'},
f'{self.base}/dirE': set(),
}

def tearDown(self):
cls = self.cls
Expand Down
Loading