blob: 1cdc24acf2d61031fb43b7f03edc10e1a6a0203f [file] [log] [blame]
Fred Drake99e87f92001-07-23 16:08:36 +00001import glob
2import os
Johannes Gijsbersa3beee12005-01-08 13:28:54 +00003import shutil
Antoine Pitrou3d068b22012-12-16 13:49:37 +01004import sys
Hynek Schlawacke26568f2012-12-27 10:10:11 +01005import unittest
6
7from test.support import run_unittest, TESTFN, skip_unless_symlink, can_symlink
Fred Drake99e87f92001-07-23 16:08:36 +00008
Hynek Schlawackdec59ec2012-12-16 12:39:11 +01009
Fred Drake99e87f92001-07-23 16:08:36 +000010class GlobTests(unittest.TestCase):
11
12 def norm(self, *parts):
13 return os.path.normpath(os.path.join(self.tempdir, *parts))
14
15 def mktemp(self, *parts):
Johannes Gijsbersa3beee12005-01-08 13:28:54 +000016 filename = self.norm(*parts)
17 base, file = os.path.split(filename)
18 if not os.path.exists(base):
19 os.makedirs(base)
20 f = open(filename, 'w')
21 f.close()
Fred Drake99e87f92001-07-23 16:08:36 +000022
23 def setUp(self):
Hynek Schlawackdec59ec2012-12-16 12:39:11 +010024 self.tempdir = TESTFN + "_dir"
Fred Drake99e87f92001-07-23 16:08:36 +000025 self.mktemp('a', 'D')
26 self.mktemp('aab', 'F')
Hynek Schlawackdec59ec2012-12-16 12:39:11 +010027 self.mktemp('.aa', 'G')
28 self.mktemp('.bb', 'H')
Fred Drake99e87f92001-07-23 16:08:36 +000029 self.mktemp('aaa', 'zzzF')
30 self.mktemp('ZZZ')
31 self.mktemp('a', 'bcd', 'EF')
32 self.mktemp('a', 'bcd', 'efg', 'ha')
Brian Curtin3b4499c2010-12-28 14:31:47 +000033 if can_symlink():
Johannes Gijsbersae882f72004-08-30 10:19:56 +000034 os.symlink(self.norm('broken'), self.norm('sym1'))
Hynek Schlawacke26568f2012-12-27 10:10:11 +010035 os.symlink('broken', self.norm('sym2'))
36 os.symlink(os.path.join('a', 'bcd'), self.norm('sym3'))
Fred Drake99e87f92001-07-23 16:08:36 +000037
38 def tearDown(self):
Johannes Gijsbersa3beee12005-01-08 13:28:54 +000039 shutil.rmtree(self.tempdir)
Fred Drake99e87f92001-07-23 16:08:36 +000040
41 def glob(self, *parts):
42 if len(parts) == 1:
43 pattern = parts[0]
44 else:
45 pattern = os.path.join(*parts)
46 p = os.path.join(self.tempdir, pattern)
Johannes Gijsbers836f5432005-01-08 13:13:19 +000047 res = glob.glob(p)
48 self.assertEqual(list(glob.iglob(p)), res)
Hynek Schlawacke26568f2012-12-27 10:10:11 +010049 bres = [os.fsencode(x) for x in res]
50 self.assertEqual(glob.glob(os.fsencode(p)), bres)
51 self.assertEqual(list(glob.iglob(os.fsencode(p))), bres)
Johannes Gijsbers836f5432005-01-08 13:13:19 +000052 return res
Fred Drake99e87f92001-07-23 16:08:36 +000053
54 def assertSequencesEqual_noorder(self, l1, l2):
Hynek Schlawacke26568f2012-12-27 10:10:11 +010055 l1 = list(l1)
56 l2 = list(l2)
Raymond Hettingera690a992003-11-16 16:17:49 +000057 self.assertEqual(set(l1), set(l2))
Hynek Schlawacke26568f2012-12-27 10:10:11 +010058 self.assertEqual(sorted(l1), sorted(l2))
Fred Drake99e87f92001-07-23 16:08:36 +000059
60 def test_glob_literal(self):
61 eq = self.assertSequencesEqual_noorder
Fred Drake99e87f92001-07-23 16:08:36 +000062 eq(self.glob('a'), [self.norm('a')])
63 eq(self.glob('a', 'D'), [self.norm('a', 'D')])
64 eq(self.glob('aab'), [self.norm('aab')])
65 eq(self.glob('zymurgy'), [])
66
Hynek Schlawacke26568f2012-12-27 10:10:11 +010067 res = glob.glob('*')
68 self.assertEqual({type(r) for r in res}, {str})
69 res = glob.glob(os.path.join(os.curdir, '*'))
70 self.assertEqual({type(r) for r in res}, {str})
71
72 res = glob.glob(b'*')
73 self.assertEqual({type(r) for r in res}, {bytes})
74 res = glob.glob(os.path.join(os.fsencode(os.curdir), b'*'))
75 self.assertEqual({type(r) for r in res}, {bytes})
Guido van Rossumd8faa362007-04-27 19:54:29 +000076
Fred Drake99e87f92001-07-23 16:08:36 +000077 def test_glob_one_directory(self):
78 eq = self.assertSequencesEqual_noorder
Fred Drake99e87f92001-07-23 16:08:36 +000079 eq(self.glob('a*'), map(self.norm, ['a', 'aab', 'aaa']))
80 eq(self.glob('*a'), map(self.norm, ['a', 'aaa']))
Hynek Schlawackdec59ec2012-12-16 12:39:11 +010081 eq(self.glob('.*'), map(self.norm, ['.aa', '.bb']))
82 eq(self.glob('?aa'), map(self.norm, ['aaa']))
Fred Drake99e87f92001-07-23 16:08:36 +000083 eq(self.glob('aa?'), map(self.norm, ['aaa', 'aab']))
84 eq(self.glob('aa[ab]'), map(self.norm, ['aaa', 'aab']))
85 eq(self.glob('*q'), [])
86
87 def test_glob_nested_directory(self):
88 eq = self.assertSequencesEqual_noorder
Fred Drake99e87f92001-07-23 16:08:36 +000089 if os.path.normcase("abCD") == "abCD":
90 # case-sensitive filesystem
91 eq(self.glob('a', 'bcd', 'E*'), [self.norm('a', 'bcd', 'EF')])
92 else:
93 # case insensitive filesystem
94 eq(self.glob('a', 'bcd', 'E*'), [self.norm('a', 'bcd', 'EF'),
95 self.norm('a', 'bcd', 'efg')])
96 eq(self.glob('a', 'bcd', '*g'), [self.norm('a', 'bcd', 'efg')])
97
98 def test_glob_directory_names(self):
99 eq = self.assertSequencesEqual_noorder
Fred Drake99e87f92001-07-23 16:08:36 +0000100 eq(self.glob('*', 'D'), [self.norm('a', 'D')])
101 eq(self.glob('*', '*a'), [])
102 eq(self.glob('a', '*', '*', '*a'),
103 [self.norm('a', 'bcd', 'efg', 'ha')])
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100104 eq(self.glob('?a?', '*F'), [self.norm('aaa', 'zzzF'),
105 self.norm('aab', 'F')])
Fred Drake99e87f92001-07-23 16:08:36 +0000106
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000107 def test_glob_directory_with_trailing_slash(self):
Antoine Pitrou54615582012-12-16 16:03:01 +0100108 # Patterns ending with a slash shouldn't match non-dirs
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100109 res = glob.glob(self.norm('Z*Z') + os.sep)
Antoine Pitrou54615582012-12-16 16:03:01 +0100110 self.assertEqual(res, [])
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100111 res = glob.glob(self.norm('ZZZ') + os.sep)
Antoine Pitrou54615582012-12-16 16:03:01 +0100112 self.assertEqual(res, [])
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100113 # When there is a wildcard pattern which ends with os.sep, glob()
Antoine Pitrou54615582012-12-16 16:03:01 +0100114 # doesn't blow up.
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100115 res = glob.glob(self.norm('aa*') + os.sep)
Antoine Pitrou54615582012-12-16 16:03:01 +0100116 self.assertEqual(len(res), 2)
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100117 # either of these results is reasonable
Antoine Pitrou54615582012-12-16 16:03:01 +0100118 self.assertIn(set(res), [
119 {self.norm('aaa'), self.norm('aab')},
120 {self.norm('aaa') + os.sep, self.norm('aab') + os.sep},
121 ])
122
123 def test_glob_bytes_directory_with_trailing_slash(self):
124 # Same as test_glob_directory_with_trailing_slash, but with a
125 # bytes argument.
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100126 res = glob.glob(os.fsencode(self.norm('Z*Z') + os.sep))
Antoine Pitrou54615582012-12-16 16:03:01 +0100127 self.assertEqual(res, [])
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100128 res = glob.glob(os.fsencode(self.norm('ZZZ') + os.sep))
Antoine Pitrou54615582012-12-16 16:03:01 +0100129 self.assertEqual(res, [])
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100130 res = glob.glob(os.fsencode(self.norm('aa*') + os.sep))
Antoine Pitrou54615582012-12-16 16:03:01 +0100131 self.assertEqual(len(res), 2)
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100132 # either of these results is reasonable
133 self.assertIn(set(res), [
134 {os.fsencode(self.norm('aaa')),
135 os.fsencode(self.norm('aab'))},
136 {os.fsencode(self.norm('aaa') + os.sep),
137 os.fsencode(self.norm('aab') + os.sep)},
Antoine Pitrou54615582012-12-16 16:03:01 +0100138 ])
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000139
Brian Curtin3b4499c2010-12-28 14:31:47 +0000140 @skip_unless_symlink
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100141 def test_glob_symlinks(self):
142 eq = self.assertSequencesEqual_noorder
143 eq(self.glob('sym3'), [self.norm('sym3')])
144 eq(self.glob('sym3', '*'), [self.norm('sym3', 'EF'),
145 self.norm('sym3', 'efg')])
146 self.assertIn(self.glob('sym3' + os.sep),
147 [[self.norm('sym3')], [self.norm('sym3') + os.sep]])
148 eq(self.glob('*', '*F'),
149 [self.norm('aaa', 'zzzF'),
150 self.norm('aab', 'F'), self.norm('sym3', 'EF')])
151
152 @skip_unless_symlink
Johannes Gijsbersae882f72004-08-30 10:19:56 +0000153 def test_glob_broken_symlinks(self):
Brian Curtind40e6f72010-07-08 21:39:08 +0000154 eq = self.assertSequencesEqual_noorder
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100155 eq(self.glob('sym*'), [self.norm('sym1'), self.norm('sym2'),
156 self.norm('sym3')])
Brian Curtind40e6f72010-07-08 21:39:08 +0000157 eq(self.glob('sym1'), [self.norm('sym1')])
158 eq(self.glob('sym2'), [self.norm('sym2')])
Johannes Gijsbersae882f72004-08-30 10:19:56 +0000159
Antoine Pitrou3d068b22012-12-16 13:49:37 +0100160 @unittest.skipUnless(sys.platform == "win32", "Win32 specific test")
161 def test_glob_magic_in_drive(self):
162 eq = self.assertSequencesEqual_noorder
163 eq(glob.glob('*:'), [])
164 eq(glob.glob(b'*:'), [])
165 eq(glob.glob('?:'), [])
166 eq(glob.glob(b'?:'), [])
167 eq(glob.glob('\\\\?\\c:\\'), ['\\\\?\\c:\\'])
168 eq(glob.glob(b'\\\\?\\c:\\'), [b'\\\\?\\c:\\'])
169 eq(glob.glob('\\\\*\\*\\'), [])
170 eq(glob.glob(b'\\\\*\\*\\'), [])
171
Fred Drake2e2be372001-09-20 21:33:42 +0000172
173def test_main():
174 run_unittest(GlobTests)
175
176
177if __name__ == "__main__":
178 test_main()