blob: a5ab8d6c3e94623c1156e87867c114be2a9772eb [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
Hynek Schlawack6f520272012-12-27 10:15:53 +01007from test.support import (run_unittest, TESTFN, skip_unless_symlink,
8 can_symlink, create_empty_file)
Fred Drake99e87f92001-07-23 16:08:36 +00009
Hynek Schlawackdec59ec2012-12-16 12:39:11 +010010
Fred Drake99e87f92001-07-23 16:08:36 +000011class GlobTests(unittest.TestCase):
12
13 def norm(self, *parts):
14 return os.path.normpath(os.path.join(self.tempdir, *parts))
15
16 def mktemp(self, *parts):
Johannes Gijsbersa3beee12005-01-08 13:28:54 +000017 filename = self.norm(*parts)
18 base, file = os.path.split(filename)
19 if not os.path.exists(base):
20 os.makedirs(base)
Victor Stinnerbf816222011-06-30 23:25:47 +020021 create_empty_file(filename)
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
Serhiy Storchakafd32fff2013-11-18 13:06:43 +0200172 def check_escape(self, arg, expected):
173 self.assertEqual(glob.escape(arg), expected)
174 self.assertEqual(glob.escape(os.fsencode(arg)), os.fsencode(expected))
175
176 def test_escape(self):
177 check = self.check_escape
178 check('abc', 'abc')
179 check('[', '[[]')
180 check('?', '[?]')
181 check('*', '[*]')
182 check('[[_/*?*/_]]', '[[][[]_/[*][?][*]/_]]')
183 check('/[[_/*?*/_]]/', '/[[][[]_/[*][?][*]/_]]/')
184
185 @unittest.skipUnless(sys.platform == "win32", "Win32 specific test")
186 def test_escape_windows(self):
187 check = self.check_escape
188 check('?:?', '?:[?]')
189 check('*:*', '*:[*]')
190 check(r'\\?\c:\?', r'\\?\c:\[?]')
191 check(r'\\*\*\*', r'\\*\*\[*]')
192 check('//?/c:/?', '//?/c:/[?]')
193 check('//*/*/*', '//*/*/[*]')
Fred Drake2e2be372001-09-20 21:33:42 +0000194
195def test_main():
196 run_unittest(GlobTests)
197
198
199if __name__ == "__main__":
200 test_main()