1*1fa6dee9SAndroid Build Coastguard Worker// Copyright 2018 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 "slices" 22*1fa6dee9SAndroid Build Coastguard Worker "syscall" 23*1fa6dee9SAndroid Build Coastguard Worker "testing" 24*1fa6dee9SAndroid Build Coastguard Worker) 25*1fa6dee9SAndroid Build Coastguard Worker 26*1fa6dee9SAndroid Build Coastguard Workerconst testdataDir = "testdata/dangling" 27*1fa6dee9SAndroid Build Coastguard Worker 28*1fa6dee9SAndroid Build Coastguard Workerfunc symlinkMockFs() *mockFs { 29*1fa6dee9SAndroid Build Coastguard Worker files := []string{ 30*1fa6dee9SAndroid Build Coastguard Worker "a/a/a", 31*1fa6dee9SAndroid Build Coastguard Worker "a/a/f -> ../../f", 32*1fa6dee9SAndroid Build Coastguard Worker "b -> a", 33*1fa6dee9SAndroid Build Coastguard Worker "c -> a/a", 34*1fa6dee9SAndroid Build Coastguard Worker "d -> c", 35*1fa6dee9SAndroid Build Coastguard Worker "e -> a/a/a", 36*1fa6dee9SAndroid Build Coastguard Worker "dangling -> missing", 37*1fa6dee9SAndroid Build Coastguard Worker "f", 38*1fa6dee9SAndroid Build Coastguard Worker } 39*1fa6dee9SAndroid Build Coastguard Worker 40*1fa6dee9SAndroid Build Coastguard Worker mockFiles := make(map[string][]byte) 41*1fa6dee9SAndroid Build Coastguard Worker 42*1fa6dee9SAndroid Build Coastguard Worker for _, f := range files { 43*1fa6dee9SAndroid Build Coastguard Worker mockFiles[f] = nil 44*1fa6dee9SAndroid Build Coastguard Worker mockFiles[filepath.Join(pwd, "testdata", f)] = nil 45*1fa6dee9SAndroid Build Coastguard Worker } 46*1fa6dee9SAndroid Build Coastguard Worker 47*1fa6dee9SAndroid Build Coastguard Worker return MockFs(mockFiles).(*mockFs) 48*1fa6dee9SAndroid Build Coastguard Worker} 49*1fa6dee9SAndroid Build Coastguard Worker 50*1fa6dee9SAndroid Build Coastguard Workerfunc TestMockFs_followSymlinks(t *testing.T) { 51*1fa6dee9SAndroid Build Coastguard Worker 52*1fa6dee9SAndroid Build Coastguard Worker testCases := []struct { 53*1fa6dee9SAndroid Build Coastguard Worker from, to string 54*1fa6dee9SAndroid Build Coastguard Worker }{ 55*1fa6dee9SAndroid Build Coastguard Worker {".", "."}, 56*1fa6dee9SAndroid Build Coastguard Worker {"/", "/"}, 57*1fa6dee9SAndroid Build Coastguard Worker 58*1fa6dee9SAndroid Build Coastguard Worker {"a", "a"}, 59*1fa6dee9SAndroid Build Coastguard Worker {"a/a", "a/a"}, 60*1fa6dee9SAndroid Build Coastguard Worker {"a/a/a", "a/a/a"}, 61*1fa6dee9SAndroid Build Coastguard Worker {"a/a/f", "f"}, 62*1fa6dee9SAndroid Build Coastguard Worker 63*1fa6dee9SAndroid Build Coastguard Worker {"b", "a"}, 64*1fa6dee9SAndroid Build Coastguard Worker {"b/a", "a/a"}, 65*1fa6dee9SAndroid Build Coastguard Worker {"b/a/a", "a/a/a"}, 66*1fa6dee9SAndroid Build Coastguard Worker {"b/a/f", "f"}, 67*1fa6dee9SAndroid Build Coastguard Worker 68*1fa6dee9SAndroid Build Coastguard Worker {"c/a", "a/a/a"}, 69*1fa6dee9SAndroid Build Coastguard Worker {"c/f", "f"}, 70*1fa6dee9SAndroid Build Coastguard Worker 71*1fa6dee9SAndroid Build Coastguard Worker {"d/a", "a/a/a"}, 72*1fa6dee9SAndroid Build Coastguard Worker {"d/f", "f"}, 73*1fa6dee9SAndroid Build Coastguard Worker 74*1fa6dee9SAndroid Build Coastguard Worker {"e", "a/a/a"}, 75*1fa6dee9SAndroid Build Coastguard Worker 76*1fa6dee9SAndroid Build Coastguard Worker {"f", "f"}, 77*1fa6dee9SAndroid Build Coastguard Worker 78*1fa6dee9SAndroid Build Coastguard Worker {"dangling", "missing"}, 79*1fa6dee9SAndroid Build Coastguard Worker 80*1fa6dee9SAndroid Build Coastguard Worker {"a/missing", "a/missing"}, 81*1fa6dee9SAndroid Build Coastguard Worker {"b/missing", "a/missing"}, 82*1fa6dee9SAndroid Build Coastguard Worker {"c/missing", "a/a/missing"}, 83*1fa6dee9SAndroid Build Coastguard Worker {"d/missing", "a/a/missing"}, 84*1fa6dee9SAndroid Build Coastguard Worker {"e/missing", "a/a/a/missing"}, 85*1fa6dee9SAndroid Build Coastguard Worker {"dangling/missing", "missing/missing"}, 86*1fa6dee9SAndroid Build Coastguard Worker 87*1fa6dee9SAndroid Build Coastguard Worker {"a/missing/missing", "a/missing/missing"}, 88*1fa6dee9SAndroid Build Coastguard Worker {"b/missing/missing", "a/missing/missing"}, 89*1fa6dee9SAndroid Build Coastguard Worker {"c/missing/missing", "a/a/missing/missing"}, 90*1fa6dee9SAndroid Build Coastguard Worker {"d/missing/missing", "a/a/missing/missing"}, 91*1fa6dee9SAndroid Build Coastguard Worker {"e/missing/missing", "a/a/a/missing/missing"}, 92*1fa6dee9SAndroid Build Coastguard Worker {"dangling/missing/missing", "missing/missing/missing"}, 93*1fa6dee9SAndroid Build Coastguard Worker } 94*1fa6dee9SAndroid Build Coastguard Worker 95*1fa6dee9SAndroid Build Coastguard Worker mock := symlinkMockFs() 96*1fa6dee9SAndroid Build Coastguard Worker 97*1fa6dee9SAndroid Build Coastguard Worker for _, test := range testCases { 98*1fa6dee9SAndroid Build Coastguard Worker t.Run(test.from, func(t *testing.T) { 99*1fa6dee9SAndroid Build Coastguard Worker got := mock.followSymlinks(test.from) 100*1fa6dee9SAndroid Build Coastguard Worker if got != test.to { 101*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("want: %v, got %v", test.to, got) 102*1fa6dee9SAndroid Build Coastguard Worker } 103*1fa6dee9SAndroid Build Coastguard Worker }) 104*1fa6dee9SAndroid Build Coastguard Worker } 105*1fa6dee9SAndroid Build Coastguard Worker} 106*1fa6dee9SAndroid Build Coastguard Worker 107*1fa6dee9SAndroid Build Coastguard Workerfunc runTestFs(t *testing.T, f func(t *testing.T, fs FileSystem, dir string)) { 108*1fa6dee9SAndroid Build Coastguard Worker mock := symlinkMockFs() 109*1fa6dee9SAndroid Build Coastguard Worker wd, _ := os.Getwd() 110*1fa6dee9SAndroid Build Coastguard Worker absTestDataDir := filepath.Join(wd, testdataDir) 111*1fa6dee9SAndroid Build Coastguard Worker 112*1fa6dee9SAndroid Build Coastguard Worker run := func(t *testing.T, fs FileSystem) { 113*1fa6dee9SAndroid Build Coastguard Worker t.Run("relpath", func(t *testing.T) { 114*1fa6dee9SAndroid Build Coastguard Worker f(t, fs, "") 115*1fa6dee9SAndroid Build Coastguard Worker }) 116*1fa6dee9SAndroid Build Coastguard Worker t.Run("abspath", func(t *testing.T) { 117*1fa6dee9SAndroid Build Coastguard Worker f(t, fs, absTestDataDir) 118*1fa6dee9SAndroid Build Coastguard Worker }) 119*1fa6dee9SAndroid Build Coastguard Worker } 120*1fa6dee9SAndroid Build Coastguard Worker 121*1fa6dee9SAndroid Build Coastguard Worker t.Run("mock", func(t *testing.T) { 122*1fa6dee9SAndroid Build Coastguard Worker f(t, mock, "") 123*1fa6dee9SAndroid Build Coastguard Worker }) 124*1fa6dee9SAndroid Build Coastguard Worker 125*1fa6dee9SAndroid Build Coastguard Worker t.Run("os", func(t *testing.T) { 126*1fa6dee9SAndroid Build Coastguard Worker os.Chdir(absTestDataDir) 127*1fa6dee9SAndroid Build Coastguard Worker defer os.Chdir(wd) 128*1fa6dee9SAndroid Build Coastguard Worker run(t, OsFs) 129*1fa6dee9SAndroid Build Coastguard Worker }) 130*1fa6dee9SAndroid Build Coastguard Worker 131*1fa6dee9SAndroid Build Coastguard Worker t.Run("os relative srcDir", func(t *testing.T) { 132*1fa6dee9SAndroid Build Coastguard Worker run(t, NewOsFs(testdataDir)) 133*1fa6dee9SAndroid Build Coastguard Worker }) 134*1fa6dee9SAndroid Build Coastguard Worker 135*1fa6dee9SAndroid Build Coastguard Worker t.Run("os absolute srcDir", func(t *testing.T) { 136*1fa6dee9SAndroid Build Coastguard Worker os.Chdir("/") 137*1fa6dee9SAndroid Build Coastguard Worker defer os.Chdir(wd) 138*1fa6dee9SAndroid Build Coastguard Worker run(t, NewOsFs(filepath.Join(wd, testdataDir))) 139*1fa6dee9SAndroid Build Coastguard Worker }) 140*1fa6dee9SAndroid Build Coastguard Worker 141*1fa6dee9SAndroid Build Coastguard Worker} 142*1fa6dee9SAndroid Build Coastguard Worker 143*1fa6dee9SAndroid Build Coastguard Workerfunc TestFs_IsDir(t *testing.T) { 144*1fa6dee9SAndroid Build Coastguard Worker testCases := []struct { 145*1fa6dee9SAndroid Build Coastguard Worker name string 146*1fa6dee9SAndroid Build Coastguard Worker isDir bool 147*1fa6dee9SAndroid Build Coastguard Worker err error 148*1fa6dee9SAndroid Build Coastguard Worker }{ 149*1fa6dee9SAndroid Build Coastguard Worker {"a", true, nil}, 150*1fa6dee9SAndroid Build Coastguard Worker {"a/a", true, nil}, 151*1fa6dee9SAndroid Build Coastguard Worker {"a/a/a", false, nil}, 152*1fa6dee9SAndroid Build Coastguard Worker {"a/a/f", false, nil}, 153*1fa6dee9SAndroid Build Coastguard Worker 154*1fa6dee9SAndroid Build Coastguard Worker {"b", true, nil}, 155*1fa6dee9SAndroid Build Coastguard Worker {"b/a", true, nil}, 156*1fa6dee9SAndroid Build Coastguard Worker {"b/a/a", false, nil}, 157*1fa6dee9SAndroid Build Coastguard Worker {"b/a/f", false, nil}, 158*1fa6dee9SAndroid Build Coastguard Worker 159*1fa6dee9SAndroid Build Coastguard Worker {"c", true, nil}, 160*1fa6dee9SAndroid Build Coastguard Worker {"c/a", false, nil}, 161*1fa6dee9SAndroid Build Coastguard Worker {"c/f", false, nil}, 162*1fa6dee9SAndroid Build Coastguard Worker 163*1fa6dee9SAndroid Build Coastguard Worker {"d", true, nil}, 164*1fa6dee9SAndroid Build Coastguard Worker {"d/a", false, nil}, 165*1fa6dee9SAndroid Build Coastguard Worker {"d/f", false, nil}, 166*1fa6dee9SAndroid Build Coastguard Worker 167*1fa6dee9SAndroid Build Coastguard Worker {"e", false, nil}, 168*1fa6dee9SAndroid Build Coastguard Worker 169*1fa6dee9SAndroid Build Coastguard Worker {"f", false, nil}, 170*1fa6dee9SAndroid Build Coastguard Worker 171*1fa6dee9SAndroid Build Coastguard Worker {"dangling", false, os.ErrNotExist}, 172*1fa6dee9SAndroid Build Coastguard Worker 173*1fa6dee9SAndroid Build Coastguard Worker {"a/missing", false, os.ErrNotExist}, 174*1fa6dee9SAndroid Build Coastguard Worker {"b/missing", false, os.ErrNotExist}, 175*1fa6dee9SAndroid Build Coastguard Worker {"c/missing", false, os.ErrNotExist}, 176*1fa6dee9SAndroid Build Coastguard Worker {"d/missing", false, os.ErrNotExist}, 177*1fa6dee9SAndroid Build Coastguard Worker {"e/missing", false, syscall.ENOTDIR}, 178*1fa6dee9SAndroid Build Coastguard Worker {"dangling/missing", false, os.ErrNotExist}, 179*1fa6dee9SAndroid Build Coastguard Worker 180*1fa6dee9SAndroid Build Coastguard Worker {"a/missing/missing", false, os.ErrNotExist}, 181*1fa6dee9SAndroid Build Coastguard Worker {"b/missing/missing", false, os.ErrNotExist}, 182*1fa6dee9SAndroid Build Coastguard Worker {"c/missing/missing", false, os.ErrNotExist}, 183*1fa6dee9SAndroid Build Coastguard Worker {"d/missing/missing", false, os.ErrNotExist}, 184*1fa6dee9SAndroid Build Coastguard Worker {"e/missing/missing", false, syscall.ENOTDIR}, 185*1fa6dee9SAndroid Build Coastguard Worker {"dangling/missing/missing", false, os.ErrNotExist}, 186*1fa6dee9SAndroid Build Coastguard Worker 187*1fa6dee9SAndroid Build Coastguard Worker {"c/f/missing", false, syscall.ENOTDIR}, 188*1fa6dee9SAndroid Build Coastguard Worker } 189*1fa6dee9SAndroid Build Coastguard Worker 190*1fa6dee9SAndroid Build Coastguard Worker runTestFs(t, func(t *testing.T, fs FileSystem, dir string) { 191*1fa6dee9SAndroid Build Coastguard Worker for _, test := range testCases { 192*1fa6dee9SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 193*1fa6dee9SAndroid Build Coastguard Worker got, err := fs.IsDir(filepath.Join(dir, test.name)) 194*1fa6dee9SAndroid Build Coastguard Worker checkErr(t, test.err, err) 195*1fa6dee9SAndroid Build Coastguard Worker if got != test.isDir { 196*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("want: %v, got %v", test.isDir, got) 197*1fa6dee9SAndroid Build Coastguard Worker } 198*1fa6dee9SAndroid Build Coastguard Worker }) 199*1fa6dee9SAndroid Build Coastguard Worker } 200*1fa6dee9SAndroid Build Coastguard Worker }) 201*1fa6dee9SAndroid Build Coastguard Worker} 202*1fa6dee9SAndroid Build Coastguard Worker 203*1fa6dee9SAndroid Build Coastguard Workerfunc TestFs_ListDirsRecursiveFollowSymlinks(t *testing.T) { 204*1fa6dee9SAndroid Build Coastguard Worker testCases := []struct { 205*1fa6dee9SAndroid Build Coastguard Worker name string 206*1fa6dee9SAndroid Build Coastguard Worker dirs []string 207*1fa6dee9SAndroid Build Coastguard Worker err error 208*1fa6dee9SAndroid Build Coastguard Worker }{ 209*1fa6dee9SAndroid Build Coastguard Worker {".", []string{".", "a", "a/a", "b", "b/a", "c", "d"}, nil}, 210*1fa6dee9SAndroid Build Coastguard Worker 211*1fa6dee9SAndroid Build Coastguard Worker {"a", []string{"a", "a/a"}, nil}, 212*1fa6dee9SAndroid Build Coastguard Worker {"a/a", []string{"a/a"}, nil}, 213*1fa6dee9SAndroid Build Coastguard Worker {"a/a/a", nil, nil}, 214*1fa6dee9SAndroid Build Coastguard Worker 215*1fa6dee9SAndroid Build Coastguard Worker {"b", []string{"b", "b/a"}, nil}, 216*1fa6dee9SAndroid Build Coastguard Worker {"b/a", []string{"b/a"}, nil}, 217*1fa6dee9SAndroid Build Coastguard Worker {"b/a/a", nil, nil}, 218*1fa6dee9SAndroid Build Coastguard Worker 219*1fa6dee9SAndroid Build Coastguard Worker {"c", []string{"c"}, nil}, 220*1fa6dee9SAndroid Build Coastguard Worker {"c/a", nil, nil}, 221*1fa6dee9SAndroid Build Coastguard Worker 222*1fa6dee9SAndroid Build Coastguard Worker {"d", []string{"d"}, nil}, 223*1fa6dee9SAndroid Build Coastguard Worker {"d/a", nil, nil}, 224*1fa6dee9SAndroid Build Coastguard Worker 225*1fa6dee9SAndroid Build Coastguard Worker {"e", nil, nil}, 226*1fa6dee9SAndroid Build Coastguard Worker 227*1fa6dee9SAndroid Build Coastguard Worker {"dangling", nil, os.ErrNotExist}, 228*1fa6dee9SAndroid Build Coastguard Worker 229*1fa6dee9SAndroid Build Coastguard Worker {"missing", nil, os.ErrNotExist}, 230*1fa6dee9SAndroid Build Coastguard Worker } 231*1fa6dee9SAndroid Build Coastguard Worker 232*1fa6dee9SAndroid Build Coastguard Worker runTestFs(t, func(t *testing.T, fs FileSystem, dir string) { 233*1fa6dee9SAndroid Build Coastguard Worker for _, test := range testCases { 234*1fa6dee9SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 235*1fa6dee9SAndroid Build Coastguard Worker got, err := fs.ListDirsRecursive(filepath.Join(dir, test.name), FollowSymlinks) 236*1fa6dee9SAndroid Build Coastguard Worker checkErr(t, test.err, err) 237*1fa6dee9SAndroid Build Coastguard Worker want := slices.Clone(test.dirs) 238*1fa6dee9SAndroid Build Coastguard Worker for i := range want { 239*1fa6dee9SAndroid Build Coastguard Worker want[i] = filepath.Join(dir, want[i]) 240*1fa6dee9SAndroid Build Coastguard Worker } 241*1fa6dee9SAndroid Build Coastguard Worker if !reflect.DeepEqual(got, want) { 242*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("want: %v, got %v", want, got) 243*1fa6dee9SAndroid Build Coastguard Worker } 244*1fa6dee9SAndroid Build Coastguard Worker }) 245*1fa6dee9SAndroid Build Coastguard Worker } 246*1fa6dee9SAndroid Build Coastguard Worker }) 247*1fa6dee9SAndroid Build Coastguard Worker} 248*1fa6dee9SAndroid Build Coastguard Worker 249*1fa6dee9SAndroid Build Coastguard Workerfunc TestFs_ListDirsRecursiveDontFollowSymlinks(t *testing.T) { 250*1fa6dee9SAndroid Build Coastguard Worker testCases := []struct { 251*1fa6dee9SAndroid Build Coastguard Worker name string 252*1fa6dee9SAndroid Build Coastguard Worker dirs []string 253*1fa6dee9SAndroid Build Coastguard Worker err error 254*1fa6dee9SAndroid Build Coastguard Worker }{ 255*1fa6dee9SAndroid Build Coastguard Worker {".", []string{".", "a", "a/a"}, nil}, 256*1fa6dee9SAndroid Build Coastguard Worker 257*1fa6dee9SAndroid Build Coastguard Worker {"a", []string{"a", "a/a"}, nil}, 258*1fa6dee9SAndroid Build Coastguard Worker {"a/a", []string{"a/a"}, nil}, 259*1fa6dee9SAndroid Build Coastguard Worker {"a/a/a", nil, nil}, 260*1fa6dee9SAndroid Build Coastguard Worker 261*1fa6dee9SAndroid Build Coastguard Worker {"b", []string{"b", "b/a"}, nil}, 262*1fa6dee9SAndroid Build Coastguard Worker {"b/a", []string{"b/a"}, nil}, 263*1fa6dee9SAndroid Build Coastguard Worker {"b/a/a", nil, nil}, 264*1fa6dee9SAndroid Build Coastguard Worker 265*1fa6dee9SAndroid Build Coastguard Worker {"c", []string{"c"}, nil}, 266*1fa6dee9SAndroid Build Coastguard Worker {"c/a", nil, nil}, 267*1fa6dee9SAndroid Build Coastguard Worker 268*1fa6dee9SAndroid Build Coastguard Worker {"d", []string{"d"}, nil}, 269*1fa6dee9SAndroid Build Coastguard Worker {"d/a", nil, nil}, 270*1fa6dee9SAndroid Build Coastguard Worker 271*1fa6dee9SAndroid Build Coastguard Worker {"e", nil, nil}, 272*1fa6dee9SAndroid Build Coastguard Worker 273*1fa6dee9SAndroid Build Coastguard Worker {"dangling", nil, os.ErrNotExist}, 274*1fa6dee9SAndroid Build Coastguard Worker 275*1fa6dee9SAndroid Build Coastguard Worker {"missing", nil, os.ErrNotExist}, 276*1fa6dee9SAndroid Build Coastguard Worker } 277*1fa6dee9SAndroid Build Coastguard Worker 278*1fa6dee9SAndroid Build Coastguard Worker runTestFs(t, func(t *testing.T, fs FileSystem, dir string) { 279*1fa6dee9SAndroid Build Coastguard Worker for _, test := range testCases { 280*1fa6dee9SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 281*1fa6dee9SAndroid Build Coastguard Worker got, err := fs.ListDirsRecursive(filepath.Join(dir, test.name), DontFollowSymlinks) 282*1fa6dee9SAndroid Build Coastguard Worker checkErr(t, test.err, err) 283*1fa6dee9SAndroid Build Coastguard Worker want := slices.Clone(test.dirs) 284*1fa6dee9SAndroid Build Coastguard Worker for i := range want { 285*1fa6dee9SAndroid Build Coastguard Worker want[i] = filepath.Join(dir, want[i]) 286*1fa6dee9SAndroid Build Coastguard Worker } 287*1fa6dee9SAndroid Build Coastguard Worker if !reflect.DeepEqual(got, want) { 288*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("want: %v, got %v", want, got) 289*1fa6dee9SAndroid Build Coastguard Worker } 290*1fa6dee9SAndroid Build Coastguard Worker }) 291*1fa6dee9SAndroid Build Coastguard Worker } 292*1fa6dee9SAndroid Build Coastguard Worker }) 293*1fa6dee9SAndroid Build Coastguard Worker} 294*1fa6dee9SAndroid Build Coastguard Worker 295*1fa6dee9SAndroid Build Coastguard Workerfunc TestFs_Readlink(t *testing.T) { 296*1fa6dee9SAndroid Build Coastguard Worker testCases := []struct { 297*1fa6dee9SAndroid Build Coastguard Worker from, to string 298*1fa6dee9SAndroid Build Coastguard Worker err error 299*1fa6dee9SAndroid Build Coastguard Worker }{ 300*1fa6dee9SAndroid Build Coastguard Worker {".", "", syscall.EINVAL}, 301*1fa6dee9SAndroid Build Coastguard Worker {"/", "", syscall.EINVAL}, 302*1fa6dee9SAndroid Build Coastguard Worker 303*1fa6dee9SAndroid Build Coastguard Worker {"a", "", syscall.EINVAL}, 304*1fa6dee9SAndroid Build Coastguard Worker {"a/a", "", syscall.EINVAL}, 305*1fa6dee9SAndroid Build Coastguard Worker {"a/a/a", "", syscall.EINVAL}, 306*1fa6dee9SAndroid Build Coastguard Worker {"a/a/f", "../../f", nil}, 307*1fa6dee9SAndroid Build Coastguard Worker 308*1fa6dee9SAndroid Build Coastguard Worker {"b", "a", nil}, 309*1fa6dee9SAndroid Build Coastguard Worker {"b/a", "", syscall.EINVAL}, 310*1fa6dee9SAndroid Build Coastguard Worker {"b/a/a", "", syscall.EINVAL}, 311*1fa6dee9SAndroid Build Coastguard Worker {"b/a/f", "../../f", nil}, 312*1fa6dee9SAndroid Build Coastguard Worker 313*1fa6dee9SAndroid Build Coastguard Worker {"c", "a/a", nil}, 314*1fa6dee9SAndroid Build Coastguard Worker {"c/a", "", syscall.EINVAL}, 315*1fa6dee9SAndroid Build Coastguard Worker {"c/f", "../../f", nil}, 316*1fa6dee9SAndroid Build Coastguard Worker 317*1fa6dee9SAndroid Build Coastguard Worker {"d/a", "", syscall.EINVAL}, 318*1fa6dee9SAndroid Build Coastguard Worker {"d/f", "../../f", nil}, 319*1fa6dee9SAndroid Build Coastguard Worker 320*1fa6dee9SAndroid Build Coastguard Worker {"e", "a/a/a", nil}, 321*1fa6dee9SAndroid Build Coastguard Worker 322*1fa6dee9SAndroid Build Coastguard Worker {"f", "", syscall.EINVAL}, 323*1fa6dee9SAndroid Build Coastguard Worker 324*1fa6dee9SAndroid Build Coastguard Worker {"dangling", "missing", nil}, 325*1fa6dee9SAndroid Build Coastguard Worker 326*1fa6dee9SAndroid Build Coastguard Worker {"a/missing", "", os.ErrNotExist}, 327*1fa6dee9SAndroid Build Coastguard Worker {"b/missing", "", os.ErrNotExist}, 328*1fa6dee9SAndroid Build Coastguard Worker {"c/missing", "", os.ErrNotExist}, 329*1fa6dee9SAndroid Build Coastguard Worker {"d/missing", "", os.ErrNotExist}, 330*1fa6dee9SAndroid Build Coastguard Worker {"e/missing", "", os.ErrNotExist}, 331*1fa6dee9SAndroid Build Coastguard Worker {"dangling/missing", "", os.ErrNotExist}, 332*1fa6dee9SAndroid Build Coastguard Worker 333*1fa6dee9SAndroid Build Coastguard Worker {"a/missing/missing", "", os.ErrNotExist}, 334*1fa6dee9SAndroid Build Coastguard Worker {"b/missing/missing", "", os.ErrNotExist}, 335*1fa6dee9SAndroid Build Coastguard Worker {"c/missing/missing", "", os.ErrNotExist}, 336*1fa6dee9SAndroid Build Coastguard Worker {"d/missing/missing", "", os.ErrNotExist}, 337*1fa6dee9SAndroid Build Coastguard Worker {"e/missing/missing", "", os.ErrNotExist}, 338*1fa6dee9SAndroid Build Coastguard Worker {"dangling/missing/missing", "", os.ErrNotExist}, 339*1fa6dee9SAndroid Build Coastguard Worker } 340*1fa6dee9SAndroid Build Coastguard Worker 341*1fa6dee9SAndroid Build Coastguard Worker runTestFs(t, func(t *testing.T, fs FileSystem, dir string) { 342*1fa6dee9SAndroid Build Coastguard Worker for _, test := range testCases { 343*1fa6dee9SAndroid Build Coastguard Worker t.Run(test.from, func(t *testing.T) { 344*1fa6dee9SAndroid Build Coastguard Worker got, err := fs.Readlink(test.from) 345*1fa6dee9SAndroid Build Coastguard Worker checkErr(t, test.err, err) 346*1fa6dee9SAndroid Build Coastguard Worker if got != test.to { 347*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("fs.Readlink(%q) want: %q, got %q", test.from, test.to, got) 348*1fa6dee9SAndroid Build Coastguard Worker } 349*1fa6dee9SAndroid Build Coastguard Worker }) 350*1fa6dee9SAndroid Build Coastguard Worker } 351*1fa6dee9SAndroid Build Coastguard Worker }) 352*1fa6dee9SAndroid Build Coastguard Worker} 353*1fa6dee9SAndroid Build Coastguard Worker 354*1fa6dee9SAndroid Build Coastguard Workerfunc TestFs_Lstat(t *testing.T) { 355*1fa6dee9SAndroid Build Coastguard Worker testCases := []struct { 356*1fa6dee9SAndroid Build Coastguard Worker name string 357*1fa6dee9SAndroid Build Coastguard Worker mode os.FileMode 358*1fa6dee9SAndroid Build Coastguard Worker size int64 359*1fa6dee9SAndroid Build Coastguard Worker err error 360*1fa6dee9SAndroid Build Coastguard Worker }{ 361*1fa6dee9SAndroid Build Coastguard Worker {".", os.ModeDir, 0, nil}, 362*1fa6dee9SAndroid Build Coastguard Worker {"/", os.ModeDir, 0, nil}, 363*1fa6dee9SAndroid Build Coastguard Worker 364*1fa6dee9SAndroid Build Coastguard Worker {"a", os.ModeDir, 0, nil}, 365*1fa6dee9SAndroid Build Coastguard Worker {"a/a", os.ModeDir, 0, nil}, 366*1fa6dee9SAndroid Build Coastguard Worker {"a/a/a", 0, 0, nil}, 367*1fa6dee9SAndroid Build Coastguard Worker {"a/a/f", os.ModeSymlink, 7, nil}, 368*1fa6dee9SAndroid Build Coastguard Worker 369*1fa6dee9SAndroid Build Coastguard Worker {"b", os.ModeSymlink, 1, nil}, 370*1fa6dee9SAndroid Build Coastguard Worker {"b/a", os.ModeDir, 0, nil}, 371*1fa6dee9SAndroid Build Coastguard Worker {"b/a/a", 0, 0, nil}, 372*1fa6dee9SAndroid Build Coastguard Worker {"b/a/f", os.ModeSymlink, 7, nil}, 373*1fa6dee9SAndroid Build Coastguard Worker 374*1fa6dee9SAndroid Build Coastguard Worker {"c", os.ModeSymlink, 3, nil}, 375*1fa6dee9SAndroid Build Coastguard Worker {"c/a", 0, 0, nil}, 376*1fa6dee9SAndroid Build Coastguard Worker {"c/f", os.ModeSymlink, 7, nil}, 377*1fa6dee9SAndroid Build Coastguard Worker 378*1fa6dee9SAndroid Build Coastguard Worker {"d/a", 0, 0, nil}, 379*1fa6dee9SAndroid Build Coastguard Worker {"d/f", os.ModeSymlink, 7, nil}, 380*1fa6dee9SAndroid Build Coastguard Worker 381*1fa6dee9SAndroid Build Coastguard Worker {"e", os.ModeSymlink, 5, nil}, 382*1fa6dee9SAndroid Build Coastguard Worker 383*1fa6dee9SAndroid Build Coastguard Worker {"f", 0, 0, nil}, 384*1fa6dee9SAndroid Build Coastguard Worker 385*1fa6dee9SAndroid Build Coastguard Worker {"dangling", os.ModeSymlink, 7, nil}, 386*1fa6dee9SAndroid Build Coastguard Worker 387*1fa6dee9SAndroid Build Coastguard Worker {"a/missing", 0, 0, os.ErrNotExist}, 388*1fa6dee9SAndroid Build Coastguard Worker {"b/missing", 0, 0, os.ErrNotExist}, 389*1fa6dee9SAndroid Build Coastguard Worker {"c/missing", 0, 0, os.ErrNotExist}, 390*1fa6dee9SAndroid Build Coastguard Worker {"d/missing", 0, 0, os.ErrNotExist}, 391*1fa6dee9SAndroid Build Coastguard Worker {"e/missing", 0, 0, os.ErrNotExist}, 392*1fa6dee9SAndroid Build Coastguard Worker {"dangling/missing", 0, 0, os.ErrNotExist}, 393*1fa6dee9SAndroid Build Coastguard Worker 394*1fa6dee9SAndroid Build Coastguard Worker {"a/missing/missing", 0, 0, os.ErrNotExist}, 395*1fa6dee9SAndroid Build Coastguard Worker {"b/missing/missing", 0, 0, os.ErrNotExist}, 396*1fa6dee9SAndroid Build Coastguard Worker {"c/missing/missing", 0, 0, os.ErrNotExist}, 397*1fa6dee9SAndroid Build Coastguard Worker {"d/missing/missing", 0, 0, os.ErrNotExist}, 398*1fa6dee9SAndroid Build Coastguard Worker {"e/missing/missing", 0, 0, os.ErrNotExist}, 399*1fa6dee9SAndroid Build Coastguard Worker {"dangling/missing/missing", 0, 0, os.ErrNotExist}, 400*1fa6dee9SAndroid Build Coastguard Worker } 401*1fa6dee9SAndroid Build Coastguard Worker 402*1fa6dee9SAndroid Build Coastguard Worker runTestFs(t, func(t *testing.T, fs FileSystem, dir string) { 403*1fa6dee9SAndroid Build Coastguard Worker for _, test := range testCases { 404*1fa6dee9SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 405*1fa6dee9SAndroid Build Coastguard Worker got, err := fs.Lstat(filepath.Join(dir, test.name)) 406*1fa6dee9SAndroid Build Coastguard Worker checkErr(t, test.err, err) 407*1fa6dee9SAndroid Build Coastguard Worker if err != nil { 408*1fa6dee9SAndroid Build Coastguard Worker return 409*1fa6dee9SAndroid Build Coastguard Worker } 410*1fa6dee9SAndroid Build Coastguard Worker if got.Mode()&os.ModeType != test.mode { 411*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("fs.Lstat(%q).Mode()&os.ModeType want: %x, got %x", 412*1fa6dee9SAndroid Build Coastguard Worker test.name, test.mode, got.Mode()&os.ModeType) 413*1fa6dee9SAndroid Build Coastguard Worker } 414*1fa6dee9SAndroid Build Coastguard Worker if test.mode == 0 && got.Size() != test.size { 415*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("fs.Lstat(%q).Size() want: %d, got %d", test.name, test.size, got.Size()) 416*1fa6dee9SAndroid Build Coastguard Worker } 417*1fa6dee9SAndroid Build Coastguard Worker }) 418*1fa6dee9SAndroid Build Coastguard Worker } 419*1fa6dee9SAndroid Build Coastguard Worker }) 420*1fa6dee9SAndroid Build Coastguard Worker} 421*1fa6dee9SAndroid Build Coastguard Worker 422*1fa6dee9SAndroid Build Coastguard Workerfunc TestFs_Stat(t *testing.T) { 423*1fa6dee9SAndroid Build Coastguard Worker testCases := []struct { 424*1fa6dee9SAndroid Build Coastguard Worker name string 425*1fa6dee9SAndroid Build Coastguard Worker mode os.FileMode 426*1fa6dee9SAndroid Build Coastguard Worker size int64 427*1fa6dee9SAndroid Build Coastguard Worker err error 428*1fa6dee9SAndroid Build Coastguard Worker }{ 429*1fa6dee9SAndroid Build Coastguard Worker {".", os.ModeDir, 0, nil}, 430*1fa6dee9SAndroid Build Coastguard Worker {"/", os.ModeDir, 0, nil}, 431*1fa6dee9SAndroid Build Coastguard Worker 432*1fa6dee9SAndroid Build Coastguard Worker {"a", os.ModeDir, 0, nil}, 433*1fa6dee9SAndroid Build Coastguard Worker {"a/a", os.ModeDir, 0, nil}, 434*1fa6dee9SAndroid Build Coastguard Worker {"a/a/a", 0, 0, nil}, 435*1fa6dee9SAndroid Build Coastguard Worker {"a/a/f", 0, 0, nil}, 436*1fa6dee9SAndroid Build Coastguard Worker 437*1fa6dee9SAndroid Build Coastguard Worker {"b", os.ModeDir, 0, nil}, 438*1fa6dee9SAndroid Build Coastguard Worker {"b/a", os.ModeDir, 0, nil}, 439*1fa6dee9SAndroid Build Coastguard Worker {"b/a/a", 0, 0, nil}, 440*1fa6dee9SAndroid Build Coastguard Worker {"b/a/f", 0, 0, nil}, 441*1fa6dee9SAndroid Build Coastguard Worker 442*1fa6dee9SAndroid Build Coastguard Worker {"c", os.ModeDir, 0, nil}, 443*1fa6dee9SAndroid Build Coastguard Worker {"c/a", 0, 0, nil}, 444*1fa6dee9SAndroid Build Coastguard Worker {"c/f", 0, 0, nil}, 445*1fa6dee9SAndroid Build Coastguard Worker 446*1fa6dee9SAndroid Build Coastguard Worker {"d/a", 0, 0, nil}, 447*1fa6dee9SAndroid Build Coastguard Worker {"d/f", 0, 0, nil}, 448*1fa6dee9SAndroid Build Coastguard Worker 449*1fa6dee9SAndroid Build Coastguard Worker {"e", 0, 0, nil}, 450*1fa6dee9SAndroid Build Coastguard Worker 451*1fa6dee9SAndroid Build Coastguard Worker {"f", 0, 0, nil}, 452*1fa6dee9SAndroid Build Coastguard Worker 453*1fa6dee9SAndroid Build Coastguard Worker {"dangling", 0, 0, os.ErrNotExist}, 454*1fa6dee9SAndroid Build Coastguard Worker 455*1fa6dee9SAndroid Build Coastguard Worker {"a/missing", 0, 0, os.ErrNotExist}, 456*1fa6dee9SAndroid Build Coastguard Worker {"b/missing", 0, 0, os.ErrNotExist}, 457*1fa6dee9SAndroid Build Coastguard Worker {"c/missing", 0, 0, os.ErrNotExist}, 458*1fa6dee9SAndroid Build Coastguard Worker {"d/missing", 0, 0, os.ErrNotExist}, 459*1fa6dee9SAndroid Build Coastguard Worker {"e/missing", 0, 0, os.ErrNotExist}, 460*1fa6dee9SAndroid Build Coastguard Worker {"dangling/missing", 0, 0, os.ErrNotExist}, 461*1fa6dee9SAndroid Build Coastguard Worker 462*1fa6dee9SAndroid Build Coastguard Worker {"a/missing/missing", 0, 0, os.ErrNotExist}, 463*1fa6dee9SAndroid Build Coastguard Worker {"b/missing/missing", 0, 0, os.ErrNotExist}, 464*1fa6dee9SAndroid Build Coastguard Worker {"c/missing/missing", 0, 0, os.ErrNotExist}, 465*1fa6dee9SAndroid Build Coastguard Worker {"d/missing/missing", 0, 0, os.ErrNotExist}, 466*1fa6dee9SAndroid Build Coastguard Worker {"e/missing/missing", 0, 0, os.ErrNotExist}, 467*1fa6dee9SAndroid Build Coastguard Worker {"dangling/missing/missing", 0, 0, os.ErrNotExist}, 468*1fa6dee9SAndroid Build Coastguard Worker } 469*1fa6dee9SAndroid Build Coastguard Worker 470*1fa6dee9SAndroid Build Coastguard Worker runTestFs(t, func(t *testing.T, fs FileSystem, dir string) { 471*1fa6dee9SAndroid Build Coastguard Worker for _, test := range testCases { 472*1fa6dee9SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 473*1fa6dee9SAndroid Build Coastguard Worker got, err := fs.Stat(filepath.Join(dir, test.name)) 474*1fa6dee9SAndroid Build Coastguard Worker checkErr(t, test.err, err) 475*1fa6dee9SAndroid Build Coastguard Worker if err != nil { 476*1fa6dee9SAndroid Build Coastguard Worker return 477*1fa6dee9SAndroid Build Coastguard Worker } 478*1fa6dee9SAndroid Build Coastguard Worker if got.Mode()&os.ModeType != test.mode { 479*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("fs.Stat(%q).Mode()&os.ModeType want: %x, got %x", 480*1fa6dee9SAndroid Build Coastguard Worker test.name, test.mode, got.Mode()&os.ModeType) 481*1fa6dee9SAndroid Build Coastguard Worker } 482*1fa6dee9SAndroid Build Coastguard Worker if test.mode == 0 && got.Size() != test.size { 483*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("fs.Stat(%q).Size() want: %d, got %d", test.name, test.size, got.Size()) 484*1fa6dee9SAndroid Build Coastguard Worker } 485*1fa6dee9SAndroid Build Coastguard Worker }) 486*1fa6dee9SAndroid Build Coastguard Worker } 487*1fa6dee9SAndroid Build Coastguard Worker }) 488*1fa6dee9SAndroid Build Coastguard Worker} 489*1fa6dee9SAndroid Build Coastguard Worker 490*1fa6dee9SAndroid Build Coastguard Workerfunc TestMockFs_glob(t *testing.T) { 491*1fa6dee9SAndroid Build Coastguard Worker testCases := []struct { 492*1fa6dee9SAndroid Build Coastguard Worker pattern string 493*1fa6dee9SAndroid Build Coastguard Worker files []string 494*1fa6dee9SAndroid Build Coastguard Worker }{ 495*1fa6dee9SAndroid Build Coastguard Worker {"*", []string{"a", "b", "c", "d", "dangling", "e", "f"}}, 496*1fa6dee9SAndroid Build Coastguard Worker {"./*", []string{"a", "b", "c", "d", "dangling", "e", "f"}}, 497*1fa6dee9SAndroid Build Coastguard Worker {"a", []string{"a"}}, 498*1fa6dee9SAndroid Build Coastguard Worker {"a/a", []string{"a/a"}}, 499*1fa6dee9SAndroid Build Coastguard Worker {"a/*", []string{"a/a"}}, 500*1fa6dee9SAndroid Build Coastguard Worker {"a/a/a", []string{"a/a/a"}}, 501*1fa6dee9SAndroid Build Coastguard Worker {"a/a/f", []string{"a/a/f"}}, 502*1fa6dee9SAndroid Build Coastguard Worker {"a/a/*", []string{"a/a/a", "a/a/f"}}, 503*1fa6dee9SAndroid Build Coastguard Worker 504*1fa6dee9SAndroid Build Coastguard Worker {"b", []string{"b"}}, 505*1fa6dee9SAndroid Build Coastguard Worker {"b/a", []string{"b/a"}}, 506*1fa6dee9SAndroid Build Coastguard Worker {"b/*", []string{"b/a"}}, 507*1fa6dee9SAndroid Build Coastguard Worker {"b/a/a", []string{"b/a/a"}}, 508*1fa6dee9SAndroid Build Coastguard Worker {"b/a/f", []string{"b/a/f"}}, 509*1fa6dee9SAndroid Build Coastguard Worker {"b/a/*", []string{"b/a/a", "b/a/f"}}, 510*1fa6dee9SAndroid Build Coastguard Worker 511*1fa6dee9SAndroid Build Coastguard Worker {"c", []string{"c"}}, 512*1fa6dee9SAndroid Build Coastguard Worker {"c/a", []string{"c/a"}}, 513*1fa6dee9SAndroid Build Coastguard Worker {"c/f", []string{"c/f"}}, 514*1fa6dee9SAndroid Build Coastguard Worker {"c/*", []string{"c/a", "c/f"}}, 515*1fa6dee9SAndroid Build Coastguard Worker 516*1fa6dee9SAndroid Build Coastguard Worker {"d", []string{"d"}}, 517*1fa6dee9SAndroid Build Coastguard Worker {"d/a", []string{"d/a"}}, 518*1fa6dee9SAndroid Build Coastguard Worker {"d/f", []string{"d/f"}}, 519*1fa6dee9SAndroid Build Coastguard Worker {"d/*", []string{"d/a", "d/f"}}, 520*1fa6dee9SAndroid Build Coastguard Worker 521*1fa6dee9SAndroid Build Coastguard Worker {"e", []string{"e"}}, 522*1fa6dee9SAndroid Build Coastguard Worker 523*1fa6dee9SAndroid Build Coastguard Worker {"dangling", []string{"dangling"}}, 524*1fa6dee9SAndroid Build Coastguard Worker 525*1fa6dee9SAndroid Build Coastguard Worker {"missing", nil}, 526*1fa6dee9SAndroid Build Coastguard Worker } 527*1fa6dee9SAndroid Build Coastguard Worker 528*1fa6dee9SAndroid Build Coastguard Worker runTestFs(t, func(t *testing.T, fs FileSystem, dir string) { 529*1fa6dee9SAndroid Build Coastguard Worker for _, test := range testCases { 530*1fa6dee9SAndroid Build Coastguard Worker t.Run(test.pattern, func(t *testing.T) { 531*1fa6dee9SAndroid Build Coastguard Worker got, err := fs.glob(test.pattern) 532*1fa6dee9SAndroid Build Coastguard Worker if err != nil { 533*1fa6dee9SAndroid Build Coastguard Worker t.Fatal(err) 534*1fa6dee9SAndroid Build Coastguard Worker } 535*1fa6dee9SAndroid Build Coastguard Worker if !reflect.DeepEqual(got, test.files) { 536*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("want: %v, got %v", test.files, got) 537*1fa6dee9SAndroid Build Coastguard Worker } 538*1fa6dee9SAndroid Build Coastguard Worker }) 539*1fa6dee9SAndroid Build Coastguard Worker } 540*1fa6dee9SAndroid Build Coastguard Worker }) 541*1fa6dee9SAndroid Build Coastguard Worker} 542*1fa6dee9SAndroid Build Coastguard Worker 543*1fa6dee9SAndroid Build Coastguard Workerfunc syscallError(err error) error { 544*1fa6dee9SAndroid Build Coastguard Worker if serr, ok := err.(*os.SyscallError); ok { 545*1fa6dee9SAndroid Build Coastguard Worker return serr.Err.(syscall.Errno) 546*1fa6dee9SAndroid Build Coastguard Worker } else if serr, ok := err.(syscall.Errno); ok { 547*1fa6dee9SAndroid Build Coastguard Worker return serr 548*1fa6dee9SAndroid Build Coastguard Worker } else { 549*1fa6dee9SAndroid Build Coastguard Worker return nil 550*1fa6dee9SAndroid Build Coastguard Worker } 551*1fa6dee9SAndroid Build Coastguard Worker} 552*1fa6dee9SAndroid Build Coastguard Worker 553*1fa6dee9SAndroid Build Coastguard Workerfunc checkErr(t *testing.T, want, got error) { 554*1fa6dee9SAndroid Build Coastguard Worker t.Helper() 555*1fa6dee9SAndroid Build Coastguard Worker if (got != nil) != (want != nil) { 556*1fa6dee9SAndroid Build Coastguard Worker t.Fatalf("want: %v, got %v", want, got) 557*1fa6dee9SAndroid Build Coastguard Worker } 558*1fa6dee9SAndroid Build Coastguard Worker 559*1fa6dee9SAndroid Build Coastguard Worker if os.IsNotExist(got) == os.IsNotExist(want) { 560*1fa6dee9SAndroid Build Coastguard Worker return 561*1fa6dee9SAndroid Build Coastguard Worker } 562*1fa6dee9SAndroid Build Coastguard Worker 563*1fa6dee9SAndroid Build Coastguard Worker if syscallError(got) == syscallError(want) { 564*1fa6dee9SAndroid Build Coastguard Worker return 565*1fa6dee9SAndroid Build Coastguard Worker } 566*1fa6dee9SAndroid Build Coastguard Worker 567*1fa6dee9SAndroid Build Coastguard Worker t.Fatalf("want: %v, got %v", want, got) 568*1fa6dee9SAndroid Build Coastguard Worker} 569