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