1edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport glob
2edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport os
3edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport shutil
4edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport sys
5edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport unittest
6edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
7edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepfrom test.test_support import run_unittest, TESTFN
8edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
9edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
10edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepdef fsdecode(s):
11edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    return unicode(s, sys.getfilesystemencoding())
12edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
13edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
14edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass GlobTests(unittest.TestCase):
15edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
16edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def norm(self, *parts):
17edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        return os.path.normpath(os.path.join(self.tempdir, *parts))
18edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
19edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def mktemp(self, *parts):
20edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        filename = self.norm(*parts)
21edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        base, file = os.path.split(filename)
22edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        if not os.path.exists(base):
23edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            os.makedirs(base)
24edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        f = open(filename, 'w')
25edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        f.close()
26edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
27edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def setUp(self):
28edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.tempdir = TESTFN + "_dir"
29edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.mktemp('a', 'D')
30edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.mktemp('aab', 'F')
31edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.mktemp('.aa', 'G')
32edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.mktemp('.bb', 'H')
33edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.mktemp('aaa', 'zzzF')
34edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.mktemp('ZZZ')
35edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.mktemp('a', 'bcd', 'EF')
36edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.mktemp('a', 'bcd', 'efg', 'ha')
37edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        if hasattr(os, 'symlink'):
38edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            os.symlink(self.norm('broken'), self.norm('sym1'))
39edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            os.symlink('broken', self.norm('sym2'))
40edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            os.symlink(os.path.join('a', 'bcd'), self.norm('sym3'))
41edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
42edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def tearDown(self):
43edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        shutil.rmtree(self.tempdir)
44edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
45edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def glob(self, *parts):
46edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        if len(parts) == 1:
47edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            pattern = parts[0]
48edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        else:
49edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            pattern = os.path.join(*parts)
50edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        p = os.path.join(self.tempdir, pattern)
51edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        res = glob.glob(p)
52edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(list(glob.iglob(p)), res)
53edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        ures = [fsdecode(x) for x in res]
54edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(glob.glob(fsdecode(p)), ures)
55edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(list(glob.iglob(fsdecode(p))), ures)
56edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        return res
57edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
58edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def assertSequencesEqual_noorder(self, l1, l2):
59edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        l1 = list(l1)
60edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        l2 = list(l2)
61edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(set(l1), set(l2))
62edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(sorted(l1), sorted(l2))
63edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
64edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_glob_literal(self):
65edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq = self.assertSequencesEqual_noorder
66edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(self.glob('a'), [self.norm('a')])
67edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(self.glob('a', 'D'), [self.norm('a', 'D')])
68edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(self.glob('aab'), [self.norm('aab')])
69edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(self.glob('zymurgy'), [])
70edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
71edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        res = glob.glob('*')
72edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual({type(r) for r in res}, {str})
73edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        res = glob.glob(os.path.join(os.curdir, '*'))
74edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual({type(r) for r in res}, {str})
75edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
76edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # test return types are unicode, but only if os.listdir
77edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # returns unicode filenames
78edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        tmp = os.listdir(fsdecode(os.curdir))
79edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        if {type(x) for x in tmp} == {unicode}:
80edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            res = glob.glob(u'*')
81edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertEqual({type(r) for r in res}, {unicode})
82edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            res = glob.glob(os.path.join(fsdecode(os.curdir), u'*'))
83edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertEqual({type(r) for r in res}, {unicode})
84edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
85edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_glob_one_directory(self):
86edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq = self.assertSequencesEqual_noorder
87edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(self.glob('a*'), map(self.norm, ['a', 'aab', 'aaa']))
88edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(self.glob('*a'), map(self.norm, ['a', 'aaa']))
89edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(self.glob('.*'), map(self.norm, ['.aa', '.bb']))
90edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(self.glob('?aa'), map(self.norm, ['aaa']))
91edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(self.glob('aa?'), map(self.norm, ['aaa', 'aab']))
92edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(self.glob('aa[ab]'), map(self.norm, ['aaa', 'aab']))
93edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(self.glob('*q'), [])
94edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
95edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_glob_nested_directory(self):
96edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq = self.assertSequencesEqual_noorder
97edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        if os.path.normcase("abCD") == "abCD":
98edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            # case-sensitive filesystem
99edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            eq(self.glob('a', 'bcd', 'E*'), [self.norm('a', 'bcd', 'EF')])
100edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        else:
101edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            # case insensitive filesystem
102edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            eq(self.glob('a', 'bcd', 'E*'), [self.norm('a', 'bcd', 'EF'),
103edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                                             self.norm('a', 'bcd', 'efg')])
104edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(self.glob('a', 'bcd', '*g'), [self.norm('a', 'bcd', 'efg')])
105edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
106edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_glob_directory_names(self):
107edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq = self.assertSequencesEqual_noorder
108edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(self.glob('*', 'D'), [self.norm('a', 'D')])
109edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(self.glob('*', '*a'), [])
110edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(self.glob('a', '*', '*', '*a'),
111edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep           [self.norm('a', 'bcd', 'efg', 'ha')])
112edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(self.glob('?a?', '*F'), [self.norm('aaa', 'zzzF'),
113edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                                    self.norm('aab', 'F')])
114edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
115edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_glob_directory_with_trailing_slash(self):
116edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # Patterns ending with a slash shouldn't match non-dirs
117edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        res = glob.glob(self.norm('Z*Z') + os.sep)
118edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(res, [])
119edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        res = glob.glob(self.norm('ZZZ') + os.sep)
120edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(res, [])
121edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # When there is a wildcard pattern which ends with os.sep, glob()
122edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # doesn't blow up.
123edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        res = glob.glob(self.norm('aa*') + os.sep)
124edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(len(res), 2)
125edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # either of these results is reasonable
126edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertIn(set(res), [
127edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                      {self.norm('aaa'), self.norm('aab')},
128edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                      {self.norm('aaa') + os.sep, self.norm('aab') + os.sep},
129edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                      ])
130edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
131edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_glob_unicode_directory_with_trailing_slash(self):
132edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # Same as test_glob_directory_with_trailing_slash, but with an
133edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # unicode argument.
134edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        res = glob.glob(fsdecode(self.norm('Z*Z') + os.sep))
135edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(res, [])
136edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        res = glob.glob(fsdecode(self.norm('ZZZ') + os.sep))
137edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(res, [])
138edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        res = glob.glob(fsdecode(self.norm('aa*') + os.sep))
139edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(len(res), 2)
140edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # either of these results is reasonable
141edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertIn(set(res), [
142edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                      {fsdecode(self.norm('aaa')), fsdecode(self.norm('aab'))},
143edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                      {fsdecode(self.norm('aaa') + os.sep),
144edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                       fsdecode(self.norm('aab') + os.sep)},
145edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                      ])
146edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
147edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    @unittest.skipUnless(hasattr(os, 'symlink'), "Requires symlink support")
148edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_glob_symlinks(self):
149edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq = self.assertSequencesEqual_noorder
150edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(self.glob('sym3'), [self.norm('sym3')])
151edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(self.glob('sym3', '*'), [self.norm('sym3', 'EF'),
152edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                                    self.norm('sym3', 'efg')])
153edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertIn(self.glob('sym3' + os.sep),
154edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                      [[self.norm('sym3')], [self.norm('sym3') + os.sep]])
155edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(self.glob('*', '*F'),
156edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep           [self.norm('aaa', 'zzzF'), self.norm('aab', 'F'),
157edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.norm('sym3', 'EF')])
158edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
159edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    @unittest.skipUnless(hasattr(os, 'symlink'), "Requires symlink support")
160edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_glob_broken_symlinks(self):
161edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq = self.assertSequencesEqual_noorder
162edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(self.glob('sym*'), [self.norm('sym1'), self.norm('sym2'),
163edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                               self.norm('sym3')])
164edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(self.glob('sym1'), [self.norm('sym1')])
165edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(self.glob('sym2'), [self.norm('sym2')])
166edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
167edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    @unittest.skipUnless(sys.platform == "win32", "Win32 specific test")
168edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_glob_magic_in_drive(self):
169edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq = self.assertSequencesEqual_noorder
170edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(glob.glob('*:'), [])
171edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(glob.glob(u'*:'), [])
172edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(glob.glob('?:'), [])
173edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        eq(glob.glob(u'?:'), [])
174edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
175edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
176edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepdef test_main():
177edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    run_unittest(GlobTests)
178edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
179edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
180edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepif __name__ == "__main__":
181edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    test_main()
182