Skip to content

Commit

Permalink
pathlib tests: create test hierarchy without using class under test (#…
Browse files Browse the repository at this point in the history
…128200)

In the pathlib tests, avoid using the path class under test (`self.cls`) in
test setup. Instead we use `os` functions in `test_pathlib`, and direct
manipulation of `DummyPath` internal data in `test_pathlib_abc`.
  • Loading branch information
barneygale authored Dec 23, 2024
1 parent c5b0c90 commit d61542b
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 29 deletions.
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

0 comments on commit d61542b

Please sign in to comment.