xref: /aosp_15_r20/build/blueprint/pathtools/glob_test.go (revision 1fa6dee971e1612fa5cc0aa5ca2d35a22e2c34a3)
1*1fa6dee9SAndroid Build Coastguard Worker// Copyright 2014 Google Inc. All rights reserved.
2*1fa6dee9SAndroid Build Coastguard Worker//
3*1fa6dee9SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*1fa6dee9SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*1fa6dee9SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*1fa6dee9SAndroid Build Coastguard Worker//
7*1fa6dee9SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*1fa6dee9SAndroid Build Coastguard Worker//
9*1fa6dee9SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*1fa6dee9SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*1fa6dee9SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*1fa6dee9SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*1fa6dee9SAndroid Build Coastguard Worker// limitations under the License.
14*1fa6dee9SAndroid Build Coastguard Worker
15*1fa6dee9SAndroid Build Coastguard Workerpackage pathtools
16*1fa6dee9SAndroid Build Coastguard Worker
17*1fa6dee9SAndroid Build Coastguard Workerimport (
18*1fa6dee9SAndroid Build Coastguard Worker	"os"
19*1fa6dee9SAndroid Build Coastguard Worker	"path/filepath"
20*1fa6dee9SAndroid Build Coastguard Worker	"reflect"
21*1fa6dee9SAndroid Build Coastguard Worker	"strings"
22*1fa6dee9SAndroid Build Coastguard Worker	"testing"
23*1fa6dee9SAndroid Build Coastguard Worker)
24*1fa6dee9SAndroid Build Coastguard Worker
25*1fa6dee9SAndroid Build Coastguard Workervar pwd, _ = os.Getwd()
26*1fa6dee9SAndroid Build Coastguard Worker
27*1fa6dee9SAndroid Build Coastguard Workertype globTestCase struct {
28*1fa6dee9SAndroid Build Coastguard Worker	pattern  string
29*1fa6dee9SAndroid Build Coastguard Worker	matches  []string
30*1fa6dee9SAndroid Build Coastguard Worker	excludes []string
31*1fa6dee9SAndroid Build Coastguard Worker	deps     []string
32*1fa6dee9SAndroid Build Coastguard Worker	err      error
33*1fa6dee9SAndroid Build Coastguard Worker}
34*1fa6dee9SAndroid Build Coastguard Worker
35*1fa6dee9SAndroid Build Coastguard Workervar globTestCases = []globTestCase{
36*1fa6dee9SAndroid Build Coastguard Worker	// Current directory tests
37*1fa6dee9SAndroid Build Coastguard Worker	{
38*1fa6dee9SAndroid Build Coastguard Worker		pattern: "*",
39*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"a/", "b/", "c/", "d.ext", "e.ext"},
40*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"."},
41*1fa6dee9SAndroid Build Coastguard Worker	},
42*1fa6dee9SAndroid Build Coastguard Worker	{
43*1fa6dee9SAndroid Build Coastguard Worker		pattern: "*.ext",
44*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"d.ext", "e.ext"},
45*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"."},
46*1fa6dee9SAndroid Build Coastguard Worker	},
47*1fa6dee9SAndroid Build Coastguard Worker	{
48*1fa6dee9SAndroid Build Coastguard Worker		pattern: "*/a",
49*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"a/a/", "b/a"},
50*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{".", "a", "b", "c"},
51*1fa6dee9SAndroid Build Coastguard Worker	},
52*1fa6dee9SAndroid Build Coastguard Worker	{
53*1fa6dee9SAndroid Build Coastguard Worker		pattern: "*/*/a",
54*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"a/a/a"},
55*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{".", "a", "b", "c", "a/a", "a/b", "c/f", "c/g", "c/h"},
56*1fa6dee9SAndroid Build Coastguard Worker	},
57*1fa6dee9SAndroid Build Coastguard Worker	{
58*1fa6dee9SAndroid Build Coastguard Worker		pattern: "*/a/a",
59*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"a/a/a"},
60*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{".", "a", "b", "c", "a/a"},
61*1fa6dee9SAndroid Build Coastguard Worker	},
62*1fa6dee9SAndroid Build Coastguard Worker	{
63*1fa6dee9SAndroid Build Coastguard Worker		pattern: "c/*/?",
64*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"c/h/h"},
65*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"c", "c/f", "c/g", "c/h"},
66*1fa6dee9SAndroid Build Coastguard Worker	},
67*1fa6dee9SAndroid Build Coastguard Worker	{
68*1fa6dee9SAndroid Build Coastguard Worker		pattern: "c/*/[gh]*",
69*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"c/g/g.ext", "c/h/h"},
70*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"c", "c/f", "c/g", "c/h"},
71*1fa6dee9SAndroid Build Coastguard Worker	},
72*1fa6dee9SAndroid Build Coastguard Worker	{
73*1fa6dee9SAndroid Build Coastguard Worker		pattern: "c/*/[fgh]*",
74*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"c/f/f.ext", "c/g/g.ext", "c/h/h"},
75*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"c", "c/f", "c/g", "c/h"},
76*1fa6dee9SAndroid Build Coastguard Worker	},
77*1fa6dee9SAndroid Build Coastguard Worker	{
78*1fa6dee9SAndroid Build Coastguard Worker		pattern: "c/*/[f-h]*",
79*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"c/f/f.ext", "c/g/g.ext", "c/h/h"},
80*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"c", "c/f", "c/g", "c/h"},
81*1fa6dee9SAndroid Build Coastguard Worker	},
82*1fa6dee9SAndroid Build Coastguard Worker	// ./ directory tests
83*1fa6dee9SAndroid Build Coastguard Worker	{
84*1fa6dee9SAndroid Build Coastguard Worker		pattern: "./*",
85*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"a/", "b/", "c/", "d.ext", "e.ext"},
86*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"."},
87*1fa6dee9SAndroid Build Coastguard Worker	},
88*1fa6dee9SAndroid Build Coastguard Worker	{
89*1fa6dee9SAndroid Build Coastguard Worker		pattern: "./*.ext",
90*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"d.ext", "e.ext"},
91*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"."},
92*1fa6dee9SAndroid Build Coastguard Worker	},
93*1fa6dee9SAndroid Build Coastguard Worker	{
94*1fa6dee9SAndroid Build Coastguard Worker		pattern: "./*/a",
95*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"a/a/", "b/a"},
96*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{".", "a", "b", "c"},
97*1fa6dee9SAndroid Build Coastguard Worker	},
98*1fa6dee9SAndroid Build Coastguard Worker	{
99*1fa6dee9SAndroid Build Coastguard Worker		pattern: "./[ac]/a",
100*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"a/a/"},
101*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{".", "a", "c"},
102*1fa6dee9SAndroid Build Coastguard Worker	},
103*1fa6dee9SAndroid Build Coastguard Worker
104*1fa6dee9SAndroid Build Coastguard Worker	// subdirectory tests
105*1fa6dee9SAndroid Build Coastguard Worker	{
106*1fa6dee9SAndroid Build Coastguard Worker		pattern: "c/*/*.ext",
107*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"c/f/f.ext", "c/g/g.ext"},
108*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"c", "c/f", "c/g", "c/h"},
109*1fa6dee9SAndroid Build Coastguard Worker	},
110*1fa6dee9SAndroid Build Coastguard Worker	{
111*1fa6dee9SAndroid Build Coastguard Worker		pattern: "a/*/a",
112*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"a/a/a"},
113*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"a", "a/a", "a/b"},
114*1fa6dee9SAndroid Build Coastguard Worker	},
115*1fa6dee9SAndroid Build Coastguard Worker
116*1fa6dee9SAndroid Build Coastguard Worker	// absolute tests
117*1fa6dee9SAndroid Build Coastguard Worker	{
118*1fa6dee9SAndroid Build Coastguard Worker		pattern: filepath.Join(pwd, "testdata/glob/c/*/*.ext"),
119*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{
120*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c/f/f.ext"),
121*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c/g/g.ext"),
122*1fa6dee9SAndroid Build Coastguard Worker		},
123*1fa6dee9SAndroid Build Coastguard Worker		deps: []string{
124*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c"),
125*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c/f"),
126*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c/g"),
127*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c/h"),
128*1fa6dee9SAndroid Build Coastguard Worker		},
129*1fa6dee9SAndroid Build Coastguard Worker	},
130*1fa6dee9SAndroid Build Coastguard Worker
131*1fa6dee9SAndroid Build Coastguard Worker	// no-wild tests
132*1fa6dee9SAndroid Build Coastguard Worker	{
133*1fa6dee9SAndroid Build Coastguard Worker		pattern: "a",
134*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"a/"},
135*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"a"},
136*1fa6dee9SAndroid Build Coastguard Worker	},
137*1fa6dee9SAndroid Build Coastguard Worker	{
138*1fa6dee9SAndroid Build Coastguard Worker		pattern: "a/a",
139*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"a/a/"},
140*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"a/a"},
141*1fa6dee9SAndroid Build Coastguard Worker	},
142*1fa6dee9SAndroid Build Coastguard Worker
143*1fa6dee9SAndroid Build Coastguard Worker	// clean tests
144*1fa6dee9SAndroid Build Coastguard Worker	{
145*1fa6dee9SAndroid Build Coastguard Worker		pattern: "./c/*/*.ext",
146*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"c/f/f.ext", "c/g/g.ext"},
147*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"c", "c/f", "c/g", "c/h"},
148*1fa6dee9SAndroid Build Coastguard Worker	},
149*1fa6dee9SAndroid Build Coastguard Worker	{
150*1fa6dee9SAndroid Build Coastguard Worker		pattern: "c/../c/*/*.ext",
151*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"c/f/f.ext", "c/g/g.ext"},
152*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"c", "c/f", "c/g", "c/h"},
153*1fa6dee9SAndroid Build Coastguard Worker	},
154*1fa6dee9SAndroid Build Coastguard Worker
155*1fa6dee9SAndroid Build Coastguard Worker	// recursive tests
156*1fa6dee9SAndroid Build Coastguard Worker	{
157*1fa6dee9SAndroid Build Coastguard Worker		pattern: "**/a",
158*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"a/", "a/a/", "a/a/a", "b/a"},
159*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{".", "a", "a/a", "a/b", "b", "c", "c/f", "c/g", "c/h"},
160*1fa6dee9SAndroid Build Coastguard Worker	},
161*1fa6dee9SAndroid Build Coastguard Worker	{
162*1fa6dee9SAndroid Build Coastguard Worker		pattern: "a/**/a",
163*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"a/a/", "a/a/a"},
164*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"a", "a/a", "a/b"},
165*1fa6dee9SAndroid Build Coastguard Worker	},
166*1fa6dee9SAndroid Build Coastguard Worker	{
167*1fa6dee9SAndroid Build Coastguard Worker		pattern: "a/**/*",
168*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"a/a/", "a/b/", "a/a/a", "a/b/b"},
169*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"a", "a/a", "a/b"},
170*1fa6dee9SAndroid Build Coastguard Worker	},
171*1fa6dee9SAndroid Build Coastguard Worker
172*1fa6dee9SAndroid Build Coastguard Worker	// absolute recursive tests
173*1fa6dee9SAndroid Build Coastguard Worker	{
174*1fa6dee9SAndroid Build Coastguard Worker		pattern: filepath.Join(pwd, "testdata/glob/**/*.ext"),
175*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{
176*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/d.ext"),
177*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/e.ext"),
178*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c/f/f.ext"),
179*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c/g/g.ext"),
180*1fa6dee9SAndroid Build Coastguard Worker		},
181*1fa6dee9SAndroid Build Coastguard Worker		deps: []string{
182*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob"),
183*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/a"),
184*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/a/a"),
185*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/a/b"),
186*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/b"),
187*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c"),
188*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c/f"),
189*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c/g"),
190*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c/h"),
191*1fa6dee9SAndroid Build Coastguard Worker		},
192*1fa6dee9SAndroid Build Coastguard Worker	},
193*1fa6dee9SAndroid Build Coastguard Worker
194*1fa6dee9SAndroid Build Coastguard Worker	// recursive error tests
195*1fa6dee9SAndroid Build Coastguard Worker	{
196*1fa6dee9SAndroid Build Coastguard Worker		pattern: "**/**/*",
197*1fa6dee9SAndroid Build Coastguard Worker		err:     GlobMultipleRecursiveErr,
198*1fa6dee9SAndroid Build Coastguard Worker	},
199*1fa6dee9SAndroid Build Coastguard Worker	{
200*1fa6dee9SAndroid Build Coastguard Worker		pattern: "a/**/**/*",
201*1fa6dee9SAndroid Build Coastguard Worker		err:     GlobMultipleRecursiveErr,
202*1fa6dee9SAndroid Build Coastguard Worker	},
203*1fa6dee9SAndroid Build Coastguard Worker	{
204*1fa6dee9SAndroid Build Coastguard Worker		pattern: "**/a/**/*",
205*1fa6dee9SAndroid Build Coastguard Worker		err:     GlobMultipleRecursiveErr,
206*1fa6dee9SAndroid Build Coastguard Worker	},
207*1fa6dee9SAndroid Build Coastguard Worker	{
208*1fa6dee9SAndroid Build Coastguard Worker		pattern: "**/**/a/*",
209*1fa6dee9SAndroid Build Coastguard Worker		err:     GlobMultipleRecursiveErr,
210*1fa6dee9SAndroid Build Coastguard Worker	},
211*1fa6dee9SAndroid Build Coastguard Worker	{
212*1fa6dee9SAndroid Build Coastguard Worker		pattern: "a/**",
213*1fa6dee9SAndroid Build Coastguard Worker		err:     GlobLastRecursiveErr,
214*1fa6dee9SAndroid Build Coastguard Worker	},
215*1fa6dee9SAndroid Build Coastguard Worker	{
216*1fa6dee9SAndroid Build Coastguard Worker		pattern: "**/**",
217*1fa6dee9SAndroid Build Coastguard Worker		err:     GlobLastRecursiveErr,
218*1fa6dee9SAndroid Build Coastguard Worker	},
219*1fa6dee9SAndroid Build Coastguard Worker	{
220*1fa6dee9SAndroid Build Coastguard Worker		pattern: "a**/",
221*1fa6dee9SAndroid Build Coastguard Worker		err:     GlobInvalidRecursiveErr,
222*1fa6dee9SAndroid Build Coastguard Worker	},
223*1fa6dee9SAndroid Build Coastguard Worker	{
224*1fa6dee9SAndroid Build Coastguard Worker		pattern: "**a/",
225*1fa6dee9SAndroid Build Coastguard Worker		err:     GlobInvalidRecursiveErr,
226*1fa6dee9SAndroid Build Coastguard Worker	},
227*1fa6dee9SAndroid Build Coastguard Worker
228*1fa6dee9SAndroid Build Coastguard Worker	// exclude tests
229*1fa6dee9SAndroid Build Coastguard Worker	{
230*1fa6dee9SAndroid Build Coastguard Worker		pattern:  "*.ext",
231*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{"d.ext"},
232*1fa6dee9SAndroid Build Coastguard Worker		matches:  []string{"e.ext"},
233*1fa6dee9SAndroid Build Coastguard Worker		deps:     []string{"."},
234*1fa6dee9SAndroid Build Coastguard Worker	},
235*1fa6dee9SAndroid Build Coastguard Worker	{
236*1fa6dee9SAndroid Build Coastguard Worker		pattern:  "*/*",
237*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{"a/b"},
238*1fa6dee9SAndroid Build Coastguard Worker		matches:  []string{"a/a/", "b/a", "c/c", "c/f/", "c/g/", "c/h/"},
239*1fa6dee9SAndroid Build Coastguard Worker		deps:     []string{".", "a", "b", "c"},
240*1fa6dee9SAndroid Build Coastguard Worker	},
241*1fa6dee9SAndroid Build Coastguard Worker	{
242*1fa6dee9SAndroid Build Coastguard Worker		pattern:  "*/*",
243*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{"a/b", "c/c"},
244*1fa6dee9SAndroid Build Coastguard Worker		matches:  []string{"a/a/", "b/a", "c/f/", "c/g/", "c/h/"},
245*1fa6dee9SAndroid Build Coastguard Worker		deps:     []string{".", "a", "b", "c"},
246*1fa6dee9SAndroid Build Coastguard Worker	},
247*1fa6dee9SAndroid Build Coastguard Worker	{
248*1fa6dee9SAndroid Build Coastguard Worker		pattern:  "*/*",
249*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{"c/*", "*/a"},
250*1fa6dee9SAndroid Build Coastguard Worker		matches:  []string{"a/b/"},
251*1fa6dee9SAndroid Build Coastguard Worker		deps:     []string{".", "a", "b", "c"},
252*1fa6dee9SAndroid Build Coastguard Worker	},
253*1fa6dee9SAndroid Build Coastguard Worker	{
254*1fa6dee9SAndroid Build Coastguard Worker		pattern:  "*/*",
255*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{"*/*"},
256*1fa6dee9SAndroid Build Coastguard Worker		matches:  nil,
257*1fa6dee9SAndroid Build Coastguard Worker		deps:     []string{".", "a", "b", "c"},
258*1fa6dee9SAndroid Build Coastguard Worker	},
259*1fa6dee9SAndroid Build Coastguard Worker
260*1fa6dee9SAndroid Build Coastguard Worker	// absolute exclude tests
261*1fa6dee9SAndroid Build Coastguard Worker	{
262*1fa6dee9SAndroid Build Coastguard Worker		pattern:  filepath.Join(pwd, "testdata/glob/c/*/*.ext"),
263*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{filepath.Join(pwd, "testdata/glob/c/*/f.ext")},
264*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{
265*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c/g/g.ext"),
266*1fa6dee9SAndroid Build Coastguard Worker		},
267*1fa6dee9SAndroid Build Coastguard Worker		deps: []string{
268*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c"),
269*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c/f"),
270*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c/g"),
271*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c/h"),
272*1fa6dee9SAndroid Build Coastguard Worker		},
273*1fa6dee9SAndroid Build Coastguard Worker	},
274*1fa6dee9SAndroid Build Coastguard Worker	{
275*1fa6dee9SAndroid Build Coastguard Worker		pattern:  filepath.Join(pwd, "testdata/glob/c/*/*.ext"),
276*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{filepath.Join(pwd, "testdata/glob/c/f/*.ext")},
277*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{
278*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c/g/g.ext"),
279*1fa6dee9SAndroid Build Coastguard Worker		},
280*1fa6dee9SAndroid Build Coastguard Worker		deps: []string{
281*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c"),
282*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c/f"),
283*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c/g"),
284*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c/h"),
285*1fa6dee9SAndroid Build Coastguard Worker		},
286*1fa6dee9SAndroid Build Coastguard Worker	},
287*1fa6dee9SAndroid Build Coastguard Worker
288*1fa6dee9SAndroid Build Coastguard Worker	// recursive exclude tests
289*1fa6dee9SAndroid Build Coastguard Worker	{
290*1fa6dee9SAndroid Build Coastguard Worker		pattern:  "*.ext",
291*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{"**/*.ext"},
292*1fa6dee9SAndroid Build Coastguard Worker		matches:  nil,
293*1fa6dee9SAndroid Build Coastguard Worker		deps:     []string{"."},
294*1fa6dee9SAndroid Build Coastguard Worker	},
295*1fa6dee9SAndroid Build Coastguard Worker	{
296*1fa6dee9SAndroid Build Coastguard Worker		pattern:  "*/*",
297*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{"**/b"},
298*1fa6dee9SAndroid Build Coastguard Worker		matches:  []string{"a/a/", "b/a", "c/c", "c/f/", "c/g/", "c/h/"},
299*1fa6dee9SAndroid Build Coastguard Worker		deps:     []string{".", "a", "b", "c"},
300*1fa6dee9SAndroid Build Coastguard Worker	},
301*1fa6dee9SAndroid Build Coastguard Worker	{
302*1fa6dee9SAndroid Build Coastguard Worker		pattern:  "*/*",
303*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{"a/**/*"},
304*1fa6dee9SAndroid Build Coastguard Worker		matches:  []string{"b/a", "c/c", "c/f/", "c/g/", "c/h/"},
305*1fa6dee9SAndroid Build Coastguard Worker		deps:     []string{".", "a", "b", "c"},
306*1fa6dee9SAndroid Build Coastguard Worker	},
307*1fa6dee9SAndroid Build Coastguard Worker	{
308*1fa6dee9SAndroid Build Coastguard Worker		pattern:  "**/*",
309*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{"**/*"},
310*1fa6dee9SAndroid Build Coastguard Worker		matches:  nil,
311*1fa6dee9SAndroid Build Coastguard Worker		deps:     []string{".", "a", "a/a", "a/b", "b", "c", "c/f", "c/g", "c/h"},
312*1fa6dee9SAndroid Build Coastguard Worker	},
313*1fa6dee9SAndroid Build Coastguard Worker	{
314*1fa6dee9SAndroid Build Coastguard Worker		pattern:  "*/*/*",
315*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{"a/**/a"},
316*1fa6dee9SAndroid Build Coastguard Worker		matches:  []string{"a/b/b", "c/f/f.ext", "c/g/g.ext", "c/h/h"},
317*1fa6dee9SAndroid Build Coastguard Worker		deps:     []string{".", "a", "b", "c", "a/a", "a/b", "c/f", "c/g", "c/h"},
318*1fa6dee9SAndroid Build Coastguard Worker	},
319*1fa6dee9SAndroid Build Coastguard Worker	{
320*1fa6dee9SAndroid Build Coastguard Worker		pattern:  "*/*/*",
321*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{"**/a"},
322*1fa6dee9SAndroid Build Coastguard Worker		matches:  []string{"a/b/b", "c/f/f.ext", "c/g/g.ext", "c/h/h"},
323*1fa6dee9SAndroid Build Coastguard Worker		deps:     []string{".", "a", "b", "c", "a/a", "a/b", "c/f", "c/g", "c/h"},
324*1fa6dee9SAndroid Build Coastguard Worker	},
325*1fa6dee9SAndroid Build Coastguard Worker	{
326*1fa6dee9SAndroid Build Coastguard Worker		pattern:  "c/*/*.ext",
327*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{"c/**/f.ext"},
328*1fa6dee9SAndroid Build Coastguard Worker		matches:  []string{"c/g/g.ext"},
329*1fa6dee9SAndroid Build Coastguard Worker		deps:     []string{"c", "c/f", "c/g", "c/h"},
330*1fa6dee9SAndroid Build Coastguard Worker	},
331*1fa6dee9SAndroid Build Coastguard Worker
332*1fa6dee9SAndroid Build Coastguard Worker	// absoulte recursive exclude tests
333*1fa6dee9SAndroid Build Coastguard Worker	{
334*1fa6dee9SAndroid Build Coastguard Worker		pattern:  filepath.Join(pwd, "testdata/glob/c/*/*.ext"),
335*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{filepath.Join(pwd, "testdata/glob/**/f.ext")},
336*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{
337*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c/g/g.ext"),
338*1fa6dee9SAndroid Build Coastguard Worker		},
339*1fa6dee9SAndroid Build Coastguard Worker		deps: []string{
340*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c"),
341*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c/f"),
342*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c/g"),
343*1fa6dee9SAndroid Build Coastguard Worker			filepath.Join(pwd, "testdata/glob/c/h"),
344*1fa6dee9SAndroid Build Coastguard Worker		},
345*1fa6dee9SAndroid Build Coastguard Worker	},
346*1fa6dee9SAndroid Build Coastguard Worker
347*1fa6dee9SAndroid Build Coastguard Worker	// clean exclude tests
348*1fa6dee9SAndroid Build Coastguard Worker	{
349*1fa6dee9SAndroid Build Coastguard Worker		pattern:  "./c/*/*.ext",
350*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{"./c/*/f.ext"},
351*1fa6dee9SAndroid Build Coastguard Worker		matches:  []string{"c/g/g.ext"},
352*1fa6dee9SAndroid Build Coastguard Worker		deps:     []string{"c", "c/f", "c/g", "c/h"},
353*1fa6dee9SAndroid Build Coastguard Worker	},
354*1fa6dee9SAndroid Build Coastguard Worker	{
355*1fa6dee9SAndroid Build Coastguard Worker		pattern:  "c/*/*.ext",
356*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{"./c/*/f.ext"},
357*1fa6dee9SAndroid Build Coastguard Worker		matches:  []string{"c/g/g.ext"},
358*1fa6dee9SAndroid Build Coastguard Worker		deps:     []string{"c", "c/f", "c/g", "c/h"},
359*1fa6dee9SAndroid Build Coastguard Worker	},
360*1fa6dee9SAndroid Build Coastguard Worker	{
361*1fa6dee9SAndroid Build Coastguard Worker		pattern:  "./c/*/*.ext",
362*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{"c/*/f.ext"},
363*1fa6dee9SAndroid Build Coastguard Worker		matches:  []string{"c/g/g.ext"},
364*1fa6dee9SAndroid Build Coastguard Worker		deps:     []string{"c", "c/f", "c/g", "c/h"},
365*1fa6dee9SAndroid Build Coastguard Worker	},
366*1fa6dee9SAndroid Build Coastguard Worker
367*1fa6dee9SAndroid Build Coastguard Worker	// non-existant non-wild path tests
368*1fa6dee9SAndroid Build Coastguard Worker	{
369*1fa6dee9SAndroid Build Coastguard Worker		pattern: "d/*",
370*1fa6dee9SAndroid Build Coastguard Worker		matches: nil,
371*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"."},
372*1fa6dee9SAndroid Build Coastguard Worker	},
373*1fa6dee9SAndroid Build Coastguard Worker	{
374*1fa6dee9SAndroid Build Coastguard Worker		pattern: "d",
375*1fa6dee9SAndroid Build Coastguard Worker		matches: nil,
376*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"."},
377*1fa6dee9SAndroid Build Coastguard Worker	},
378*1fa6dee9SAndroid Build Coastguard Worker	{
379*1fa6dee9SAndroid Build Coastguard Worker		pattern: "a/d/*",
380*1fa6dee9SAndroid Build Coastguard Worker		matches: nil,
381*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"a"},
382*1fa6dee9SAndroid Build Coastguard Worker	},
383*1fa6dee9SAndroid Build Coastguard Worker	{
384*1fa6dee9SAndroid Build Coastguard Worker		pattern: "a/d",
385*1fa6dee9SAndroid Build Coastguard Worker		matches: nil,
386*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"a"},
387*1fa6dee9SAndroid Build Coastguard Worker	},
388*1fa6dee9SAndroid Build Coastguard Worker	{
389*1fa6dee9SAndroid Build Coastguard Worker		pattern: "a/a/d/*",
390*1fa6dee9SAndroid Build Coastguard Worker		matches: nil,
391*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"a/a"},
392*1fa6dee9SAndroid Build Coastguard Worker	},
393*1fa6dee9SAndroid Build Coastguard Worker	{
394*1fa6dee9SAndroid Build Coastguard Worker		pattern: "a/a/d",
395*1fa6dee9SAndroid Build Coastguard Worker		matches: nil,
396*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"a/a"},
397*1fa6dee9SAndroid Build Coastguard Worker	},
398*1fa6dee9SAndroid Build Coastguard Worker	{
399*1fa6dee9SAndroid Build Coastguard Worker		pattern: "a/d/a/*",
400*1fa6dee9SAndroid Build Coastguard Worker		matches: nil,
401*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"a"},
402*1fa6dee9SAndroid Build Coastguard Worker	},
403*1fa6dee9SAndroid Build Coastguard Worker	{
404*1fa6dee9SAndroid Build Coastguard Worker		pattern: "a/d/a",
405*1fa6dee9SAndroid Build Coastguard Worker		matches: nil,
406*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"a"},
407*1fa6dee9SAndroid Build Coastguard Worker	},
408*1fa6dee9SAndroid Build Coastguard Worker	{
409*1fa6dee9SAndroid Build Coastguard Worker		pattern: "a/d/a/*/a",
410*1fa6dee9SAndroid Build Coastguard Worker		matches: nil,
411*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"a"},
412*1fa6dee9SAndroid Build Coastguard Worker	},
413*1fa6dee9SAndroid Build Coastguard Worker	{
414*1fa6dee9SAndroid Build Coastguard Worker		pattern: "a/d/a/**/a",
415*1fa6dee9SAndroid Build Coastguard Worker		matches: nil,
416*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"a"},
417*1fa6dee9SAndroid Build Coastguard Worker	},
418*1fa6dee9SAndroid Build Coastguard Worker
419*1fa6dee9SAndroid Build Coastguard Worker	// recursive exclude error tests
420*1fa6dee9SAndroid Build Coastguard Worker	{
421*1fa6dee9SAndroid Build Coastguard Worker		pattern:  "**/*",
422*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{"**/**/*"},
423*1fa6dee9SAndroid Build Coastguard Worker		err:      GlobMultipleRecursiveErr,
424*1fa6dee9SAndroid Build Coastguard Worker	},
425*1fa6dee9SAndroid Build Coastguard Worker	{
426*1fa6dee9SAndroid Build Coastguard Worker		pattern:  "**/*",
427*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{"a/**/**/*"},
428*1fa6dee9SAndroid Build Coastguard Worker		err:      GlobMultipleRecursiveErr,
429*1fa6dee9SAndroid Build Coastguard Worker	},
430*1fa6dee9SAndroid Build Coastguard Worker	{
431*1fa6dee9SAndroid Build Coastguard Worker		pattern:  "**/*",
432*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{"**/a/**/*"},
433*1fa6dee9SAndroid Build Coastguard Worker		err:      GlobMultipleRecursiveErr,
434*1fa6dee9SAndroid Build Coastguard Worker	},
435*1fa6dee9SAndroid Build Coastguard Worker	{
436*1fa6dee9SAndroid Build Coastguard Worker		pattern:  "**/*",
437*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{"**/**/a/*"},
438*1fa6dee9SAndroid Build Coastguard Worker		err:      GlobMultipleRecursiveErr,
439*1fa6dee9SAndroid Build Coastguard Worker	},
440*1fa6dee9SAndroid Build Coastguard Worker	{
441*1fa6dee9SAndroid Build Coastguard Worker		pattern:  "**/*",
442*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{"a/**"},
443*1fa6dee9SAndroid Build Coastguard Worker		err:      GlobLastRecursiveErr,
444*1fa6dee9SAndroid Build Coastguard Worker	},
445*1fa6dee9SAndroid Build Coastguard Worker	{
446*1fa6dee9SAndroid Build Coastguard Worker		pattern:  "**/*",
447*1fa6dee9SAndroid Build Coastguard Worker		excludes: []string{"**/**"},
448*1fa6dee9SAndroid Build Coastguard Worker		err:      GlobLastRecursiveErr,
449*1fa6dee9SAndroid Build Coastguard Worker	},
450*1fa6dee9SAndroid Build Coastguard Worker
451*1fa6dee9SAndroid Build Coastguard Worker	// If names are excluded by default, but referenced explicitly, they should return results
452*1fa6dee9SAndroid Build Coastguard Worker	{
453*1fa6dee9SAndroid Build Coastguard Worker		pattern: ".test/*",
454*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{".test/a"},
455*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{".test"},
456*1fa6dee9SAndroid Build Coastguard Worker	},
457*1fa6dee9SAndroid Build Coastguard Worker	{
458*1fa6dee9SAndroid Build Coastguard Worker		pattern: ".t*/a",
459*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{".test/a"},
460*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{".", ".test"},
461*1fa6dee9SAndroid Build Coastguard Worker	},
462*1fa6dee9SAndroid Build Coastguard Worker	{
463*1fa6dee9SAndroid Build Coastguard Worker		pattern: ".*/.*",
464*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{".test/.ing"},
465*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{".", ".test"},
466*1fa6dee9SAndroid Build Coastguard Worker	},
467*1fa6dee9SAndroid Build Coastguard Worker	{
468*1fa6dee9SAndroid Build Coastguard Worker		pattern: ".t*",
469*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{".test/", ".testing"},
470*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"."},
471*1fa6dee9SAndroid Build Coastguard Worker	},
472*1fa6dee9SAndroid Build Coastguard Worker}
473*1fa6dee9SAndroid Build Coastguard Worker
474*1fa6dee9SAndroid Build Coastguard Workerfunc TestMockGlob(t *testing.T) {
475*1fa6dee9SAndroid Build Coastguard Worker	files := []string{
476*1fa6dee9SAndroid Build Coastguard Worker		"a/a/a",
477*1fa6dee9SAndroid Build Coastguard Worker		"a/b/b",
478*1fa6dee9SAndroid Build Coastguard Worker		"b/a",
479*1fa6dee9SAndroid Build Coastguard Worker		"c/c",
480*1fa6dee9SAndroid Build Coastguard Worker		"c/f/f.ext",
481*1fa6dee9SAndroid Build Coastguard Worker		"c/g/g.ext",
482*1fa6dee9SAndroid Build Coastguard Worker		"c/h/h",
483*1fa6dee9SAndroid Build Coastguard Worker		"d.ext",
484*1fa6dee9SAndroid Build Coastguard Worker		"e.ext",
485*1fa6dee9SAndroid Build Coastguard Worker		".test/a",
486*1fa6dee9SAndroid Build Coastguard Worker		".testing",
487*1fa6dee9SAndroid Build Coastguard Worker		".test/.ing",
488*1fa6dee9SAndroid Build Coastguard Worker	}
489*1fa6dee9SAndroid Build Coastguard Worker
490*1fa6dee9SAndroid Build Coastguard Worker	mockFiles := make(map[string][]byte)
491*1fa6dee9SAndroid Build Coastguard Worker
492*1fa6dee9SAndroid Build Coastguard Worker	for _, f := range files {
493*1fa6dee9SAndroid Build Coastguard Worker		mockFiles[f] = nil
494*1fa6dee9SAndroid Build Coastguard Worker		mockFiles[filepath.Join(pwd, "testdata/glob", f)] = nil
495*1fa6dee9SAndroid Build Coastguard Worker	}
496*1fa6dee9SAndroid Build Coastguard Worker
497*1fa6dee9SAndroid Build Coastguard Worker	mock := MockFs(mockFiles)
498*1fa6dee9SAndroid Build Coastguard Worker
499*1fa6dee9SAndroid Build Coastguard Worker	for _, testCase := range globTestCases {
500*1fa6dee9SAndroid Build Coastguard Worker		t.Run(testCase.pattern, func(t *testing.T) {
501*1fa6dee9SAndroid Build Coastguard Worker			testGlob(t, mock, testCase, FollowSymlinks)
502*1fa6dee9SAndroid Build Coastguard Worker		})
503*1fa6dee9SAndroid Build Coastguard Worker	}
504*1fa6dee9SAndroid Build Coastguard Worker}
505*1fa6dee9SAndroid Build Coastguard Worker
506*1fa6dee9SAndroid Build Coastguard Workerfunc TestGlob(t *testing.T) {
507*1fa6dee9SAndroid Build Coastguard Worker	os.Chdir("testdata/glob")
508*1fa6dee9SAndroid Build Coastguard Worker	defer os.Chdir("../..")
509*1fa6dee9SAndroid Build Coastguard Worker	for _, testCase := range globTestCases {
510*1fa6dee9SAndroid Build Coastguard Worker		t.Run(testCase.pattern, func(t *testing.T) {
511*1fa6dee9SAndroid Build Coastguard Worker			testGlob(t, OsFs, testCase, FollowSymlinks)
512*1fa6dee9SAndroid Build Coastguard Worker		})
513*1fa6dee9SAndroid Build Coastguard Worker	}
514*1fa6dee9SAndroid Build Coastguard Worker}
515*1fa6dee9SAndroid Build Coastguard Worker
516*1fa6dee9SAndroid Build Coastguard Workervar globEscapeTestCases = []globTestCase{
517*1fa6dee9SAndroid Build Coastguard Worker	{
518*1fa6dee9SAndroid Build Coastguard Worker		pattern: `**/*`,
519*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{`*`, `**/`, `?`, `a/`, `b`, `**/*`, `**/a`, `**/b/`, `**/b/b`, `a/a`},
520*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{`.`, `**`, `**/b`, `a`},
521*1fa6dee9SAndroid Build Coastguard Worker	},
522*1fa6dee9SAndroid Build Coastguard Worker	{
523*1fa6dee9SAndroid Build Coastguard Worker		pattern: `**/\*`,
524*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{`*`, `**/*`},
525*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{`.`, `**`, `**/b`, `a`},
526*1fa6dee9SAndroid Build Coastguard Worker	},
527*1fa6dee9SAndroid Build Coastguard Worker	{
528*1fa6dee9SAndroid Build Coastguard Worker		pattern: `\*\*/*`,
529*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{`**/*`, `**/a`, `**/b/`},
530*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{`.`, `**`},
531*1fa6dee9SAndroid Build Coastguard Worker	},
532*1fa6dee9SAndroid Build Coastguard Worker	{
533*1fa6dee9SAndroid Build Coastguard Worker		pattern: `\*\*/**/*`,
534*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{`**/*`, `**/a`, `**/b/`, `**/b/b`},
535*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{`.`, `**`, `**/b`},
536*1fa6dee9SAndroid Build Coastguard Worker	},
537*1fa6dee9SAndroid Build Coastguard Worker}
538*1fa6dee9SAndroid Build Coastguard Worker
539*1fa6dee9SAndroid Build Coastguard Workerfunc TestMockGlobEscapes(t *testing.T) {
540*1fa6dee9SAndroid Build Coastguard Worker	files := []string{
541*1fa6dee9SAndroid Build Coastguard Worker		`*`,
542*1fa6dee9SAndroid Build Coastguard Worker		`**/*`,
543*1fa6dee9SAndroid Build Coastguard Worker		`**/a`,
544*1fa6dee9SAndroid Build Coastguard Worker		`**/b/b`,
545*1fa6dee9SAndroid Build Coastguard Worker		`?`,
546*1fa6dee9SAndroid Build Coastguard Worker		`a/a`,
547*1fa6dee9SAndroid Build Coastguard Worker		`b`,
548*1fa6dee9SAndroid Build Coastguard Worker	}
549*1fa6dee9SAndroid Build Coastguard Worker
550*1fa6dee9SAndroid Build Coastguard Worker	mockFiles := make(map[string][]byte)
551*1fa6dee9SAndroid Build Coastguard Worker
552*1fa6dee9SAndroid Build Coastguard Worker	for _, f := range files {
553*1fa6dee9SAndroid Build Coastguard Worker		mockFiles[f] = nil
554*1fa6dee9SAndroid Build Coastguard Worker	}
555*1fa6dee9SAndroid Build Coastguard Worker
556*1fa6dee9SAndroid Build Coastguard Worker	mock := MockFs(mockFiles)
557*1fa6dee9SAndroid Build Coastguard Worker
558*1fa6dee9SAndroid Build Coastguard Worker	for _, testCase := range globEscapeTestCases {
559*1fa6dee9SAndroid Build Coastguard Worker		t.Run(testCase.pattern, func(t *testing.T) {
560*1fa6dee9SAndroid Build Coastguard Worker			testGlob(t, mock, testCase, FollowSymlinks)
561*1fa6dee9SAndroid Build Coastguard Worker		})
562*1fa6dee9SAndroid Build Coastguard Worker	}
563*1fa6dee9SAndroid Build Coastguard Worker
564*1fa6dee9SAndroid Build Coastguard Worker}
565*1fa6dee9SAndroid Build Coastguard Worker
566*1fa6dee9SAndroid Build Coastguard Workerfunc TestGlobEscapes(t *testing.T) {
567*1fa6dee9SAndroid Build Coastguard Worker	os.Chdir("testdata/escapes")
568*1fa6dee9SAndroid Build Coastguard Worker	defer os.Chdir("../..")
569*1fa6dee9SAndroid Build Coastguard Worker	for _, testCase := range globEscapeTestCases {
570*1fa6dee9SAndroid Build Coastguard Worker		t.Run(testCase.pattern, func(t *testing.T) {
571*1fa6dee9SAndroid Build Coastguard Worker			testGlob(t, OsFs, testCase, FollowSymlinks)
572*1fa6dee9SAndroid Build Coastguard Worker		})
573*1fa6dee9SAndroid Build Coastguard Worker	}
574*1fa6dee9SAndroid Build Coastguard Worker
575*1fa6dee9SAndroid Build Coastguard Worker}
576*1fa6dee9SAndroid Build Coastguard Worker
577*1fa6dee9SAndroid Build Coastguard Workervar globSymlinkTestCases = []globTestCase{
578*1fa6dee9SAndroid Build Coastguard Worker	{
579*1fa6dee9SAndroid Build Coastguard Worker		pattern: `**/*`,
580*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"a/", "b/", "c/", "d/", "e", "a/a/", "a/a/a", "b/a/", "b/a/a", "c/a", "d/a"},
581*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{".", "a", "a/a", "b", "b/a", "c", "d"},
582*1fa6dee9SAndroid Build Coastguard Worker	},
583*1fa6dee9SAndroid Build Coastguard Worker	{
584*1fa6dee9SAndroid Build Coastguard Worker		pattern: `b/**/*`,
585*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"b/a/", "b/a/a"},
586*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"b", "b/a"},
587*1fa6dee9SAndroid Build Coastguard Worker	},
588*1fa6dee9SAndroid Build Coastguard Worker}
589*1fa6dee9SAndroid Build Coastguard Worker
590*1fa6dee9SAndroid Build Coastguard Workerfunc TestMockGlobSymlinks(t *testing.T) {
591*1fa6dee9SAndroid Build Coastguard Worker	files := []string{
592*1fa6dee9SAndroid Build Coastguard Worker		"a/a/a",
593*1fa6dee9SAndroid Build Coastguard Worker		"b -> a",
594*1fa6dee9SAndroid Build Coastguard Worker		"c -> a/a",
595*1fa6dee9SAndroid Build Coastguard Worker		"d -> c",
596*1fa6dee9SAndroid Build Coastguard Worker		"e -> a/a/a",
597*1fa6dee9SAndroid Build Coastguard Worker	}
598*1fa6dee9SAndroid Build Coastguard Worker
599*1fa6dee9SAndroid Build Coastguard Worker	mockFiles := make(map[string][]byte)
600*1fa6dee9SAndroid Build Coastguard Worker
601*1fa6dee9SAndroid Build Coastguard Worker	for _, f := range files {
602*1fa6dee9SAndroid Build Coastguard Worker		mockFiles[f] = nil
603*1fa6dee9SAndroid Build Coastguard Worker	}
604*1fa6dee9SAndroid Build Coastguard Worker
605*1fa6dee9SAndroid Build Coastguard Worker	mock := MockFs(mockFiles)
606*1fa6dee9SAndroid Build Coastguard Worker
607*1fa6dee9SAndroid Build Coastguard Worker	for _, testCase := range globSymlinkTestCases {
608*1fa6dee9SAndroid Build Coastguard Worker		t.Run(testCase.pattern, func(t *testing.T) {
609*1fa6dee9SAndroid Build Coastguard Worker			testGlob(t, mock, testCase, FollowSymlinks)
610*1fa6dee9SAndroid Build Coastguard Worker		})
611*1fa6dee9SAndroid Build Coastguard Worker	}
612*1fa6dee9SAndroid Build Coastguard Worker}
613*1fa6dee9SAndroid Build Coastguard Worker
614*1fa6dee9SAndroid Build Coastguard Workerfunc TestGlobSymlinks(t *testing.T) {
615*1fa6dee9SAndroid Build Coastguard Worker	os.Chdir("testdata/symlinks")
616*1fa6dee9SAndroid Build Coastguard Worker	defer os.Chdir("../..")
617*1fa6dee9SAndroid Build Coastguard Worker
618*1fa6dee9SAndroid Build Coastguard Worker	for _, testCase := range globSymlinkTestCases {
619*1fa6dee9SAndroid Build Coastguard Worker		t.Run(testCase.pattern, func(t *testing.T) {
620*1fa6dee9SAndroid Build Coastguard Worker			testGlob(t, OsFs, testCase, FollowSymlinks)
621*1fa6dee9SAndroid Build Coastguard Worker		})
622*1fa6dee9SAndroid Build Coastguard Worker	}
623*1fa6dee9SAndroid Build Coastguard Worker}
624*1fa6dee9SAndroid Build Coastguard Worker
625*1fa6dee9SAndroid Build Coastguard Workervar globDontFollowSymlinkTestCases = []globTestCase{
626*1fa6dee9SAndroid Build Coastguard Worker	{
627*1fa6dee9SAndroid Build Coastguard Worker		pattern: `**/*`,
628*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"a/", "b", "c", "d", "e", "a/a/", "a/a/a"},
629*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{".", "a", "a/a"},
630*1fa6dee9SAndroid Build Coastguard Worker	},
631*1fa6dee9SAndroid Build Coastguard Worker	{
632*1fa6dee9SAndroid Build Coastguard Worker		pattern: `b/**/*`,
633*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"b/a/", "b/a/a"},
634*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"b", "b/a"},
635*1fa6dee9SAndroid Build Coastguard Worker	},
636*1fa6dee9SAndroid Build Coastguard Worker}
637*1fa6dee9SAndroid Build Coastguard Worker
638*1fa6dee9SAndroid Build Coastguard Workerfunc TestMockGlobDontFollowSymlinks(t *testing.T) {
639*1fa6dee9SAndroid Build Coastguard Worker	files := []string{
640*1fa6dee9SAndroid Build Coastguard Worker		"a/a/a",
641*1fa6dee9SAndroid Build Coastguard Worker		"b -> a",
642*1fa6dee9SAndroid Build Coastguard Worker		"c -> a/a",
643*1fa6dee9SAndroid Build Coastguard Worker		"d -> c",
644*1fa6dee9SAndroid Build Coastguard Worker		"e -> a/a/a",
645*1fa6dee9SAndroid Build Coastguard Worker	}
646*1fa6dee9SAndroid Build Coastguard Worker
647*1fa6dee9SAndroid Build Coastguard Worker	mockFiles := make(map[string][]byte)
648*1fa6dee9SAndroid Build Coastguard Worker
649*1fa6dee9SAndroid Build Coastguard Worker	for _, f := range files {
650*1fa6dee9SAndroid Build Coastguard Worker		mockFiles[f] = nil
651*1fa6dee9SAndroid Build Coastguard Worker	}
652*1fa6dee9SAndroid Build Coastguard Worker
653*1fa6dee9SAndroid Build Coastguard Worker	mock := MockFs(mockFiles)
654*1fa6dee9SAndroid Build Coastguard Worker
655*1fa6dee9SAndroid Build Coastguard Worker	for _, testCase := range globDontFollowSymlinkTestCases {
656*1fa6dee9SAndroid Build Coastguard Worker		t.Run(testCase.pattern, func(t *testing.T) {
657*1fa6dee9SAndroid Build Coastguard Worker			testGlob(t, mock, testCase, DontFollowSymlinks)
658*1fa6dee9SAndroid Build Coastguard Worker		})
659*1fa6dee9SAndroid Build Coastguard Worker	}
660*1fa6dee9SAndroid Build Coastguard Worker}
661*1fa6dee9SAndroid Build Coastguard Worker
662*1fa6dee9SAndroid Build Coastguard Workerfunc TestGlobDontFollowSymlinks(t *testing.T) {
663*1fa6dee9SAndroid Build Coastguard Worker	os.Chdir("testdata/symlinks")
664*1fa6dee9SAndroid Build Coastguard Worker	defer os.Chdir("../..")
665*1fa6dee9SAndroid Build Coastguard Worker
666*1fa6dee9SAndroid Build Coastguard Worker	for _, testCase := range globDontFollowSymlinkTestCases {
667*1fa6dee9SAndroid Build Coastguard Worker		t.Run(testCase.pattern, func(t *testing.T) {
668*1fa6dee9SAndroid Build Coastguard Worker			testGlob(t, OsFs, testCase, DontFollowSymlinks)
669*1fa6dee9SAndroid Build Coastguard Worker		})
670*1fa6dee9SAndroid Build Coastguard Worker	}
671*1fa6dee9SAndroid Build Coastguard Worker}
672*1fa6dee9SAndroid Build Coastguard Worker
673*1fa6dee9SAndroid Build Coastguard Workervar globDontFollowDanglingSymlinkTestCases = []globTestCase{
674*1fa6dee9SAndroid Build Coastguard Worker	{
675*1fa6dee9SAndroid Build Coastguard Worker		pattern: `**/*`,
676*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"a/", "b", "c", "d", "dangling", "e", "f", "a/a/", "a/a/a", "a/a/f"},
677*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{".", "a", "a/a"},
678*1fa6dee9SAndroid Build Coastguard Worker	},
679*1fa6dee9SAndroid Build Coastguard Worker	{
680*1fa6dee9SAndroid Build Coastguard Worker		pattern: `dangling`,
681*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"dangling"},
682*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"dangling"},
683*1fa6dee9SAndroid Build Coastguard Worker	},
684*1fa6dee9SAndroid Build Coastguard Worker}
685*1fa6dee9SAndroid Build Coastguard Worker
686*1fa6dee9SAndroid Build Coastguard Workerfunc TestMockGlobDontFollowDanglingSymlinks(t *testing.T) {
687*1fa6dee9SAndroid Build Coastguard Worker	files := []string{
688*1fa6dee9SAndroid Build Coastguard Worker		"a/a/a",
689*1fa6dee9SAndroid Build Coastguard Worker		"a/a/f -> ../../f",
690*1fa6dee9SAndroid Build Coastguard Worker		"b -> a",
691*1fa6dee9SAndroid Build Coastguard Worker		"c -> a/a",
692*1fa6dee9SAndroid Build Coastguard Worker		"d -> c",
693*1fa6dee9SAndroid Build Coastguard Worker		"e -> a/a/a",
694*1fa6dee9SAndroid Build Coastguard Worker		"f",
695*1fa6dee9SAndroid Build Coastguard Worker		"dangling -> missing",
696*1fa6dee9SAndroid Build Coastguard Worker	}
697*1fa6dee9SAndroid Build Coastguard Worker
698*1fa6dee9SAndroid Build Coastguard Worker	mockFiles := make(map[string][]byte)
699*1fa6dee9SAndroid Build Coastguard Worker
700*1fa6dee9SAndroid Build Coastguard Worker	for _, f := range files {
701*1fa6dee9SAndroid Build Coastguard Worker		mockFiles[f] = nil
702*1fa6dee9SAndroid Build Coastguard Worker	}
703*1fa6dee9SAndroid Build Coastguard Worker
704*1fa6dee9SAndroid Build Coastguard Worker	mock := MockFs(mockFiles)
705*1fa6dee9SAndroid Build Coastguard Worker
706*1fa6dee9SAndroid Build Coastguard Worker	for _, testCase := range globDontFollowDanglingSymlinkTestCases {
707*1fa6dee9SAndroid Build Coastguard Worker		t.Run(testCase.pattern, func(t *testing.T) {
708*1fa6dee9SAndroid Build Coastguard Worker			testGlob(t, mock, testCase, DontFollowSymlinks)
709*1fa6dee9SAndroid Build Coastguard Worker		})
710*1fa6dee9SAndroid Build Coastguard Worker	}
711*1fa6dee9SAndroid Build Coastguard Worker}
712*1fa6dee9SAndroid Build Coastguard Worker
713*1fa6dee9SAndroid Build Coastguard Workerfunc TestGlobDontFollowDanglingSymlinks(t *testing.T) {
714*1fa6dee9SAndroid Build Coastguard Worker	os.Chdir("testdata/dangling")
715*1fa6dee9SAndroid Build Coastguard Worker	defer os.Chdir("../..")
716*1fa6dee9SAndroid Build Coastguard Worker
717*1fa6dee9SAndroid Build Coastguard Worker	for _, testCase := range globDontFollowDanglingSymlinkTestCases {
718*1fa6dee9SAndroid Build Coastguard Worker		t.Run(testCase.pattern, func(t *testing.T) {
719*1fa6dee9SAndroid Build Coastguard Worker			testGlob(t, OsFs, testCase, DontFollowSymlinks)
720*1fa6dee9SAndroid Build Coastguard Worker		})
721*1fa6dee9SAndroid Build Coastguard Worker	}
722*1fa6dee9SAndroid Build Coastguard Worker}
723*1fa6dee9SAndroid Build Coastguard Worker
724*1fa6dee9SAndroid Build Coastguard Workervar globFollowDanglingSymlinkTestCases = []globTestCase{
725*1fa6dee9SAndroid Build Coastguard Worker	{
726*1fa6dee9SAndroid Build Coastguard Worker		pattern: `**/*`,
727*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"a/", "b/", "c/", "d/", "dangling", "e", "f", "a/a/", "a/a/a", "a/a/f", "b/a/", "b/a/a", "b/a/f", "c/a", "c/f", "d/a", "d/f"},
728*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{".", "a", "a/a", "b", "b/a", "c", "d"},
729*1fa6dee9SAndroid Build Coastguard Worker	},
730*1fa6dee9SAndroid Build Coastguard Worker	{
731*1fa6dee9SAndroid Build Coastguard Worker		pattern: `dangling`,
732*1fa6dee9SAndroid Build Coastguard Worker		matches: []string{"dangling"},
733*1fa6dee9SAndroid Build Coastguard Worker		deps:    []string{"dangling"},
734*1fa6dee9SAndroid Build Coastguard Worker	},
735*1fa6dee9SAndroid Build Coastguard Worker}
736*1fa6dee9SAndroid Build Coastguard Worker
737*1fa6dee9SAndroid Build Coastguard Workerfunc TestMockGlobFollowDanglingSymlinks(t *testing.T) {
738*1fa6dee9SAndroid Build Coastguard Worker	files := []string{
739*1fa6dee9SAndroid Build Coastguard Worker		"a/a/a",
740*1fa6dee9SAndroid Build Coastguard Worker		"a/a/f -> ../../f",
741*1fa6dee9SAndroid Build Coastguard Worker		"b -> a",
742*1fa6dee9SAndroid Build Coastguard Worker		"c -> a/a",
743*1fa6dee9SAndroid Build Coastguard Worker		"d -> c",
744*1fa6dee9SAndroid Build Coastguard Worker		"e -> a/a/a",
745*1fa6dee9SAndroid Build Coastguard Worker		"f",
746*1fa6dee9SAndroid Build Coastguard Worker		"dangling -> missing",
747*1fa6dee9SAndroid Build Coastguard Worker	}
748*1fa6dee9SAndroid Build Coastguard Worker
749*1fa6dee9SAndroid Build Coastguard Worker	mockFiles := make(map[string][]byte)
750*1fa6dee9SAndroid Build Coastguard Worker
751*1fa6dee9SAndroid Build Coastguard Worker	for _, f := range files {
752*1fa6dee9SAndroid Build Coastguard Worker		mockFiles[f] = nil
753*1fa6dee9SAndroid Build Coastguard Worker	}
754*1fa6dee9SAndroid Build Coastguard Worker
755*1fa6dee9SAndroid Build Coastguard Worker	mock := MockFs(mockFiles)
756*1fa6dee9SAndroid Build Coastguard Worker
757*1fa6dee9SAndroid Build Coastguard Worker	for _, testCase := range globFollowDanglingSymlinkTestCases {
758*1fa6dee9SAndroid Build Coastguard Worker		t.Run(testCase.pattern, func(t *testing.T) {
759*1fa6dee9SAndroid Build Coastguard Worker			testGlob(t, mock, testCase, FollowSymlinks)
760*1fa6dee9SAndroid Build Coastguard Worker		})
761*1fa6dee9SAndroid Build Coastguard Worker	}
762*1fa6dee9SAndroid Build Coastguard Worker}
763*1fa6dee9SAndroid Build Coastguard Worker
764*1fa6dee9SAndroid Build Coastguard Workerfunc TestGlobFollowDanglingSymlinks(t *testing.T) {
765*1fa6dee9SAndroid Build Coastguard Worker	os.Chdir("testdata/dangling")
766*1fa6dee9SAndroid Build Coastguard Worker	defer os.Chdir("../..")
767*1fa6dee9SAndroid Build Coastguard Worker
768*1fa6dee9SAndroid Build Coastguard Worker	for _, testCase := range globFollowDanglingSymlinkTestCases {
769*1fa6dee9SAndroid Build Coastguard Worker		t.Run(testCase.pattern, func(t *testing.T) {
770*1fa6dee9SAndroid Build Coastguard Worker			testGlob(t, OsFs, testCase, FollowSymlinks)
771*1fa6dee9SAndroid Build Coastguard Worker		})
772*1fa6dee9SAndroid Build Coastguard Worker	}
773*1fa6dee9SAndroid Build Coastguard Worker}
774*1fa6dee9SAndroid Build Coastguard Worker
775*1fa6dee9SAndroid Build Coastguard Workerfunc testGlob(t *testing.T, fs FileSystem, testCase globTestCase, follow ShouldFollowSymlinks) {
776*1fa6dee9SAndroid Build Coastguard Worker	t.Helper()
777*1fa6dee9SAndroid Build Coastguard Worker	result, err := fs.Glob(testCase.pattern, testCase.excludes, follow)
778*1fa6dee9SAndroid Build Coastguard Worker	if err != testCase.err {
779*1fa6dee9SAndroid Build Coastguard Worker		if err == nil {
780*1fa6dee9SAndroid Build Coastguard Worker			t.Fatalf("missing error: %s", testCase.err)
781*1fa6dee9SAndroid Build Coastguard Worker		} else {
782*1fa6dee9SAndroid Build Coastguard Worker			t.Fatalf("error: %s", err)
783*1fa6dee9SAndroid Build Coastguard Worker		}
784*1fa6dee9SAndroid Build Coastguard Worker		return
785*1fa6dee9SAndroid Build Coastguard Worker	}
786*1fa6dee9SAndroid Build Coastguard Worker
787*1fa6dee9SAndroid Build Coastguard Worker	if !reflect.DeepEqual(result.Matches, testCase.matches) {
788*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf("incorrect matches list:")
789*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf(" pattern: %q", testCase.pattern)
790*1fa6dee9SAndroid Build Coastguard Worker		if testCase.excludes != nil {
791*1fa6dee9SAndroid Build Coastguard Worker			t.Errorf("excludes: %q", testCase.excludes)
792*1fa6dee9SAndroid Build Coastguard Worker		}
793*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf("     got: %#v", result.Matches)
794*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf("expected: %#v", testCase.matches)
795*1fa6dee9SAndroid Build Coastguard Worker	}
796*1fa6dee9SAndroid Build Coastguard Worker	if !reflect.DeepEqual(result.Deps, testCase.deps) {
797*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf("incorrect deps list:")
798*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf(" pattern: %q", testCase.pattern)
799*1fa6dee9SAndroid Build Coastguard Worker		if testCase.excludes != nil {
800*1fa6dee9SAndroid Build Coastguard Worker			t.Errorf("excludes: %q", testCase.excludes)
801*1fa6dee9SAndroid Build Coastguard Worker		}
802*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf("     got: %#v", result.Deps)
803*1fa6dee9SAndroid Build Coastguard Worker		t.Errorf("expected: %#v", testCase.deps)
804*1fa6dee9SAndroid Build Coastguard Worker	}
805*1fa6dee9SAndroid Build Coastguard Worker}
806*1fa6dee9SAndroid Build Coastguard Worker
807*1fa6dee9SAndroid Build Coastguard Workerfunc TestMatch(t *testing.T) {
808*1fa6dee9SAndroid Build Coastguard Worker	testCases := []struct {
809*1fa6dee9SAndroid Build Coastguard Worker		pattern, name string
810*1fa6dee9SAndroid Build Coastguard Worker		match         bool
811*1fa6dee9SAndroid Build Coastguard Worker	}{
812*1fa6dee9SAndroid Build Coastguard Worker		{"a/*", "b/", false},
813*1fa6dee9SAndroid Build Coastguard Worker		{"a/*", "b/a", false},
814*1fa6dee9SAndroid Build Coastguard Worker		{"a/*", "b/b/", false},
815*1fa6dee9SAndroid Build Coastguard Worker		{"a/*", "b/b/c", false},
816*1fa6dee9SAndroid Build Coastguard Worker		{"a/**/*", "b/", false},
817*1fa6dee9SAndroid Build Coastguard Worker		{"a/**/*", "b/a", false},
818*1fa6dee9SAndroid Build Coastguard Worker		{"a/**/*", "b/b/", false},
819*1fa6dee9SAndroid Build Coastguard Worker		{"a/**/*", "b/b/c", false},
820*1fa6dee9SAndroid Build Coastguard Worker
821*1fa6dee9SAndroid Build Coastguard Worker		{"a/*", "a/", false},
822*1fa6dee9SAndroid Build Coastguard Worker		{"a/*", "a/a", true},
823*1fa6dee9SAndroid Build Coastguard Worker		{"a/*", "a/b/", false},
824*1fa6dee9SAndroid Build Coastguard Worker		{"a/*", "a/b/c", false},
825*1fa6dee9SAndroid Build Coastguard Worker
826*1fa6dee9SAndroid Build Coastguard Worker		{"a/*/", "a/", false},
827*1fa6dee9SAndroid Build Coastguard Worker		{"a/*/", "a/a", false},
828*1fa6dee9SAndroid Build Coastguard Worker		{"a/*/", "a/b/", true},
829*1fa6dee9SAndroid Build Coastguard Worker		{"a/*/", "a/b/c", false},
830*1fa6dee9SAndroid Build Coastguard Worker
831*1fa6dee9SAndroid Build Coastguard Worker		{"a/**/*", "a/", false},
832*1fa6dee9SAndroid Build Coastguard Worker		{"a/**/*", "a/a", true},
833*1fa6dee9SAndroid Build Coastguard Worker		{"a/**/*", "a/b/", false},
834*1fa6dee9SAndroid Build Coastguard Worker		{"a/**/*", "a/b/c", true},
835*1fa6dee9SAndroid Build Coastguard Worker
836*1fa6dee9SAndroid Build Coastguard Worker		{"a/**/*/", "a/", false},
837*1fa6dee9SAndroid Build Coastguard Worker		{"a/**/*/", "a/a", false},
838*1fa6dee9SAndroid Build Coastguard Worker		{"a/**/*/", "a/b/", true},
839*1fa6dee9SAndroid Build Coastguard Worker		{"a/**/*/", "a/b/c", false},
840*1fa6dee9SAndroid Build Coastguard Worker
841*1fa6dee9SAndroid Build Coastguard Worker		{"**/*", "a/", false},
842*1fa6dee9SAndroid Build Coastguard Worker		{"**/*", "a/a", true},
843*1fa6dee9SAndroid Build Coastguard Worker		{"**/*", "a/b/", false},
844*1fa6dee9SAndroid Build Coastguard Worker		{"**/*", "a/b/c", true},
845*1fa6dee9SAndroid Build Coastguard Worker
846*1fa6dee9SAndroid Build Coastguard Worker		{"**/*/", "a/", true},
847*1fa6dee9SAndroid Build Coastguard Worker		{"**/*/", "a/a", false},
848*1fa6dee9SAndroid Build Coastguard Worker		{"**/*/", "a/b/", true},
849*1fa6dee9SAndroid Build Coastguard Worker		{"**/*/", "a/b/c", false},
850*1fa6dee9SAndroid Build Coastguard Worker
851*1fa6dee9SAndroid Build Coastguard Worker		{`a/\*\*/\*`, `a/**/*`, true},
852*1fa6dee9SAndroid Build Coastguard Worker		{`a/\*\*/\*`, `a/a/*`, false},
853*1fa6dee9SAndroid Build Coastguard Worker		{`a/\*\*/\*`, `a/**/a`, false},
854*1fa6dee9SAndroid Build Coastguard Worker		{`a/\*\*/\*`, `a/a/a`, false},
855*1fa6dee9SAndroid Build Coastguard Worker
856*1fa6dee9SAndroid Build Coastguard Worker		{`a/**/\*`, `a/**/*`, true},
857*1fa6dee9SAndroid Build Coastguard Worker		{`a/**/\*`, `a/a/*`, true},
858*1fa6dee9SAndroid Build Coastguard Worker		{`a/**/\*`, `a/**/a`, false},
859*1fa6dee9SAndroid Build Coastguard Worker		{`a/**/\*`, `a/a/a`, false},
860*1fa6dee9SAndroid Build Coastguard Worker
861*1fa6dee9SAndroid Build Coastguard Worker		{`a/\*\*/*`, `a/**/*`, true},
862*1fa6dee9SAndroid Build Coastguard Worker		{`a/\*\*/*`, `a/a/*`, false},
863*1fa6dee9SAndroid Build Coastguard Worker		{`a/\*\*/*`, `a/**/a`, true},
864*1fa6dee9SAndroid Build Coastguard Worker		{`a/\*\*/*`, `a/a/a`, false},
865*1fa6dee9SAndroid Build Coastguard Worker
866*1fa6dee9SAndroid Build Coastguard Worker		{`*/**/a`, `a/a/a`, true},
867*1fa6dee9SAndroid Build Coastguard Worker		{`*/**/a`, `*/a/a`, true},
868*1fa6dee9SAndroid Build Coastguard Worker		{`*/**/a`, `a/**/a`, true},
869*1fa6dee9SAndroid Build Coastguard Worker		{`*/**/a`, `*/**/a`, true},
870*1fa6dee9SAndroid Build Coastguard Worker
871*1fa6dee9SAndroid Build Coastguard Worker		{`\*/\*\*/a`, `a/a/a`, false},
872*1fa6dee9SAndroid Build Coastguard Worker		{`\*/\*\*/a`, `*/a/a`, false},
873*1fa6dee9SAndroid Build Coastguard Worker		{`\*/\*\*/a`, `a/**/a`, false},
874*1fa6dee9SAndroid Build Coastguard Worker		{`\*/\*\*/a`, `*/**/a`, true},
875*1fa6dee9SAndroid Build Coastguard Worker
876*1fa6dee9SAndroid Build Coastguard Worker		{`a/?`, `a/?`, true},
877*1fa6dee9SAndroid Build Coastguard Worker		{`a/?`, `a/a`, true},
878*1fa6dee9SAndroid Build Coastguard Worker		{`a/\?`, `a/?`, true},
879*1fa6dee9SAndroid Build Coastguard Worker		{`a/\?`, `a/a`, false},
880*1fa6dee9SAndroid Build Coastguard Worker
881*1fa6dee9SAndroid Build Coastguard Worker		{`a/?`, `a/?`, true},
882*1fa6dee9SAndroid Build Coastguard Worker		{`a/?`, `a/a`, true},
883*1fa6dee9SAndroid Build Coastguard Worker		{`a/\?`, `a/?`, true},
884*1fa6dee9SAndroid Build Coastguard Worker		{`a/\?`, `a/a`, false},
885*1fa6dee9SAndroid Build Coastguard Worker
886*1fa6dee9SAndroid Build Coastguard Worker		{`a/[a-c]`, `a/b`, true},
887*1fa6dee9SAndroid Build Coastguard Worker		{`a/[abc]`, `a/b`, true},
888*1fa6dee9SAndroid Build Coastguard Worker
889*1fa6dee9SAndroid Build Coastguard Worker		{`a/\[abc]`, `a/b`, false},
890*1fa6dee9SAndroid Build Coastguard Worker		{`a/\[abc]`, `a/[abc]`, true},
891*1fa6dee9SAndroid Build Coastguard Worker
892*1fa6dee9SAndroid Build Coastguard Worker		{`a/\[abc\]`, `a/b`, false},
893*1fa6dee9SAndroid Build Coastguard Worker		{`a/\[abc\]`, `a/[abc]`, true},
894*1fa6dee9SAndroid Build Coastguard Worker
895*1fa6dee9SAndroid Build Coastguard Worker		{`a/?`, `a/?`, true},
896*1fa6dee9SAndroid Build Coastguard Worker		{`a/?`, `a/a`, true},
897*1fa6dee9SAndroid Build Coastguard Worker		{`a/\?`, `a/?`, true},
898*1fa6dee9SAndroid Build Coastguard Worker		{`a/\?`, `a/a`, false},
899*1fa6dee9SAndroid Build Coastguard Worker
900*1fa6dee9SAndroid Build Coastguard Worker		{"/a/*", "/a/", false},
901*1fa6dee9SAndroid Build Coastguard Worker		{"/a/*", "/a/a", true},
902*1fa6dee9SAndroid Build Coastguard Worker		{"/a/*", "/a/b/", false},
903*1fa6dee9SAndroid Build Coastguard Worker		{"/a/*", "/a/b/c", false},
904*1fa6dee9SAndroid Build Coastguard Worker
905*1fa6dee9SAndroid Build Coastguard Worker		{"/a/*/", "/a/", false},
906*1fa6dee9SAndroid Build Coastguard Worker		{"/a/*/", "/a/a", false},
907*1fa6dee9SAndroid Build Coastguard Worker		{"/a/*/", "/a/b/", true},
908*1fa6dee9SAndroid Build Coastguard Worker		{"/a/*/", "/a/b/c", false},
909*1fa6dee9SAndroid Build Coastguard Worker
910*1fa6dee9SAndroid Build Coastguard Worker		{"/a/**/*", "/a/", false},
911*1fa6dee9SAndroid Build Coastguard Worker		{"/a/**/*", "/a/a", true},
912*1fa6dee9SAndroid Build Coastguard Worker		{"/a/**/*", "/a/b/", false},
913*1fa6dee9SAndroid Build Coastguard Worker		{"/a/**/*", "/a/b/c", true},
914*1fa6dee9SAndroid Build Coastguard Worker
915*1fa6dee9SAndroid Build Coastguard Worker		{"/**/*", "/a/", false},
916*1fa6dee9SAndroid Build Coastguard Worker		{"/**/*", "/a/a", true},
917*1fa6dee9SAndroid Build Coastguard Worker		{"/**/*", "/a/b/", false},
918*1fa6dee9SAndroid Build Coastguard Worker		{"/**/*", "/a/b/c", true},
919*1fa6dee9SAndroid Build Coastguard Worker
920*1fa6dee9SAndroid Build Coastguard Worker		{"/**/*/", "/a/", true},
921*1fa6dee9SAndroid Build Coastguard Worker		{"/**/*/", "/a/a", false},
922*1fa6dee9SAndroid Build Coastguard Worker		{"/**/*/", "/a/b/", true},
923*1fa6dee9SAndroid Build Coastguard Worker		{"/**/*/", "/a/b/c", false},
924*1fa6dee9SAndroid Build Coastguard Worker
925*1fa6dee9SAndroid Build Coastguard Worker		{`a`, `/a`, false},
926*1fa6dee9SAndroid Build Coastguard Worker		{`/a`, `a`, false},
927*1fa6dee9SAndroid Build Coastguard Worker		{`*`, `/a`, false},
928*1fa6dee9SAndroid Build Coastguard Worker		{`/*`, `a`, false},
929*1fa6dee9SAndroid Build Coastguard Worker		{`**/*`, `/a`, false},
930*1fa6dee9SAndroid Build Coastguard Worker		{`/**/*`, `a`, false},
931*1fa6dee9SAndroid Build Coastguard Worker	}
932*1fa6dee9SAndroid Build Coastguard Worker
933*1fa6dee9SAndroid Build Coastguard Worker	for _, test := range testCases {
934*1fa6dee9SAndroid Build Coastguard Worker		t.Run(test.pattern+","+test.name, func(t *testing.T) {
935*1fa6dee9SAndroid Build Coastguard Worker			match, err := Match(test.pattern, test.name)
936*1fa6dee9SAndroid Build Coastguard Worker			if err != nil {
937*1fa6dee9SAndroid Build Coastguard Worker				t.Fatal(err)
938*1fa6dee9SAndroid Build Coastguard Worker			}
939*1fa6dee9SAndroid Build Coastguard Worker			if match != test.match {
940*1fa6dee9SAndroid Build Coastguard Worker				t.Errorf("want: %v, got %v", test.match, match)
941*1fa6dee9SAndroid Build Coastguard Worker			}
942*1fa6dee9SAndroid Build Coastguard Worker		})
943*1fa6dee9SAndroid Build Coastguard Worker	}
944*1fa6dee9SAndroid Build Coastguard Worker
945*1fa6dee9SAndroid Build Coastguard Worker	// Run the same test cases through Glob
946*1fa6dee9SAndroid Build Coastguard Worker	for _, test := range testCases {
947*1fa6dee9SAndroid Build Coastguard Worker		// Glob and Match disagree on matching directories
948*1fa6dee9SAndroid Build Coastguard Worker		if strings.HasSuffix(test.name, "/") || strings.HasSuffix(test.pattern, "/") {
949*1fa6dee9SAndroid Build Coastguard Worker			continue
950*1fa6dee9SAndroid Build Coastguard Worker		}
951*1fa6dee9SAndroid Build Coastguard Worker		t.Run("glob:"+test.pattern+","+test.name, func(t *testing.T) {
952*1fa6dee9SAndroid Build Coastguard Worker			mockFiles := map[string][]byte{
953*1fa6dee9SAndroid Build Coastguard Worker				test.name: nil,
954*1fa6dee9SAndroid Build Coastguard Worker			}
955*1fa6dee9SAndroid Build Coastguard Worker
956*1fa6dee9SAndroid Build Coastguard Worker			mock := MockFs(mockFiles)
957*1fa6dee9SAndroid Build Coastguard Worker
958*1fa6dee9SAndroid Build Coastguard Worker			result, err := mock.Glob(test.pattern, nil, DontFollowSymlinks)
959*1fa6dee9SAndroid Build Coastguard Worker			t.Log(test.name, test.pattern, result.Matches)
960*1fa6dee9SAndroid Build Coastguard Worker			if err != nil {
961*1fa6dee9SAndroid Build Coastguard Worker				t.Fatal(err)
962*1fa6dee9SAndroid Build Coastguard Worker			}
963*1fa6dee9SAndroid Build Coastguard Worker
964*1fa6dee9SAndroid Build Coastguard Worker			match := false
965*1fa6dee9SAndroid Build Coastguard Worker			for _, x := range result.Matches {
966*1fa6dee9SAndroid Build Coastguard Worker				if x == test.name {
967*1fa6dee9SAndroid Build Coastguard Worker					match = true
968*1fa6dee9SAndroid Build Coastguard Worker				}
969*1fa6dee9SAndroid Build Coastguard Worker			}
970*1fa6dee9SAndroid Build Coastguard Worker
971*1fa6dee9SAndroid Build Coastguard Worker			if match != test.match {
972*1fa6dee9SAndroid Build Coastguard Worker				t.Errorf("want: %v, got %v", test.match, match)
973*1fa6dee9SAndroid Build Coastguard Worker			}
974*1fa6dee9SAndroid Build Coastguard Worker		})
975*1fa6dee9SAndroid Build Coastguard Worker	}
976*1fa6dee9SAndroid Build Coastguard Worker}
977