17db96d56Sopenharmony_ciimport glob 27db96d56Sopenharmony_ciimport os 37db96d56Sopenharmony_ciimport shutil 47db96d56Sopenharmony_ciimport sys 57db96d56Sopenharmony_ciimport unittest 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_cifrom test.support.os_helper import (TESTFN, skip_unless_symlink, 87db96d56Sopenharmony_ci can_symlink, create_empty_file, change_cwd) 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ciclass GlobTests(unittest.TestCase): 127db96d56Sopenharmony_ci dir_fd = None 137db96d56Sopenharmony_ci 147db96d56Sopenharmony_ci def norm(self, *parts): 157db96d56Sopenharmony_ci return os.path.normpath(os.path.join(self.tempdir, *parts)) 167db96d56Sopenharmony_ci 177db96d56Sopenharmony_ci def joins(self, *tuples): 187db96d56Sopenharmony_ci return [os.path.join(self.tempdir, *parts) for parts in tuples] 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ci def mktemp(self, *parts): 217db96d56Sopenharmony_ci filename = self.norm(*parts) 227db96d56Sopenharmony_ci base, file = os.path.split(filename) 237db96d56Sopenharmony_ci if not os.path.exists(base): 247db96d56Sopenharmony_ci os.makedirs(base) 257db96d56Sopenharmony_ci create_empty_file(filename) 267db96d56Sopenharmony_ci 277db96d56Sopenharmony_ci def setUp(self): 287db96d56Sopenharmony_ci self.tempdir = TESTFN + "_dir" 297db96d56Sopenharmony_ci self.mktemp('a', 'D') 307db96d56Sopenharmony_ci self.mktemp('aab', 'F') 317db96d56Sopenharmony_ci self.mktemp('.aa', 'G') 327db96d56Sopenharmony_ci self.mktemp('.bb', 'H') 337db96d56Sopenharmony_ci self.mktemp('.bb', '.J') 347db96d56Sopenharmony_ci self.mktemp('aaa', 'zzzF') 357db96d56Sopenharmony_ci self.mktemp('ZZZ') 367db96d56Sopenharmony_ci self.mktemp('EF') 377db96d56Sopenharmony_ci self.mktemp('a', 'bcd', 'EF') 387db96d56Sopenharmony_ci self.mktemp('a', 'bcd', 'efg', 'ha') 397db96d56Sopenharmony_ci if can_symlink(): 407db96d56Sopenharmony_ci os.symlink(self.norm('broken'), self.norm('sym1')) 417db96d56Sopenharmony_ci os.symlink('broken', self.norm('sym2')) 427db96d56Sopenharmony_ci os.symlink(os.path.join('a', 'bcd'), self.norm('sym3')) 437db96d56Sopenharmony_ci if {os.open, os.stat} <= os.supports_dir_fd and os.scandir in os.supports_fd: 447db96d56Sopenharmony_ci self.dir_fd = os.open(self.tempdir, os.O_RDONLY | os.O_DIRECTORY) 457db96d56Sopenharmony_ci else: 467db96d56Sopenharmony_ci self.dir_fd = None 477db96d56Sopenharmony_ci 487db96d56Sopenharmony_ci def tearDown(self): 497db96d56Sopenharmony_ci if self.dir_fd is not None: 507db96d56Sopenharmony_ci os.close(self.dir_fd) 517db96d56Sopenharmony_ci shutil.rmtree(self.tempdir) 527db96d56Sopenharmony_ci 537db96d56Sopenharmony_ci def glob(self, *parts, **kwargs): 547db96d56Sopenharmony_ci if len(parts) == 1: 557db96d56Sopenharmony_ci pattern = parts[0] 567db96d56Sopenharmony_ci else: 577db96d56Sopenharmony_ci pattern = os.path.join(*parts) 587db96d56Sopenharmony_ci p = os.path.join(self.tempdir, pattern) 597db96d56Sopenharmony_ci res = glob.glob(p, **kwargs) 607db96d56Sopenharmony_ci res2 = glob.iglob(p, **kwargs) 617db96d56Sopenharmony_ci self.assertCountEqual(glob.iglob(p, **kwargs), res) 627db96d56Sopenharmony_ci 637db96d56Sopenharmony_ci bres = [os.fsencode(x) for x in res] 647db96d56Sopenharmony_ci self.assertCountEqual(glob.glob(os.fsencode(p), **kwargs), bres) 657db96d56Sopenharmony_ci self.assertCountEqual(glob.iglob(os.fsencode(p), **kwargs), bres) 667db96d56Sopenharmony_ci 677db96d56Sopenharmony_ci with change_cwd(self.tempdir): 687db96d56Sopenharmony_ci res2 = glob.glob(pattern, **kwargs) 697db96d56Sopenharmony_ci for x in res2: 707db96d56Sopenharmony_ci self.assertFalse(os.path.isabs(x), x) 717db96d56Sopenharmony_ci if pattern == '**' or pattern == '**' + os.sep: 727db96d56Sopenharmony_ci expected = res[1:] 737db96d56Sopenharmony_ci else: 747db96d56Sopenharmony_ci expected = res 757db96d56Sopenharmony_ci self.assertCountEqual([os.path.join(self.tempdir, x) for x in res2], 767db96d56Sopenharmony_ci expected) 777db96d56Sopenharmony_ci self.assertCountEqual(glob.iglob(pattern, **kwargs), res2) 787db96d56Sopenharmony_ci bpattern = os.fsencode(pattern) 797db96d56Sopenharmony_ci bres2 = [os.fsencode(x) for x in res2] 807db96d56Sopenharmony_ci self.assertCountEqual(glob.glob(bpattern, **kwargs), bres2) 817db96d56Sopenharmony_ci self.assertCountEqual(glob.iglob(bpattern, **kwargs), bres2) 827db96d56Sopenharmony_ci 837db96d56Sopenharmony_ci self.assertCountEqual(glob.glob(pattern, root_dir=self.tempdir, **kwargs), res2) 847db96d56Sopenharmony_ci self.assertCountEqual(glob.iglob(pattern, root_dir=self.tempdir, **kwargs), res2) 857db96d56Sopenharmony_ci btempdir = os.fsencode(self.tempdir) 867db96d56Sopenharmony_ci self.assertCountEqual( 877db96d56Sopenharmony_ci glob.glob(bpattern, root_dir=btempdir, **kwargs), bres2) 887db96d56Sopenharmony_ci self.assertCountEqual( 897db96d56Sopenharmony_ci glob.iglob(bpattern, root_dir=btempdir, **kwargs), bres2) 907db96d56Sopenharmony_ci 917db96d56Sopenharmony_ci if self.dir_fd is not None: 927db96d56Sopenharmony_ci self.assertCountEqual( 937db96d56Sopenharmony_ci glob.glob(pattern, dir_fd=self.dir_fd, **kwargs), res2) 947db96d56Sopenharmony_ci self.assertCountEqual( 957db96d56Sopenharmony_ci glob.iglob(pattern, dir_fd=self.dir_fd, **kwargs), res2) 967db96d56Sopenharmony_ci self.assertCountEqual( 977db96d56Sopenharmony_ci glob.glob(bpattern, dir_fd=self.dir_fd, **kwargs), bres2) 987db96d56Sopenharmony_ci self.assertCountEqual( 997db96d56Sopenharmony_ci glob.iglob(bpattern, dir_fd=self.dir_fd, **kwargs), bres2) 1007db96d56Sopenharmony_ci 1017db96d56Sopenharmony_ci return res 1027db96d56Sopenharmony_ci 1037db96d56Sopenharmony_ci def assertSequencesEqual_noorder(self, l1, l2): 1047db96d56Sopenharmony_ci l1 = list(l1) 1057db96d56Sopenharmony_ci l2 = list(l2) 1067db96d56Sopenharmony_ci self.assertEqual(set(l1), set(l2)) 1077db96d56Sopenharmony_ci self.assertEqual(sorted(l1), sorted(l2)) 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci def test_glob_literal(self): 1107db96d56Sopenharmony_ci eq = self.assertSequencesEqual_noorder 1117db96d56Sopenharmony_ci eq(self.glob('a'), [self.norm('a')]) 1127db96d56Sopenharmony_ci eq(self.glob('a', 'D'), [self.norm('a', 'D')]) 1137db96d56Sopenharmony_ci eq(self.glob('aab'), [self.norm('aab')]) 1147db96d56Sopenharmony_ci eq(self.glob('zymurgy'), []) 1157db96d56Sopenharmony_ci 1167db96d56Sopenharmony_ci res = glob.glob('*') 1177db96d56Sopenharmony_ci self.assertEqual({type(r) for r in res}, {str}) 1187db96d56Sopenharmony_ci res = glob.glob(os.path.join(os.curdir, '*')) 1197db96d56Sopenharmony_ci self.assertEqual({type(r) for r in res}, {str}) 1207db96d56Sopenharmony_ci 1217db96d56Sopenharmony_ci res = glob.glob(b'*') 1227db96d56Sopenharmony_ci self.assertEqual({type(r) for r in res}, {bytes}) 1237db96d56Sopenharmony_ci res = glob.glob(os.path.join(os.fsencode(os.curdir), b'*')) 1247db96d56Sopenharmony_ci self.assertEqual({type(r) for r in res}, {bytes}) 1257db96d56Sopenharmony_ci 1267db96d56Sopenharmony_ci def test_glob_empty_pattern(self): 1277db96d56Sopenharmony_ci self.assertEqual(glob.glob(''), []) 1287db96d56Sopenharmony_ci self.assertEqual(glob.glob(b''), []) 1297db96d56Sopenharmony_ci self.assertEqual(glob.glob('', root_dir=self.tempdir), []) 1307db96d56Sopenharmony_ci self.assertEqual(glob.glob(b'', root_dir=os.fsencode(self.tempdir)), []) 1317db96d56Sopenharmony_ci self.assertEqual(glob.glob('', dir_fd=self.dir_fd), []) 1327db96d56Sopenharmony_ci self.assertEqual(glob.glob(b'', dir_fd=self.dir_fd), []) 1337db96d56Sopenharmony_ci 1347db96d56Sopenharmony_ci def test_glob_one_directory(self): 1357db96d56Sopenharmony_ci eq = self.assertSequencesEqual_noorder 1367db96d56Sopenharmony_ci eq(self.glob('a*'), map(self.norm, ['a', 'aab', 'aaa'])) 1377db96d56Sopenharmony_ci eq(self.glob('*a'), map(self.norm, ['a', 'aaa'])) 1387db96d56Sopenharmony_ci eq(self.glob('.*'), map(self.norm, ['.aa', '.bb'])) 1397db96d56Sopenharmony_ci eq(self.glob('?aa'), map(self.norm, ['aaa'])) 1407db96d56Sopenharmony_ci eq(self.glob('aa?'), map(self.norm, ['aaa', 'aab'])) 1417db96d56Sopenharmony_ci eq(self.glob('aa[ab]'), map(self.norm, ['aaa', 'aab'])) 1427db96d56Sopenharmony_ci eq(self.glob('*q'), []) 1437db96d56Sopenharmony_ci 1447db96d56Sopenharmony_ci def test_glob_nested_directory(self): 1457db96d56Sopenharmony_ci eq = self.assertSequencesEqual_noorder 1467db96d56Sopenharmony_ci if os.path.normcase("abCD") == "abCD": 1477db96d56Sopenharmony_ci # case-sensitive filesystem 1487db96d56Sopenharmony_ci eq(self.glob('a', 'bcd', 'E*'), [self.norm('a', 'bcd', 'EF')]) 1497db96d56Sopenharmony_ci else: 1507db96d56Sopenharmony_ci # case insensitive filesystem 1517db96d56Sopenharmony_ci eq(self.glob('a', 'bcd', 'E*'), [self.norm('a', 'bcd', 'EF'), 1527db96d56Sopenharmony_ci self.norm('a', 'bcd', 'efg')]) 1537db96d56Sopenharmony_ci eq(self.glob('a', 'bcd', '*g'), [self.norm('a', 'bcd', 'efg')]) 1547db96d56Sopenharmony_ci 1557db96d56Sopenharmony_ci def test_glob_directory_names(self): 1567db96d56Sopenharmony_ci eq = self.assertSequencesEqual_noorder 1577db96d56Sopenharmony_ci eq(self.glob('*', 'D'), [self.norm('a', 'D')]) 1587db96d56Sopenharmony_ci eq(self.glob('*', '*a'), []) 1597db96d56Sopenharmony_ci eq(self.glob('a', '*', '*', '*a'), 1607db96d56Sopenharmony_ci [self.norm('a', 'bcd', 'efg', 'ha')]) 1617db96d56Sopenharmony_ci eq(self.glob('?a?', '*F'), [self.norm('aaa', 'zzzF'), 1627db96d56Sopenharmony_ci self.norm('aab', 'F')]) 1637db96d56Sopenharmony_ci 1647db96d56Sopenharmony_ci def test_glob_directory_with_trailing_slash(self): 1657db96d56Sopenharmony_ci # Patterns ending with a slash shouldn't match non-dirs 1667db96d56Sopenharmony_ci res = glob.glob(self.norm('Z*Z') + os.sep) 1677db96d56Sopenharmony_ci self.assertEqual(res, []) 1687db96d56Sopenharmony_ci res = glob.glob(self.norm('ZZZ') + os.sep) 1697db96d56Sopenharmony_ci self.assertEqual(res, []) 1707db96d56Sopenharmony_ci # When there is a wildcard pattern which ends with os.sep, glob() 1717db96d56Sopenharmony_ci # doesn't blow up. 1727db96d56Sopenharmony_ci res = glob.glob(self.norm('aa*') + os.sep) 1737db96d56Sopenharmony_ci self.assertEqual(len(res), 2) 1747db96d56Sopenharmony_ci # either of these results is reasonable 1757db96d56Sopenharmony_ci self.assertIn(set(res), [ 1767db96d56Sopenharmony_ci {self.norm('aaa'), self.norm('aab')}, 1777db96d56Sopenharmony_ci {self.norm('aaa') + os.sep, self.norm('aab') + os.sep}, 1787db96d56Sopenharmony_ci ]) 1797db96d56Sopenharmony_ci 1807db96d56Sopenharmony_ci def test_glob_bytes_directory_with_trailing_slash(self): 1817db96d56Sopenharmony_ci # Same as test_glob_directory_with_trailing_slash, but with a 1827db96d56Sopenharmony_ci # bytes argument. 1837db96d56Sopenharmony_ci res = glob.glob(os.fsencode(self.norm('Z*Z') + os.sep)) 1847db96d56Sopenharmony_ci self.assertEqual(res, []) 1857db96d56Sopenharmony_ci res = glob.glob(os.fsencode(self.norm('ZZZ') + os.sep)) 1867db96d56Sopenharmony_ci self.assertEqual(res, []) 1877db96d56Sopenharmony_ci res = glob.glob(os.fsencode(self.norm('aa*') + os.sep)) 1887db96d56Sopenharmony_ci self.assertEqual(len(res), 2) 1897db96d56Sopenharmony_ci # either of these results is reasonable 1907db96d56Sopenharmony_ci self.assertIn(set(res), [ 1917db96d56Sopenharmony_ci {os.fsencode(self.norm('aaa')), 1927db96d56Sopenharmony_ci os.fsencode(self.norm('aab'))}, 1937db96d56Sopenharmony_ci {os.fsencode(self.norm('aaa') + os.sep), 1947db96d56Sopenharmony_ci os.fsencode(self.norm('aab') + os.sep)}, 1957db96d56Sopenharmony_ci ]) 1967db96d56Sopenharmony_ci 1977db96d56Sopenharmony_ci @skip_unless_symlink 1987db96d56Sopenharmony_ci def test_glob_symlinks(self): 1997db96d56Sopenharmony_ci eq = self.assertSequencesEqual_noorder 2007db96d56Sopenharmony_ci eq(self.glob('sym3'), [self.norm('sym3')]) 2017db96d56Sopenharmony_ci eq(self.glob('sym3', '*'), [self.norm('sym3', 'EF'), 2027db96d56Sopenharmony_ci self.norm('sym3', 'efg')]) 2037db96d56Sopenharmony_ci self.assertIn(self.glob('sym3' + os.sep), 2047db96d56Sopenharmony_ci [[self.norm('sym3')], [self.norm('sym3') + os.sep]]) 2057db96d56Sopenharmony_ci eq(self.glob('*', '*F'), 2067db96d56Sopenharmony_ci [self.norm('aaa', 'zzzF'), 2077db96d56Sopenharmony_ci self.norm('aab', 'F'), self.norm('sym3', 'EF')]) 2087db96d56Sopenharmony_ci 2097db96d56Sopenharmony_ci @skip_unless_symlink 2107db96d56Sopenharmony_ci def test_glob_broken_symlinks(self): 2117db96d56Sopenharmony_ci eq = self.assertSequencesEqual_noorder 2127db96d56Sopenharmony_ci eq(self.glob('sym*'), [self.norm('sym1'), self.norm('sym2'), 2137db96d56Sopenharmony_ci self.norm('sym3')]) 2147db96d56Sopenharmony_ci eq(self.glob('sym1'), [self.norm('sym1')]) 2157db96d56Sopenharmony_ci eq(self.glob('sym2'), [self.norm('sym2')]) 2167db96d56Sopenharmony_ci 2177db96d56Sopenharmony_ci @unittest.skipUnless(sys.platform == "win32", "Win32 specific test") 2187db96d56Sopenharmony_ci def test_glob_magic_in_drive(self): 2197db96d56Sopenharmony_ci eq = self.assertSequencesEqual_noorder 2207db96d56Sopenharmony_ci eq(glob.glob('*:'), []) 2217db96d56Sopenharmony_ci eq(glob.glob(b'*:'), []) 2227db96d56Sopenharmony_ci eq(glob.glob('?:'), []) 2237db96d56Sopenharmony_ci eq(glob.glob(b'?:'), []) 2247db96d56Sopenharmony_ci eq(glob.glob('\\\\?\\c:\\'), ['\\\\?\\c:\\']) 2257db96d56Sopenharmony_ci eq(glob.glob(b'\\\\?\\c:\\'), [b'\\\\?\\c:\\']) 2267db96d56Sopenharmony_ci eq(glob.glob('\\\\*\\*\\'), []) 2277db96d56Sopenharmony_ci eq(glob.glob(b'\\\\*\\*\\'), []) 2287db96d56Sopenharmony_ci 2297db96d56Sopenharmony_ci def check_escape(self, arg, expected): 2307db96d56Sopenharmony_ci self.assertEqual(glob.escape(arg), expected) 2317db96d56Sopenharmony_ci self.assertEqual(glob.escape(os.fsencode(arg)), os.fsencode(expected)) 2327db96d56Sopenharmony_ci 2337db96d56Sopenharmony_ci def test_escape(self): 2347db96d56Sopenharmony_ci check = self.check_escape 2357db96d56Sopenharmony_ci check('abc', 'abc') 2367db96d56Sopenharmony_ci check('[', '[[]') 2377db96d56Sopenharmony_ci check('?', '[?]') 2387db96d56Sopenharmony_ci check('*', '[*]') 2397db96d56Sopenharmony_ci check('[[_/*?*/_]]', '[[][[]_/[*][?][*]/_]]') 2407db96d56Sopenharmony_ci check('/[[_/*?*/_]]/', '/[[][[]_/[*][?][*]/_]]/') 2417db96d56Sopenharmony_ci 2427db96d56Sopenharmony_ci @unittest.skipUnless(sys.platform == "win32", "Win32 specific test") 2437db96d56Sopenharmony_ci def test_escape_windows(self): 2447db96d56Sopenharmony_ci check = self.check_escape 2457db96d56Sopenharmony_ci check('?:?', '?:[?]') 2467db96d56Sopenharmony_ci check('*:*', '*:[*]') 2477db96d56Sopenharmony_ci check(r'\\?\c:\?', r'\\?\c:\[?]') 2487db96d56Sopenharmony_ci check(r'\\*\*\*', r'\\*\*\[*]') 2497db96d56Sopenharmony_ci check('//?/c:/?', '//?/c:/[?]') 2507db96d56Sopenharmony_ci check('//*/*/*', '//*/*/[*]') 2517db96d56Sopenharmony_ci 2527db96d56Sopenharmony_ci def rglob(self, *parts, **kwargs): 2537db96d56Sopenharmony_ci return self.glob(*parts, recursive=True, **kwargs) 2547db96d56Sopenharmony_ci 2557db96d56Sopenharmony_ci def hglob(self, *parts, **kwargs): 2567db96d56Sopenharmony_ci return self.glob(*parts, include_hidden=True, **kwargs) 2577db96d56Sopenharmony_ci 2587db96d56Sopenharmony_ci def test_hidden_glob(self): 2597db96d56Sopenharmony_ci eq = self.assertSequencesEqual_noorder 2607db96d56Sopenharmony_ci l = [('aaa',), ('.aa',)] 2617db96d56Sopenharmony_ci eq(self.hglob('?aa'), self.joins(*l)) 2627db96d56Sopenharmony_ci eq(self.hglob('*aa'), self.joins(*l)) 2637db96d56Sopenharmony_ci l2 = [('.aa','G',)] 2647db96d56Sopenharmony_ci eq(self.hglob('**', 'G'), self.joins(*l2)) 2657db96d56Sopenharmony_ci 2667db96d56Sopenharmony_ci def test_recursive_glob(self): 2677db96d56Sopenharmony_ci eq = self.assertSequencesEqual_noorder 2687db96d56Sopenharmony_ci full = [('EF',), ('ZZZ',), 2697db96d56Sopenharmony_ci ('a',), ('a', 'D'), 2707db96d56Sopenharmony_ci ('a', 'bcd'), 2717db96d56Sopenharmony_ci ('a', 'bcd', 'EF'), 2727db96d56Sopenharmony_ci ('a', 'bcd', 'efg'), 2737db96d56Sopenharmony_ci ('a', 'bcd', 'efg', 'ha'), 2747db96d56Sopenharmony_ci ('aaa',), ('aaa', 'zzzF'), 2757db96d56Sopenharmony_ci ('aab',), ('aab', 'F'), 2767db96d56Sopenharmony_ci ] 2777db96d56Sopenharmony_ci if can_symlink(): 2787db96d56Sopenharmony_ci full += [('sym1',), ('sym2',), 2797db96d56Sopenharmony_ci ('sym3',), 2807db96d56Sopenharmony_ci ('sym3', 'EF'), 2817db96d56Sopenharmony_ci ('sym3', 'efg'), 2827db96d56Sopenharmony_ci ('sym3', 'efg', 'ha'), 2837db96d56Sopenharmony_ci ] 2847db96d56Sopenharmony_ci eq(self.rglob('**'), self.joins(('',), *full)) 2857db96d56Sopenharmony_ci eq(self.rglob(os.curdir, '**'), 2867db96d56Sopenharmony_ci self.joins((os.curdir, ''), *((os.curdir,) + i for i in full))) 2877db96d56Sopenharmony_ci dirs = [('a', ''), ('a', 'bcd', ''), ('a', 'bcd', 'efg', ''), 2887db96d56Sopenharmony_ci ('aaa', ''), ('aab', '')] 2897db96d56Sopenharmony_ci if can_symlink(): 2907db96d56Sopenharmony_ci dirs += [('sym3', ''), ('sym3', 'efg', '')] 2917db96d56Sopenharmony_ci eq(self.rglob('**', ''), self.joins(('',), *dirs)) 2927db96d56Sopenharmony_ci 2937db96d56Sopenharmony_ci eq(self.rglob('a', '**'), self.joins( 2947db96d56Sopenharmony_ci ('a', ''), ('a', 'D'), ('a', 'bcd'), ('a', 'bcd', 'EF'), 2957db96d56Sopenharmony_ci ('a', 'bcd', 'efg'), ('a', 'bcd', 'efg', 'ha'))) 2967db96d56Sopenharmony_ci eq(self.rglob('a**'), self.joins(('a',), ('aaa',), ('aab',))) 2977db96d56Sopenharmony_ci expect = [('a', 'bcd', 'EF'), ('EF',)] 2987db96d56Sopenharmony_ci if can_symlink(): 2997db96d56Sopenharmony_ci expect += [('sym3', 'EF')] 3007db96d56Sopenharmony_ci eq(self.rglob('**', 'EF'), self.joins(*expect)) 3017db96d56Sopenharmony_ci expect = [('a', 'bcd', 'EF'), ('aaa', 'zzzF'), ('aab', 'F'), ('EF',)] 3027db96d56Sopenharmony_ci if can_symlink(): 3037db96d56Sopenharmony_ci expect += [('sym3', 'EF')] 3047db96d56Sopenharmony_ci eq(self.rglob('**', '*F'), self.joins(*expect)) 3057db96d56Sopenharmony_ci eq(self.rglob('**', '*F', ''), []) 3067db96d56Sopenharmony_ci eq(self.rglob('**', 'bcd', '*'), self.joins( 3077db96d56Sopenharmony_ci ('a', 'bcd', 'EF'), ('a', 'bcd', 'efg'))) 3087db96d56Sopenharmony_ci eq(self.rglob('a', '**', 'bcd'), self.joins(('a', 'bcd'))) 3097db96d56Sopenharmony_ci 3107db96d56Sopenharmony_ci with change_cwd(self.tempdir): 3117db96d56Sopenharmony_ci join = os.path.join 3127db96d56Sopenharmony_ci eq(glob.glob('**', recursive=True), [join(*i) for i in full]) 3137db96d56Sopenharmony_ci eq(glob.glob(join('**', ''), recursive=True), 3147db96d56Sopenharmony_ci [join(*i) for i in dirs]) 3157db96d56Sopenharmony_ci eq(glob.glob(join('**', '*'), recursive=True), 3167db96d56Sopenharmony_ci [join(*i) for i in full]) 3177db96d56Sopenharmony_ci eq(glob.glob(join(os.curdir, '**'), recursive=True), 3187db96d56Sopenharmony_ci [join(os.curdir, '')] + [join(os.curdir, *i) for i in full]) 3197db96d56Sopenharmony_ci eq(glob.glob(join(os.curdir, '**', ''), recursive=True), 3207db96d56Sopenharmony_ci [join(os.curdir, '')] + [join(os.curdir, *i) for i in dirs]) 3217db96d56Sopenharmony_ci eq(glob.glob(join(os.curdir, '**', '*'), recursive=True), 3227db96d56Sopenharmony_ci [join(os.curdir, *i) for i in full]) 3237db96d56Sopenharmony_ci eq(glob.glob(join('**','zz*F'), recursive=True), 3247db96d56Sopenharmony_ci [join('aaa', 'zzzF')]) 3257db96d56Sopenharmony_ci eq(glob.glob('**zz*F', recursive=True), []) 3267db96d56Sopenharmony_ci expect = [join('a', 'bcd', 'EF'), 'EF'] 3277db96d56Sopenharmony_ci if can_symlink(): 3287db96d56Sopenharmony_ci expect += [join('sym3', 'EF')] 3297db96d56Sopenharmony_ci eq(glob.glob(join('**', 'EF'), recursive=True), expect) 3307db96d56Sopenharmony_ci 3317db96d56Sopenharmony_ci rec = [('.bb','H'), ('.bb','.J'), ('.aa','G'), ('.aa',), ('.bb',)] 3327db96d56Sopenharmony_ci eq(glob.glob('**', recursive=True, include_hidden=True), 3337db96d56Sopenharmony_ci [join(*i) for i in full+rec]) 3347db96d56Sopenharmony_ci 3357db96d56Sopenharmony_ci def test_glob_many_open_files(self): 3367db96d56Sopenharmony_ci depth = 30 3377db96d56Sopenharmony_ci base = os.path.join(self.tempdir, 'deep') 3387db96d56Sopenharmony_ci p = os.path.join(base, *(['d']*depth)) 3397db96d56Sopenharmony_ci os.makedirs(p) 3407db96d56Sopenharmony_ci pattern = os.path.join(base, *(['*']*depth)) 3417db96d56Sopenharmony_ci iters = [glob.iglob(pattern, recursive=True) for j in range(100)] 3427db96d56Sopenharmony_ci for it in iters: 3437db96d56Sopenharmony_ci self.assertEqual(next(it), p) 3447db96d56Sopenharmony_ci pattern = os.path.join(base, '**', 'd') 3457db96d56Sopenharmony_ci iters = [glob.iglob(pattern, recursive=True) for j in range(100)] 3467db96d56Sopenharmony_ci p = base 3477db96d56Sopenharmony_ci for i in range(depth): 3487db96d56Sopenharmony_ci p = os.path.join(p, 'd') 3497db96d56Sopenharmony_ci for it in iters: 3507db96d56Sopenharmony_ci self.assertEqual(next(it), p) 3517db96d56Sopenharmony_ci 3527db96d56Sopenharmony_ci 3537db96d56Sopenharmony_ci@skip_unless_symlink 3547db96d56Sopenharmony_ciclass SymlinkLoopGlobTests(unittest.TestCase): 3557db96d56Sopenharmony_ci 3567db96d56Sopenharmony_ci def test_selflink(self): 3577db96d56Sopenharmony_ci tempdir = TESTFN + "_dir" 3587db96d56Sopenharmony_ci os.makedirs(tempdir) 3597db96d56Sopenharmony_ci self.addCleanup(shutil.rmtree, tempdir) 3607db96d56Sopenharmony_ci with change_cwd(tempdir): 3617db96d56Sopenharmony_ci os.makedirs('dir') 3627db96d56Sopenharmony_ci create_empty_file(os.path.join('dir', 'file')) 3637db96d56Sopenharmony_ci os.symlink(os.curdir, os.path.join('dir', 'link')) 3647db96d56Sopenharmony_ci 3657db96d56Sopenharmony_ci results = glob.glob('**', recursive=True) 3667db96d56Sopenharmony_ci self.assertEqual(len(results), len(set(results))) 3677db96d56Sopenharmony_ci results = set(results) 3687db96d56Sopenharmony_ci depth = 0 3697db96d56Sopenharmony_ci while results: 3707db96d56Sopenharmony_ci path = os.path.join(*(['dir'] + ['link'] * depth)) 3717db96d56Sopenharmony_ci self.assertIn(path, results) 3727db96d56Sopenharmony_ci results.remove(path) 3737db96d56Sopenharmony_ci if not results: 3747db96d56Sopenharmony_ci break 3757db96d56Sopenharmony_ci path = os.path.join(path, 'file') 3767db96d56Sopenharmony_ci self.assertIn(path, results) 3777db96d56Sopenharmony_ci results.remove(path) 3787db96d56Sopenharmony_ci depth += 1 3797db96d56Sopenharmony_ci 3807db96d56Sopenharmony_ci results = glob.glob(os.path.join('**', 'file'), recursive=True) 3817db96d56Sopenharmony_ci self.assertEqual(len(results), len(set(results))) 3827db96d56Sopenharmony_ci results = set(results) 3837db96d56Sopenharmony_ci depth = 0 3847db96d56Sopenharmony_ci while results: 3857db96d56Sopenharmony_ci path = os.path.join(*(['dir'] + ['link'] * depth + ['file'])) 3867db96d56Sopenharmony_ci self.assertIn(path, results) 3877db96d56Sopenharmony_ci results.remove(path) 3887db96d56Sopenharmony_ci depth += 1 3897db96d56Sopenharmony_ci 3907db96d56Sopenharmony_ci results = glob.glob(os.path.join('**', ''), recursive=True) 3917db96d56Sopenharmony_ci self.assertEqual(len(results), len(set(results))) 3927db96d56Sopenharmony_ci results = set(results) 3937db96d56Sopenharmony_ci depth = 0 3947db96d56Sopenharmony_ci while results: 3957db96d56Sopenharmony_ci path = os.path.join(*(['dir'] + ['link'] * depth + [''])) 3967db96d56Sopenharmony_ci self.assertIn(path, results) 3977db96d56Sopenharmony_ci results.remove(path) 3987db96d56Sopenharmony_ci depth += 1 3997db96d56Sopenharmony_ci 4007db96d56Sopenharmony_ci 4017db96d56Sopenharmony_ciif __name__ == "__main__": 4027db96d56Sopenharmony_ci unittest.main() 403