10a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport glob
20a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport os
30a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport shutil
40a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport sys
50a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport unittest
60a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
70a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom test.test_support import run_unittest, TESTFN
80a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
90a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
100a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef fsdecode(s):
110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    return unicode(s, sys.getfilesystemencoding())
120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
140a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass GlobTests(unittest.TestCase):
150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def norm(self, *parts):
170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        return os.path.normpath(os.path.join(self.tempdir, *parts))
180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def mktemp(self, *parts):
200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        filename = self.norm(*parts)
210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        base, file = os.path.split(filename)
220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if not os.path.exists(base):
230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            os.makedirs(base)
240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        f = open(filename, 'w')
250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        f.close()
260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def setUp(self):
280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.tempdir = TESTFN + "_dir"
290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.mktemp('a', 'D')
300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.mktemp('aab', 'F')
310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.mktemp('.aa', 'G')
320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.mktemp('.bb', 'H')
330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.mktemp('aaa', 'zzzF')
340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.mktemp('ZZZ')
350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.mktemp('a', 'bcd', 'EF')
360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.mktemp('a', 'bcd', 'efg', 'ha')
370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if hasattr(os, 'symlink'):
380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            os.symlink(self.norm('broken'), self.norm('sym1'))
390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            os.symlink('broken', self.norm('sym2'))
400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            os.symlink(os.path.join('a', 'bcd'), self.norm('sym3'))
410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def tearDown(self):
430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        shutil.rmtree(self.tempdir)
440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def glob(self, *parts):
460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if len(parts) == 1:
470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            pattern = parts[0]
480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        else:
490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            pattern = os.path.join(*parts)
500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        p = os.path.join(self.tempdir, pattern)
510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        res = glob.glob(p)
520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(list(glob.iglob(p)), res)
530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        ures = [fsdecode(x) for x in res]
540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(glob.glob(fsdecode(p)), ures)
550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(list(glob.iglob(fsdecode(p))), ures)
560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        return res
570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def assertSequencesEqual_noorder(self, l1, l2):
590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        l1 = list(l1)
600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        l2 = list(l2)
610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(set(l1), set(l2))
620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(sorted(l1), sorted(l2))
630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_glob_literal(self):
650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq = self.assertSequencesEqual_noorder
660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(self.glob('a'), [self.norm('a')])
670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(self.glob('a', 'D'), [self.norm('a', 'D')])
680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(self.glob('aab'), [self.norm('aab')])
690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(self.glob('zymurgy'), [])
700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        res = glob.glob('*')
720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual({type(r) for r in res}, {str})
730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        res = glob.glob(os.path.join(os.curdir, '*'))
740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual({type(r) for r in res}, {str})
750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # test return types are unicode, but only if os.listdir
770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # returns unicode filenames
780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        tmp = os.listdir(fsdecode(os.curdir))
790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if {type(x) for x in tmp} == {unicode}:
800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            res = glob.glob(u'*')
810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertEqual({type(r) for r in res}, {unicode})
820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            res = glob.glob(os.path.join(fsdecode(os.curdir), u'*'))
830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertEqual({type(r) for r in res}, {unicode})
840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_glob_one_directory(self):
860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq = self.assertSequencesEqual_noorder
870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(self.glob('a*'), map(self.norm, ['a', 'aab', 'aaa']))
880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(self.glob('*a'), map(self.norm, ['a', 'aaa']))
890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(self.glob('.*'), map(self.norm, ['.aa', '.bb']))
900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(self.glob('?aa'), map(self.norm, ['aaa']))
910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(self.glob('aa?'), map(self.norm, ['aaa', 'aab']))
920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(self.glob('aa[ab]'), map(self.norm, ['aaa', 'aab']))
930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(self.glob('*q'), [])
940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_glob_nested_directory(self):
960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq = self.assertSequencesEqual_noorder
970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if os.path.normcase("abCD") == "abCD":
980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            # case-sensitive filesystem
990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            eq(self.glob('a', 'bcd', 'E*'), [self.norm('a', 'bcd', 'EF')])
1000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        else:
1010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            # case insensitive filesystem
1020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            eq(self.glob('a', 'bcd', 'E*'), [self.norm('a', 'bcd', 'EF'),
1030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                                             self.norm('a', 'bcd', 'efg')])
1040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(self.glob('a', 'bcd', '*g'), [self.norm('a', 'bcd', 'efg')])
1050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_glob_directory_names(self):
1070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq = self.assertSequencesEqual_noorder
1080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(self.glob('*', 'D'), [self.norm('a', 'D')])
1090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(self.glob('*', '*a'), [])
1100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(self.glob('a', '*', '*', '*a'),
1110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao           [self.norm('a', 'bcd', 'efg', 'ha')])
1120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(self.glob('?a?', '*F'), [self.norm('aaa', 'zzzF'),
1130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                                    self.norm('aab', 'F')])
1140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_glob_directory_with_trailing_slash(self):
1160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # Patterns ending with a slash shouldn't match non-dirs
1170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        res = glob.glob(self.norm('Z*Z') + os.sep)
1180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(res, [])
1190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        res = glob.glob(self.norm('ZZZ') + os.sep)
1200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(res, [])
1210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # When there is a wildcard pattern which ends with os.sep, glob()
1220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # doesn't blow up.
1230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        res = glob.glob(self.norm('aa*') + os.sep)
1240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(len(res), 2)
1250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # either of these results is reasonable
1260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertIn(set(res), [
1270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                      {self.norm('aaa'), self.norm('aab')},
1280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                      {self.norm('aaa') + os.sep, self.norm('aab') + os.sep},
1290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                      ])
1300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_glob_unicode_directory_with_trailing_slash(self):
1320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # Same as test_glob_directory_with_trailing_slash, but with an
1330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # unicode argument.
1340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        res = glob.glob(fsdecode(self.norm('Z*Z') + os.sep))
1350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(res, [])
1360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        res = glob.glob(fsdecode(self.norm('ZZZ') + os.sep))
1370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(res, [])
1380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        res = glob.glob(fsdecode(self.norm('aa*') + os.sep))
1390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(len(res), 2)
1400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # either of these results is reasonable
1410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertIn(set(res), [
1420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                      {fsdecode(self.norm('aaa')), fsdecode(self.norm('aab'))},
1430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                      {fsdecode(self.norm('aaa') + os.sep),
1440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                       fsdecode(self.norm('aab') + os.sep)},
1450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                      ])
1460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    @unittest.skipUnless(hasattr(os, 'symlink'), "Requires symlink support")
1480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_glob_symlinks(self):
1490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq = self.assertSequencesEqual_noorder
1500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(self.glob('sym3'), [self.norm('sym3')])
1510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(self.glob('sym3', '*'), [self.norm('sym3', 'EF'),
1520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                                    self.norm('sym3', 'efg')])
1530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertIn(self.glob('sym3' + os.sep),
1540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                      [[self.norm('sym3')], [self.norm('sym3') + os.sep]])
1550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(self.glob('*', '*F'),
1560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao           [self.norm('aaa', 'zzzF'), self.norm('aab', 'F'),
1570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.norm('sym3', 'EF')])
1580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    @unittest.skipUnless(hasattr(os, 'symlink'), "Requires symlink support")
1600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_glob_broken_symlinks(self):
1610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq = self.assertSequencesEqual_noorder
1620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(self.glob('sym*'), [self.norm('sym1'), self.norm('sym2'),
1630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                               self.norm('sym3')])
1640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(self.glob('sym1'), [self.norm('sym1')])
1650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(self.glob('sym2'), [self.norm('sym2')])
1660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    @unittest.skipUnless(sys.platform == "win32", "Win32 specific test")
1680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_glob_magic_in_drive(self):
1690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq = self.assertSequencesEqual_noorder
1700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(glob.glob('*:'), [])
1710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(glob.glob(u'*:'), [])
1720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(glob.glob('?:'), [])
1730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        eq(glob.glob(u'?:'), [])
1740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1760a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef test_main():
1770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    run_unittest(GlobTests)
1780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1800a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoif __name__ == "__main__":
1810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    test_main()
182