blob: f8158523a046950dd5e03e6dc58d4a2b6761dbf6 [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
Serhiy Storchakac2edcdd2014-09-11 12:17:37 +03007from test.support import (TESTFN, skip_unless_symlink,
Serhiy Storchakaa1b16ba2014-09-11 14:33:02 +03008 can_symlink, create_empty_file, change_cwd)
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):
Serhiy Storchaka8a64cea2020-06-18 22:08:27 +030012 dir_fd = None
Fred Drake99e87f92001-07-23 16:08:36 +000013
14 def norm(self, *parts):
15 return os.path.normpath(os.path.join(self.tempdir, *parts))
16
Serhiy Storchakac2edcdd2014-09-11 12:17:37 +030017 def joins(self, *tuples):
18 return [os.path.join(self.tempdir, *parts) for parts in tuples]
19
Fred Drake99e87f92001-07-23 16:08:36 +000020 def mktemp(self, *parts):
Johannes Gijsbersa3beee12005-01-08 13:28:54 +000021 filename = self.norm(*parts)
22 base, file = os.path.split(filename)
23 if not os.path.exists(base):
24 os.makedirs(base)
Victor Stinnerbf816222011-06-30 23:25:47 +020025 create_empty_file(filename)
Fred Drake99e87f92001-07-23 16:08:36 +000026
27 def setUp(self):
Hynek Schlawackdec59ec2012-12-16 12:39:11 +010028 self.tempdir = TESTFN + "_dir"
Fred Drake99e87f92001-07-23 16:08:36 +000029 self.mktemp('a', 'D')
30 self.mktemp('aab', 'F')
Hynek Schlawackdec59ec2012-12-16 12:39:11 +010031 self.mktemp('.aa', 'G')
32 self.mktemp('.bb', 'H')
Fred Drake99e87f92001-07-23 16:08:36 +000033 self.mktemp('aaa', 'zzzF')
34 self.mktemp('ZZZ')
Serhiy Storchaka735b7902015-11-09 23:12:07 +020035 self.mktemp('EF')
Fred Drake99e87f92001-07-23 16:08:36 +000036 self.mktemp('a', 'bcd', 'EF')
37 self.mktemp('a', 'bcd', 'efg', 'ha')
Brian Curtin3b4499c2010-12-28 14:31:47 +000038 if can_symlink():
Johannes Gijsbersae882f72004-08-30 10:19:56 +000039 os.symlink(self.norm('broken'), self.norm('sym1'))
Hynek Schlawacke26568f2012-12-27 10:10:11 +010040 os.symlink('broken', self.norm('sym2'))
41 os.symlink(os.path.join('a', 'bcd'), self.norm('sym3'))
Serhiy Storchaka8a64cea2020-06-18 22:08:27 +030042 if {os.open, os.stat} <= os.supports_dir_fd and os.scandir in os.supports_fd:
43 self.dir_fd = os.open(self.tempdir, os.O_RDONLY | os.O_DIRECTORY)
44 else:
45 self.dir_fd = None
Fred Drake99e87f92001-07-23 16:08:36 +000046
47 def tearDown(self):
Serhiy Storchaka8a64cea2020-06-18 22:08:27 +030048 if self.dir_fd is not None:
49 os.close(self.dir_fd)
Johannes Gijsbersa3beee12005-01-08 13:28:54 +000050 shutil.rmtree(self.tempdir)
Fred Drake99e87f92001-07-23 16:08:36 +000051
Serhiy Storchakac2edcdd2014-09-11 12:17:37 +030052 def glob(self, *parts, **kwargs):
Fred Drake99e87f92001-07-23 16:08:36 +000053 if len(parts) == 1:
54 pattern = parts[0]
55 else:
56 pattern = os.path.join(*parts)
57 p = os.path.join(self.tempdir, pattern)
Serhiy Storchakac2edcdd2014-09-11 12:17:37 +030058 res = glob.glob(p, **kwargs)
Gregory P. Smith39414992018-01-17 14:57:57 -080059 self.assertCountEqual(glob.iglob(p, **kwargs), res)
Hynek Schlawacke26568f2012-12-27 10:10:11 +010060 bres = [os.fsencode(x) for x in res]
Gregory P. Smith39414992018-01-17 14:57:57 -080061 self.assertCountEqual(glob.glob(os.fsencode(p), **kwargs), bres)
62 self.assertCountEqual(glob.iglob(os.fsencode(p), **kwargs), bres)
Serhiy Storchaka8a64cea2020-06-18 22:08:27 +030063
64 with change_cwd(self.tempdir):
65 res2 = glob.glob(pattern, **kwargs)
66 for x in res2:
67 self.assertFalse(os.path.isabs(x), x)
68 if pattern == '**' or pattern == '**' + os.sep:
69 expected = res[1:]
70 else:
71 expected = res
72 self.assertCountEqual([os.path.join(self.tempdir, x) for x in res2],
73 expected)
74 self.assertCountEqual(glob.iglob(pattern, **kwargs), res2)
75 bpattern = os.fsencode(pattern)
76 bres2 = [os.fsencode(x) for x in res2]
77 self.assertCountEqual(glob.glob(bpattern, **kwargs), bres2)
78 self.assertCountEqual(glob.iglob(bpattern, **kwargs), bres2)
79
80 self.assertCountEqual(glob.glob(pattern, root_dir=self.tempdir, **kwargs), res2)
81 self.assertCountEqual(glob.iglob(pattern, root_dir=self.tempdir, **kwargs), res2)
82 btempdir = os.fsencode(self.tempdir)
83 self.assertCountEqual(
84 glob.glob(bpattern, root_dir=btempdir, **kwargs), bres2)
85 self.assertCountEqual(
86 glob.iglob(bpattern, root_dir=btempdir, **kwargs), bres2)
87
88 if self.dir_fd is not None:
89 self.assertCountEqual(
90 glob.glob(pattern, dir_fd=self.dir_fd, **kwargs), res2)
91 self.assertCountEqual(
92 glob.iglob(pattern, dir_fd=self.dir_fd, **kwargs), res2)
93 self.assertCountEqual(
94 glob.glob(bpattern, dir_fd=self.dir_fd, **kwargs), bres2)
95 self.assertCountEqual(
96 glob.iglob(bpattern, dir_fd=self.dir_fd, **kwargs), bres2)
97
Johannes Gijsbers836f5432005-01-08 13:13:19 +000098 return res
Fred Drake99e87f92001-07-23 16:08:36 +000099
100 def assertSequencesEqual_noorder(self, l1, l2):
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100101 l1 = list(l1)
102 l2 = list(l2)
Raymond Hettingera690a992003-11-16 16:17:49 +0000103 self.assertEqual(set(l1), set(l2))
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100104 self.assertEqual(sorted(l1), sorted(l2))
Fred Drake99e87f92001-07-23 16:08:36 +0000105
106 def test_glob_literal(self):
107 eq = self.assertSequencesEqual_noorder
Fred Drake99e87f92001-07-23 16:08:36 +0000108 eq(self.glob('a'), [self.norm('a')])
109 eq(self.glob('a', 'D'), [self.norm('a', 'D')])
110 eq(self.glob('aab'), [self.norm('aab')])
111 eq(self.glob('zymurgy'), [])
112
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100113 res = glob.glob('*')
114 self.assertEqual({type(r) for r in res}, {str})
115 res = glob.glob(os.path.join(os.curdir, '*'))
116 self.assertEqual({type(r) for r in res}, {str})
117
118 res = glob.glob(b'*')
119 self.assertEqual({type(r) for r in res}, {bytes})
120 res = glob.glob(os.path.join(os.fsencode(os.curdir), b'*'))
121 self.assertEqual({type(r) for r in res}, {bytes})
Guido van Rossumd8faa362007-04-27 19:54:29 +0000122
Serhiy Storchaka8a64cea2020-06-18 22:08:27 +0300123 def test_glob_empty_pattern(self):
124 self.assertEqual(glob.glob(''), [])
125 self.assertEqual(glob.glob(b''), [])
126 self.assertEqual(glob.glob('', root_dir=self.tempdir), [])
127 self.assertEqual(glob.glob(b'', root_dir=os.fsencode(self.tempdir)), [])
128 self.assertEqual(glob.glob('', dir_fd=self.dir_fd), [])
129 self.assertEqual(glob.glob(b'', dir_fd=self.dir_fd), [])
130
Fred Drake99e87f92001-07-23 16:08:36 +0000131 def test_glob_one_directory(self):
132 eq = self.assertSequencesEqual_noorder
Fred Drake99e87f92001-07-23 16:08:36 +0000133 eq(self.glob('a*'), map(self.norm, ['a', 'aab', 'aaa']))
134 eq(self.glob('*a'), map(self.norm, ['a', 'aaa']))
Hynek Schlawackdec59ec2012-12-16 12:39:11 +0100135 eq(self.glob('.*'), map(self.norm, ['.aa', '.bb']))
136 eq(self.glob('?aa'), map(self.norm, ['aaa']))
Fred Drake99e87f92001-07-23 16:08:36 +0000137 eq(self.glob('aa?'), map(self.norm, ['aaa', 'aab']))
138 eq(self.glob('aa[ab]'), map(self.norm, ['aaa', 'aab']))
139 eq(self.glob('*q'), [])
140
141 def test_glob_nested_directory(self):
142 eq = self.assertSequencesEqual_noorder
Fred Drake99e87f92001-07-23 16:08:36 +0000143 if os.path.normcase("abCD") == "abCD":
144 # case-sensitive filesystem
145 eq(self.glob('a', 'bcd', 'E*'), [self.norm('a', 'bcd', 'EF')])
146 else:
147 # case insensitive filesystem
148 eq(self.glob('a', 'bcd', 'E*'), [self.norm('a', 'bcd', 'EF'),
149 self.norm('a', 'bcd', 'efg')])
150 eq(self.glob('a', 'bcd', '*g'), [self.norm('a', 'bcd', 'efg')])
151
152 def test_glob_directory_names(self):
153 eq = self.assertSequencesEqual_noorder
Fred Drake99e87f92001-07-23 16:08:36 +0000154 eq(self.glob('*', 'D'), [self.norm('a', 'D')])
155 eq(self.glob('*', '*a'), [])
156 eq(self.glob('a', '*', '*', '*a'),
157 [self.norm('a', 'bcd', 'efg', 'ha')])
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100158 eq(self.glob('?a?', '*F'), [self.norm('aaa', 'zzzF'),
159 self.norm('aab', 'F')])
Fred Drake99e87f92001-07-23 16:08:36 +0000160
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000161 def test_glob_directory_with_trailing_slash(self):
Antoine Pitrou54615582012-12-16 16:03:01 +0100162 # Patterns ending with a slash shouldn't match non-dirs
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100163 res = glob.glob(self.norm('Z*Z') + os.sep)
Antoine Pitrou54615582012-12-16 16:03:01 +0100164 self.assertEqual(res, [])
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100165 res = glob.glob(self.norm('ZZZ') + os.sep)
Antoine Pitrou54615582012-12-16 16:03:01 +0100166 self.assertEqual(res, [])
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100167 # When there is a wildcard pattern which ends with os.sep, glob()
Antoine Pitrou54615582012-12-16 16:03:01 +0100168 # doesn't blow up.
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100169 res = glob.glob(self.norm('aa*') + os.sep)
Antoine Pitrou54615582012-12-16 16:03:01 +0100170 self.assertEqual(len(res), 2)
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100171 # either of these results is reasonable
Antoine Pitrou54615582012-12-16 16:03:01 +0100172 self.assertIn(set(res), [
173 {self.norm('aaa'), self.norm('aab')},
174 {self.norm('aaa') + os.sep, self.norm('aab') + os.sep},
175 ])
176
177 def test_glob_bytes_directory_with_trailing_slash(self):
178 # Same as test_glob_directory_with_trailing_slash, but with a
179 # bytes argument.
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100180 res = glob.glob(os.fsencode(self.norm('Z*Z') + os.sep))
Antoine Pitrou54615582012-12-16 16:03:01 +0100181 self.assertEqual(res, [])
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100182 res = glob.glob(os.fsencode(self.norm('ZZZ') + os.sep))
Antoine Pitrou54615582012-12-16 16:03:01 +0100183 self.assertEqual(res, [])
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100184 res = glob.glob(os.fsencode(self.norm('aa*') + os.sep))
Antoine Pitrou54615582012-12-16 16:03:01 +0100185 self.assertEqual(len(res), 2)
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100186 # either of these results is reasonable
187 self.assertIn(set(res), [
188 {os.fsencode(self.norm('aaa')),
189 os.fsencode(self.norm('aab'))},
190 {os.fsencode(self.norm('aaa') + os.sep),
191 os.fsencode(self.norm('aab') + os.sep)},
Antoine Pitrou54615582012-12-16 16:03:01 +0100192 ])
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000193
Brian Curtin3b4499c2010-12-28 14:31:47 +0000194 @skip_unless_symlink
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100195 def test_glob_symlinks(self):
196 eq = self.assertSequencesEqual_noorder
197 eq(self.glob('sym3'), [self.norm('sym3')])
198 eq(self.glob('sym3', '*'), [self.norm('sym3', 'EF'),
199 self.norm('sym3', 'efg')])
200 self.assertIn(self.glob('sym3' + os.sep),
201 [[self.norm('sym3')], [self.norm('sym3') + os.sep]])
202 eq(self.glob('*', '*F'),
203 [self.norm('aaa', 'zzzF'),
204 self.norm('aab', 'F'), self.norm('sym3', 'EF')])
205
206 @skip_unless_symlink
Johannes Gijsbersae882f72004-08-30 10:19:56 +0000207 def test_glob_broken_symlinks(self):
Brian Curtind40e6f72010-07-08 21:39:08 +0000208 eq = self.assertSequencesEqual_noorder
Hynek Schlawacke26568f2012-12-27 10:10:11 +0100209 eq(self.glob('sym*'), [self.norm('sym1'), self.norm('sym2'),
210 self.norm('sym3')])
Brian Curtind40e6f72010-07-08 21:39:08 +0000211 eq(self.glob('sym1'), [self.norm('sym1')])
212 eq(self.glob('sym2'), [self.norm('sym2')])
Johannes Gijsbersae882f72004-08-30 10:19:56 +0000213
Antoine Pitrou3d068b22012-12-16 13:49:37 +0100214 @unittest.skipUnless(sys.platform == "win32", "Win32 specific test")
215 def test_glob_magic_in_drive(self):
216 eq = self.assertSequencesEqual_noorder
217 eq(glob.glob('*:'), [])
218 eq(glob.glob(b'*:'), [])
219 eq(glob.glob('?:'), [])
220 eq(glob.glob(b'?:'), [])
221 eq(glob.glob('\\\\?\\c:\\'), ['\\\\?\\c:\\'])
222 eq(glob.glob(b'\\\\?\\c:\\'), [b'\\\\?\\c:\\'])
223 eq(glob.glob('\\\\*\\*\\'), [])
224 eq(glob.glob(b'\\\\*\\*\\'), [])
225
Serhiy Storchakafd32fff2013-11-18 13:06:43 +0200226 def check_escape(self, arg, expected):
227 self.assertEqual(glob.escape(arg), expected)
228 self.assertEqual(glob.escape(os.fsencode(arg)), os.fsencode(expected))
229
230 def test_escape(self):
231 check = self.check_escape
232 check('abc', 'abc')
233 check('[', '[[]')
234 check('?', '[?]')
235 check('*', '[*]')
236 check('[[_/*?*/_]]', '[[][[]_/[*][?][*]/_]]')
237 check('/[[_/*?*/_]]/', '/[[][[]_/[*][?][*]/_]]/')
238
239 @unittest.skipUnless(sys.platform == "win32", "Win32 specific test")
240 def test_escape_windows(self):
241 check = self.check_escape
242 check('?:?', '?:[?]')
243 check('*:*', '*:[*]')
244 check(r'\\?\c:\?', r'\\?\c:\[?]')
245 check(r'\\*\*\*', r'\\*\*\[*]')
246 check('//?/c:/?', '//?/c:/[?]')
247 check('//*/*/*', '//*/*/[*]')
Fred Drake2e2be372001-09-20 21:33:42 +0000248
Serhiy Storchakac2edcdd2014-09-11 12:17:37 +0300249 def rglob(self, *parts, **kwargs):
250 return self.glob(*parts, recursive=True, **kwargs)
251
252 def test_recursive_glob(self):
253 eq = self.assertSequencesEqual_noorder
Serhiy Storchaka735b7902015-11-09 23:12:07 +0200254 full = [('EF',), ('ZZZ',),
Serhiy Storchakac2edcdd2014-09-11 12:17:37 +0300255 ('a',), ('a', 'D'),
256 ('a', 'bcd'),
257 ('a', 'bcd', 'EF'),
258 ('a', 'bcd', 'efg'),
259 ('a', 'bcd', 'efg', 'ha'),
260 ('aaa',), ('aaa', 'zzzF'),
261 ('aab',), ('aab', 'F'),
262 ]
263 if can_symlink():
264 full += [('sym1',), ('sym2',),
265 ('sym3',),
266 ('sym3', 'EF'),
267 ('sym3', 'efg'),
268 ('sym3', 'efg', 'ha'),
269 ]
270 eq(self.rglob('**'), self.joins(('',), *full))
Serhiy Storchaka735b7902015-11-09 23:12:07 +0200271 eq(self.rglob(os.curdir, '**'),
272 self.joins((os.curdir, ''), *((os.curdir,) + i for i in full)))
Serhiy Storchakac2edcdd2014-09-11 12:17:37 +0300273 dirs = [('a', ''), ('a', 'bcd', ''), ('a', 'bcd', 'efg', ''),
274 ('aaa', ''), ('aab', '')]
275 if can_symlink():
276 dirs += [('sym3', ''), ('sym3', 'efg', '')]
277 eq(self.rglob('**', ''), self.joins(('',), *dirs))
278
279 eq(self.rglob('a', '**'), self.joins(
280 ('a', ''), ('a', 'D'), ('a', 'bcd'), ('a', 'bcd', 'EF'),
281 ('a', 'bcd', 'efg'), ('a', 'bcd', 'efg', 'ha')))
282 eq(self.rglob('a**'), self.joins(('a',), ('aaa',), ('aab',)))
Serhiy Storchaka735b7902015-11-09 23:12:07 +0200283 expect = [('a', 'bcd', 'EF'), ('EF',)]
Serhiy Storchakac2edcdd2014-09-11 12:17:37 +0300284 if can_symlink():
285 expect += [('sym3', 'EF')]
286 eq(self.rglob('**', 'EF'), self.joins(*expect))
Serhiy Storchaka735b7902015-11-09 23:12:07 +0200287 expect = [('a', 'bcd', 'EF'), ('aaa', 'zzzF'), ('aab', 'F'), ('EF',)]
Serhiy Storchakac2edcdd2014-09-11 12:17:37 +0300288 if can_symlink():
289 expect += [('sym3', 'EF')]
290 eq(self.rglob('**', '*F'), self.joins(*expect))
291 eq(self.rglob('**', '*F', ''), [])
292 eq(self.rglob('**', 'bcd', '*'), self.joins(
293 ('a', 'bcd', 'EF'), ('a', 'bcd', 'efg')))
294 eq(self.rglob('a', '**', 'bcd'), self.joins(('a', 'bcd')))
295
Serhiy Storchaka5fbadb62015-09-06 14:14:49 +0300296 with change_cwd(self.tempdir):
Serhiy Storchakac2edcdd2014-09-11 12:17:37 +0300297 join = os.path.join
298 eq(glob.glob('**', recursive=True), [join(*i) for i in full])
299 eq(glob.glob(join('**', ''), recursive=True),
300 [join(*i) for i in dirs])
Serhiy Storchaka735b7902015-11-09 23:12:07 +0200301 eq(glob.glob(join('**', '*'), recursive=True),
302 [join(*i) for i in full])
303 eq(glob.glob(join(os.curdir, '**'), recursive=True),
304 [join(os.curdir, '')] + [join(os.curdir, *i) for i in full])
305 eq(glob.glob(join(os.curdir, '**', ''), recursive=True),
306 [join(os.curdir, '')] + [join(os.curdir, *i) for i in dirs])
307 eq(glob.glob(join(os.curdir, '**', '*'), recursive=True),
308 [join(os.curdir, *i) for i in full])
Serhiy Storchakac2edcdd2014-09-11 12:17:37 +0300309 eq(glob.glob(join('**','zz*F'), recursive=True),
310 [join('aaa', 'zzzF')])
311 eq(glob.glob('**zz*F', recursive=True), [])
Serhiy Storchaka735b7902015-11-09 23:12:07 +0200312 expect = [join('a', 'bcd', 'EF'), 'EF']
Serhiy Storchakac2edcdd2014-09-11 12:17:37 +0300313 if can_symlink():
314 expect += [join('sym3', 'EF')]
315 eq(glob.glob(join('**', 'EF'), recursive=True), expect)
Serhiy Storchakac2edcdd2014-09-11 12:17:37 +0300316
Serhiy Storchakaf9dc2ad2019-09-12 15:54:48 +0300317 def test_glob_many_open_files(self):
318 depth = 30
319 base = os.path.join(self.tempdir, 'deep')
320 p = os.path.join(base, *(['d']*depth))
321 os.makedirs(p)
322 pattern = os.path.join(base, *(['*']*depth))
323 iters = [glob.iglob(pattern, recursive=True) for j in range(100)]
324 for it in iters:
325 self.assertEqual(next(it), p)
326 pattern = os.path.join(base, '**', 'd')
327 iters = [glob.iglob(pattern, recursive=True) for j in range(100)]
328 p = base
329 for i in range(depth):
330 p = os.path.join(p, 'd')
331 for it in iters:
332 self.assertEqual(next(it), p)
333
Serhiy Storchakac2edcdd2014-09-11 12:17:37 +0300334
335@skip_unless_symlink
336class SymlinkLoopGlobTests(unittest.TestCase):
337
338 def test_selflink(self):
339 tempdir = TESTFN + "_dir"
340 os.makedirs(tempdir)
Serhiy Storchakac2edcdd2014-09-11 12:17:37 +0300341 self.addCleanup(shutil.rmtree, tempdir)
Serhiy Storchakaa1b16ba2014-09-11 14:33:02 +0300342 with change_cwd(tempdir):
343 os.makedirs('dir')
344 create_empty_file(os.path.join('dir', 'file'))
345 os.symlink(os.curdir, os.path.join('dir', 'link'))
Serhiy Storchakac2edcdd2014-09-11 12:17:37 +0300346
Serhiy Storchakaa1b16ba2014-09-11 14:33:02 +0300347 results = glob.glob('**', recursive=True)
348 self.assertEqual(len(results), len(set(results)))
349 results = set(results)
350 depth = 0
351 while results:
352 path = os.path.join(*(['dir'] + ['link'] * depth))
353 self.assertIn(path, results)
354 results.remove(path)
355 if not results:
356 break
357 path = os.path.join(path, 'file')
358 self.assertIn(path, results)
359 results.remove(path)
360 depth += 1
Serhiy Storchakac2edcdd2014-09-11 12:17:37 +0300361
Serhiy Storchakaa1b16ba2014-09-11 14:33:02 +0300362 results = glob.glob(os.path.join('**', 'file'), recursive=True)
363 self.assertEqual(len(results), len(set(results)))
364 results = set(results)
365 depth = 0
366 while results:
367 path = os.path.join(*(['dir'] + ['link'] * depth + ['file']))
368 self.assertIn(path, results)
369 results.remove(path)
370 depth += 1
Serhiy Storchakac2edcdd2014-09-11 12:17:37 +0300371
Serhiy Storchakaa1b16ba2014-09-11 14:33:02 +0300372 results = glob.glob(os.path.join('**', ''), recursive=True)
373 self.assertEqual(len(results), len(set(results)))
374 results = set(results)
375 depth = 0
376 while results:
377 path = os.path.join(*(['dir'] + ['link'] * depth + ['']))
378 self.assertIn(path, results)
379 results.remove(path)
380 depth += 1
Fred Drake2e2be372001-09-20 21:33:42 +0000381
382
383if __name__ == "__main__":
Serhiy Storchakac2edcdd2014-09-11 12:17:37 +0300384 unittest.main()