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