xref: /aosp_15_r20/build/blueprint/pathtools/fs_test.go (revision 1fa6dee971e1612fa5cc0aa5ca2d35a22e2c34a3)
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