[3.12] gh-129350: Make tests for glob with trailing slash more strict (GH-129376) (GH-129652)

Test that the trailing pathname separator is preserved.

Multiple trailing pathname separators are only preserved if the pattern
does not contain metacharacters, otherwise only one trailing pathname
separator is preserved. This is rather an implementation detail.
(cherry picked from commit 8b5c8508c7)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
Miss Islington (bot) 2025-02-04 15:42:14 +01:00 committed by GitHub
parent 0d51b29806
commit 676ee57bd6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -167,37 +167,45 @@ class GlobTests(unittest.TestCase):
self.norm('aab', 'F')]) self.norm('aab', 'F')])
def test_glob_directory_with_trailing_slash(self): def test_glob_directory_with_trailing_slash(self):
seps = (os.sep, os.altsep) if os.altsep else (os.sep,)
for sep in seps:
# Patterns ending with a slash shouldn't match non-dirs # Patterns ending with a slash shouldn't match non-dirs
res = glob.glob(self.norm('Z*Z') + os.sep) self.assertEqual(glob.glob(self.norm('Z*Z') + sep), [])
self.assertEqual(res, []) self.assertEqual(glob.glob(self.norm('ZZZ') + sep), [])
res = glob.glob(self.norm('ZZZ') + os.sep) self.assertEqual(glob.glob(self.norm('aaa') + sep),
self.assertEqual(res, []) [self.norm('aaa') + sep])
# When there is a wildcard pattern which ends with os.sep, glob() # Preserving the redundant separators is an implementation detail.
# doesn't blow up. self.assertEqual(glob.glob(self.norm('aaa') + sep*2),
res = glob.glob(self.norm('aa*') + os.sep) [self.norm('aaa') + sep*2])
self.assertEqual(len(res), 2) # When there is a wildcard pattern which ends with a pathname
# either of these results is reasonable # separator, glob() doesn't blow.
self.assertIn(set(res), [ # The result should end with the pathname separator.
{self.norm('aaa'), self.norm('aab')}, # Normalizing the trailing separator is an implementation detail.
{self.norm('aaa') + os.sep, self.norm('aab') + os.sep}, eq = self.assertSequencesEqual_noorder
]) eq(glob.glob(self.norm('aa*') + sep),
[self.norm('aaa') + os.sep, self.norm('aab') + os.sep])
# Stripping the redundant separators is an implementation detail.
eq(glob.glob(self.norm('aa*') + sep*2),
[self.norm('aaa') + os.sep, self.norm('aab') + os.sep])
def test_glob_bytes_directory_with_trailing_slash(self): def test_glob_bytes_directory_with_trailing_slash(self):
# Same as test_glob_directory_with_trailing_slash, but with a # Same as test_glob_directory_with_trailing_slash, but with a
# bytes argument. # bytes argument.
res = glob.glob(os.fsencode(self.norm('Z*Z') + os.sep)) seps = (os.sep, os.altsep) if os.altsep else (os.sep,)
self.assertEqual(res, []) for sep in seps:
res = glob.glob(os.fsencode(self.norm('ZZZ') + os.sep)) self.assertEqual(glob.glob(os.fsencode(self.norm('Z*Z') + sep)), [])
self.assertEqual(res, []) self.assertEqual(glob.glob(os.fsencode(self.norm('ZZZ') + sep)), [])
res = glob.glob(os.fsencode(self.norm('aa*') + os.sep)) self.assertEqual(glob.glob(os.fsencode(self.norm('aaa') + sep)),
self.assertEqual(len(res), 2) [os.fsencode(self.norm('aaa') + sep)])
# either of these results is reasonable self.assertEqual(glob.glob(os.fsencode(self.norm('aaa') + sep*2)),
self.assertIn(set(res), [ [os.fsencode(self.norm('aaa') + sep*2)])
{os.fsencode(self.norm('aaa')), eq = self.assertSequencesEqual_noorder
os.fsencode(self.norm('aab'))}, eq(glob.glob(os.fsencode(self.norm('aa*') + sep)),
{os.fsencode(self.norm('aaa') + os.sep), [os.fsencode(self.norm('aaa') + os.sep),
os.fsencode(self.norm('aab') + os.sep)}, os.fsencode(self.norm('aab') + os.sep)])
]) eq(glob.glob(os.fsencode(self.norm('aa*') + sep*2)),
[os.fsencode(self.norm('aaa') + os.sep),
os.fsencode(self.norm('aab') + os.sep)])
@skip_unless_symlink @skip_unless_symlink
def test_glob_symlinks(self): def test_glob_symlinks(self):
@ -205,8 +213,7 @@ class GlobTests(unittest.TestCase):
eq(self.glob('sym3'), [self.norm('sym3')]) eq(self.glob('sym3'), [self.norm('sym3')])
eq(self.glob('sym3', '*'), [self.norm('sym3', 'EF'), eq(self.glob('sym3', '*'), [self.norm('sym3', 'EF'),
self.norm('sym3', 'efg')]) self.norm('sym3', 'efg')])
self.assertIn(self.glob('sym3' + os.sep), eq(self.glob('sym3' + os.sep), [self.norm('sym3') + os.sep])
[[self.norm('sym3')], [self.norm('sym3') + os.sep]])
eq(self.glob('*', '*F'), eq(self.glob('*', '*F'),
[self.norm('aaa', 'zzzF'), [self.norm('aaa', 'zzzF'),
self.norm('aab', 'F'), self.norm('sym3', 'EF')]) self.norm('aab', 'F'), self.norm('sym3', 'EF')])