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