xref: /aosp_15_r20/build/soong/finder/fs/readdir_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2017 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage fs
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"os"
19*333d2b36SAndroid Build Coastguard Worker	"reflect"
20*333d2b36SAndroid Build Coastguard Worker	"runtime"
21*333d2b36SAndroid Build Coastguard Worker	"testing"
22*333d2b36SAndroid Build Coastguard Worker)
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Workerfunc TestParseDirent(t *testing.T) {
25*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
26*333d2b36SAndroid Build Coastguard Worker		name string
27*333d2b36SAndroid Build Coastguard Worker		in   []byte
28*333d2b36SAndroid Build Coastguard Worker		out  []*dirEntryInfo
29*333d2b36SAndroid Build Coastguard Worker	}{
30*333d2b36SAndroid Build Coastguard Worker		{
31*333d2b36SAndroid Build Coastguard Worker			// Test that type DT_DIR is translated to os.ModeDir
32*333d2b36SAndroid Build Coastguard Worker			name: "dir",
33*333d2b36SAndroid Build Coastguard Worker			in: []byte{
34*333d2b36SAndroid Build Coastguard Worker				// __ino64_t d_ino;
35*333d2b36SAndroid Build Coastguard Worker				0xfb, 0x10, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00,
36*333d2b36SAndroid Build Coastguard Worker				// __off64_t d_off;
37*333d2b36SAndroid Build Coastguard Worker				0xeb, 0x85, 0x20, 0x91, 0xb9, 0x14, 0x34, 0x03,
38*333d2b36SAndroid Build Coastguard Worker				// unsigned short int d_reclen;
39*333d2b36SAndroid Build Coastguard Worker				0x28, 0x00,
40*333d2b36SAndroid Build Coastguard Worker				// unsigned char d_type;
41*333d2b36SAndroid Build Coastguard Worker				0x04,
42*333d2b36SAndroid Build Coastguard Worker				// char d_name[];
43*333d2b36SAndroid Build Coastguard Worker				0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73,
44*333d2b36SAndroid Build Coastguard Worker				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
45*333d2b36SAndroid Build Coastguard Worker			},
46*333d2b36SAndroid Build Coastguard Worker			out: []*dirEntryInfo{
47*333d2b36SAndroid Build Coastguard Worker				{".module_paths", os.ModeDir, true},
48*333d2b36SAndroid Build Coastguard Worker			},
49*333d2b36SAndroid Build Coastguard Worker		},
50*333d2b36SAndroid Build Coastguard Worker		{
51*333d2b36SAndroid Build Coastguard Worker			// Test that type DT_REG is translated to a regular file
52*333d2b36SAndroid Build Coastguard Worker			name: "file",
53*333d2b36SAndroid Build Coastguard Worker			in: []byte{
54*333d2b36SAndroid Build Coastguard Worker				// __ino64_t d_ino;
55*333d2b36SAndroid Build Coastguard Worker				0xfb, 0x10, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00,
56*333d2b36SAndroid Build Coastguard Worker				// __off64_t d_off;
57*333d2b36SAndroid Build Coastguard Worker				0xeb, 0x85, 0x20, 0x91, 0xb9, 0x14, 0x34, 0x03,
58*333d2b36SAndroid Build Coastguard Worker				// unsigned short int d_reclen;
59*333d2b36SAndroid Build Coastguard Worker				0x28, 0x00,
60*333d2b36SAndroid Build Coastguard Worker				// unsigned char d_type;
61*333d2b36SAndroid Build Coastguard Worker				0x08,
62*333d2b36SAndroid Build Coastguard Worker				// char d_name[];
63*333d2b36SAndroid Build Coastguard Worker				0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73,
64*333d2b36SAndroid Build Coastguard Worker				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
65*333d2b36SAndroid Build Coastguard Worker			},
66*333d2b36SAndroid Build Coastguard Worker			out: []*dirEntryInfo{
67*333d2b36SAndroid Build Coastguard Worker				{".module_paths", 0, true},
68*333d2b36SAndroid Build Coastguard Worker			},
69*333d2b36SAndroid Build Coastguard Worker		},
70*333d2b36SAndroid Build Coastguard Worker		{
71*333d2b36SAndroid Build Coastguard Worker			// Test that type DT_LNK is translated to a regular os.ModeSymlink
72*333d2b36SAndroid Build Coastguard Worker			name: "symlink",
73*333d2b36SAndroid Build Coastguard Worker			in: []byte{
74*333d2b36SAndroid Build Coastguard Worker				// __ino64_t d_ino;
75*333d2b36SAndroid Build Coastguard Worker				0xfb, 0x10, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00,
76*333d2b36SAndroid Build Coastguard Worker				// __off64_t d_off;
77*333d2b36SAndroid Build Coastguard Worker				0xeb, 0x85, 0x20, 0x91, 0xb9, 0x14, 0x34, 0x03,
78*333d2b36SAndroid Build Coastguard Worker				// unsigned short int d_reclen;
79*333d2b36SAndroid Build Coastguard Worker				0x28, 0x00,
80*333d2b36SAndroid Build Coastguard Worker				// unsigned char d_type;
81*333d2b36SAndroid Build Coastguard Worker				0x0a,
82*333d2b36SAndroid Build Coastguard Worker				// char d_name[];
83*333d2b36SAndroid Build Coastguard Worker				0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73,
84*333d2b36SAndroid Build Coastguard Worker				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
85*333d2b36SAndroid Build Coastguard Worker			},
86*333d2b36SAndroid Build Coastguard Worker			out: []*dirEntryInfo{
87*333d2b36SAndroid Build Coastguard Worker				{".module_paths", os.ModeSymlink, true},
88*333d2b36SAndroid Build Coastguard Worker			},
89*333d2b36SAndroid Build Coastguard Worker		},
90*333d2b36SAndroid Build Coastguard Worker		{
91*333d2b36SAndroid Build Coastguard Worker			// Test that type DT_UNKNOWN sets modeExists: false
92*333d2b36SAndroid Build Coastguard Worker			name: "unknown",
93*333d2b36SAndroid Build Coastguard Worker			in: []byte{
94*333d2b36SAndroid Build Coastguard Worker				// __ino64_t d_ino;
95*333d2b36SAndroid Build Coastguard Worker				0xfb, 0x10, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00,
96*333d2b36SAndroid Build Coastguard Worker				// __off64_t d_off;
97*333d2b36SAndroid Build Coastguard Worker				0xeb, 0x85, 0x20, 0x91, 0xb9, 0x14, 0x34, 0x03,
98*333d2b36SAndroid Build Coastguard Worker				// unsigned short int d_reclen;
99*333d2b36SAndroid Build Coastguard Worker				0x28, 0x00,
100*333d2b36SAndroid Build Coastguard Worker				// unsigned char d_type;
101*333d2b36SAndroid Build Coastguard Worker				0x00,
102*333d2b36SAndroid Build Coastguard Worker				// char d_name[];
103*333d2b36SAndroid Build Coastguard Worker				0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73,
104*333d2b36SAndroid Build Coastguard Worker				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
105*333d2b36SAndroid Build Coastguard Worker			},
106*333d2b36SAndroid Build Coastguard Worker			out: []*dirEntryInfo{
107*333d2b36SAndroid Build Coastguard Worker				{".module_paths", 0, false},
108*333d2b36SAndroid Build Coastguard Worker			},
109*333d2b36SAndroid Build Coastguard Worker		},
110*333d2b36SAndroid Build Coastguard Worker		{
111*333d2b36SAndroid Build Coastguard Worker			// Test a name with no padding after the null terminator
112*333d2b36SAndroid Build Coastguard Worker			name: "no padding",
113*333d2b36SAndroid Build Coastguard Worker			in: []byte{
114*333d2b36SAndroid Build Coastguard Worker				// __ino64_t d_ino;
115*333d2b36SAndroid Build Coastguard Worker				0xfb, 0x10, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00,
116*333d2b36SAndroid Build Coastguard Worker				// __off64_t d_off;
117*333d2b36SAndroid Build Coastguard Worker				0xeb, 0x85, 0x20, 0x91, 0xb9, 0x14, 0x34, 0x03,
118*333d2b36SAndroid Build Coastguard Worker				// unsigned short int d_reclen;
119*333d2b36SAndroid Build Coastguard Worker				0x20, 0x00,
120*333d2b36SAndroid Build Coastguard Worker				// unsigned char d_type;
121*333d2b36SAndroid Build Coastguard Worker				0x04,
122*333d2b36SAndroid Build Coastguard Worker				// char d_name[];
123*333d2b36SAndroid Build Coastguard Worker				0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x00,
124*333d2b36SAndroid Build Coastguard Worker			},
125*333d2b36SAndroid Build Coastguard Worker			out: []*dirEntryInfo{
126*333d2b36SAndroid Build Coastguard Worker				{".module_path", os.ModeDir, true},
127*333d2b36SAndroid Build Coastguard Worker			},
128*333d2b36SAndroid Build Coastguard Worker		},
129*333d2b36SAndroid Build Coastguard Worker		{
130*333d2b36SAndroid Build Coastguard Worker			// Test two sequential entries
131*333d2b36SAndroid Build Coastguard Worker			name: "two entries",
132*333d2b36SAndroid Build Coastguard Worker			in: []byte{
133*333d2b36SAndroid Build Coastguard Worker				// __ino64_t d_ino;
134*333d2b36SAndroid Build Coastguard Worker				0xfb, 0x10, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00,
135*333d2b36SAndroid Build Coastguard Worker				// __off64_t d_off;
136*333d2b36SAndroid Build Coastguard Worker				0xeb, 0x85, 0x20, 0x91, 0xb9, 0x14, 0x34, 0x03,
137*333d2b36SAndroid Build Coastguard Worker				// unsigned short int d_reclen;
138*333d2b36SAndroid Build Coastguard Worker				0x28, 0x00,
139*333d2b36SAndroid Build Coastguard Worker				// unsigned char d_type;
140*333d2b36SAndroid Build Coastguard Worker				0x04,
141*333d2b36SAndroid Build Coastguard Worker				// char d_name[];
142*333d2b36SAndroid Build Coastguard Worker				0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73,
143*333d2b36SAndroid Build Coastguard Worker				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
144*333d2b36SAndroid Build Coastguard Worker
145*333d2b36SAndroid Build Coastguard Worker				// __ino64_t d_ino;
146*333d2b36SAndroid Build Coastguard Worker				0xfb, 0x10, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00,
147*333d2b36SAndroid Build Coastguard Worker				// __off64_t d_off;
148*333d2b36SAndroid Build Coastguard Worker				0xeb, 0x85, 0x20, 0x91, 0xb9, 0x14, 0x34, 0x03,
149*333d2b36SAndroid Build Coastguard Worker				// unsigned short int d_reclen;
150*333d2b36SAndroid Build Coastguard Worker				0x28, 0x00,
151*333d2b36SAndroid Build Coastguard Worker				// unsigned char d_type;
152*333d2b36SAndroid Build Coastguard Worker				0x04,
153*333d2b36SAndroid Build Coastguard Worker				// char d_name[];
154*333d2b36SAndroid Build Coastguard Worker				0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x74,
155*333d2b36SAndroid Build Coastguard Worker				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
156*333d2b36SAndroid Build Coastguard Worker			},
157*333d2b36SAndroid Build Coastguard Worker			out: []*dirEntryInfo{
158*333d2b36SAndroid Build Coastguard Worker				{".module_paths", os.ModeDir, true},
159*333d2b36SAndroid Build Coastguard Worker				{".module_patht", os.ModeDir, true},
160*333d2b36SAndroid Build Coastguard Worker			},
161*333d2b36SAndroid Build Coastguard Worker		},
162*333d2b36SAndroid Build Coastguard Worker		{
163*333d2b36SAndroid Build Coastguard Worker			// Test two sequential entries with no padding between them
164*333d2b36SAndroid Build Coastguard Worker			name: "two entries no padding",
165*333d2b36SAndroid Build Coastguard Worker			in: []byte{
166*333d2b36SAndroid Build Coastguard Worker				// __ino64_t d_ino;
167*333d2b36SAndroid Build Coastguard Worker				0xfb, 0x10, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00,
168*333d2b36SAndroid Build Coastguard Worker				// __off64_t d_off;
169*333d2b36SAndroid Build Coastguard Worker				0xeb, 0x85, 0x20, 0x91, 0xb9, 0x14, 0x34, 0x03,
170*333d2b36SAndroid Build Coastguard Worker				// unsigned short int d_reclen;
171*333d2b36SAndroid Build Coastguard Worker				0x20, 0x00,
172*333d2b36SAndroid Build Coastguard Worker				// unsigned char d_type;
173*333d2b36SAndroid Build Coastguard Worker				0x04,
174*333d2b36SAndroid Build Coastguard Worker				// char d_name[];
175*333d2b36SAndroid Build Coastguard Worker				0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x00,
176*333d2b36SAndroid Build Coastguard Worker
177*333d2b36SAndroid Build Coastguard Worker				// __ino64_t d_ino;
178*333d2b36SAndroid Build Coastguard Worker				0xfb, 0x10, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00,
179*333d2b36SAndroid Build Coastguard Worker				// __off64_t d_off;
180*333d2b36SAndroid Build Coastguard Worker				0xeb, 0x85, 0x20, 0x91, 0xb9, 0x14, 0x34, 0x03,
181*333d2b36SAndroid Build Coastguard Worker				// unsigned short int d_reclen;
182*333d2b36SAndroid Build Coastguard Worker				0x28, 0x00,
183*333d2b36SAndroid Build Coastguard Worker				// unsigned char d_type;
184*333d2b36SAndroid Build Coastguard Worker				0x04,
185*333d2b36SAndroid Build Coastguard Worker				// char d_name[];
186*333d2b36SAndroid Build Coastguard Worker				0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73,
187*333d2b36SAndroid Build Coastguard Worker				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
188*333d2b36SAndroid Build Coastguard Worker			},
189*333d2b36SAndroid Build Coastguard Worker			out: []*dirEntryInfo{
190*333d2b36SAndroid Build Coastguard Worker				{".module_path", os.ModeDir, true},
191*333d2b36SAndroid Build Coastguard Worker				{".module_paths", os.ModeDir, true},
192*333d2b36SAndroid Build Coastguard Worker			},
193*333d2b36SAndroid Build Coastguard Worker		},
194*333d2b36SAndroid Build Coastguard Worker		{
195*333d2b36SAndroid Build Coastguard Worker			// Test an empty buffer.  This shouldn't happen in practice because
196*333d2b36SAndroid Build Coastguard Worker			// readdir doesn't call parseDirent if no bytes were returned.
197*333d2b36SAndroid Build Coastguard Worker			name: "empty",
198*333d2b36SAndroid Build Coastguard Worker			in:   []byte{},
199*333d2b36SAndroid Build Coastguard Worker			out:  nil,
200*333d2b36SAndroid Build Coastguard Worker		},
201*333d2b36SAndroid Build Coastguard Worker		{
202*333d2b36SAndroid Build Coastguard Worker			name: "missing null terminator",
203*333d2b36SAndroid Build Coastguard Worker			in: []byte{
204*333d2b36SAndroid Build Coastguard Worker				// __ino64_t d_ino;
205*333d2b36SAndroid Build Coastguard Worker				0xfb, 0x10, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00,
206*333d2b36SAndroid Build Coastguard Worker				// __off64_t d_off;
207*333d2b36SAndroid Build Coastguard Worker				0xeb, 0x85, 0x20, 0x91, 0xb9, 0x14, 0x34, 0x03,
208*333d2b36SAndroid Build Coastguard Worker				// unsigned short int d_reclen;
209*333d2b36SAndroid Build Coastguard Worker				0x20, 0x00,
210*333d2b36SAndroid Build Coastguard Worker				// unsigned char d_type;
211*333d2b36SAndroid Build Coastguard Worker				0x04,
212*333d2b36SAndroid Build Coastguard Worker				// char d_name[];
213*333d2b36SAndroid Build Coastguard Worker				0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73,
214*333d2b36SAndroid Build Coastguard Worker			},
215*333d2b36SAndroid Build Coastguard Worker			out: []*dirEntryInfo{
216*333d2b36SAndroid Build Coastguard Worker				{".module_paths", os.ModeDir, true},
217*333d2b36SAndroid Build Coastguard Worker			},
218*333d2b36SAndroid Build Coastguard Worker		},
219*333d2b36SAndroid Build Coastguard Worker		{
220*333d2b36SAndroid Build Coastguard Worker			// Test two sequential entries where the first has an incorrect d_reclen.
221*333d2b36SAndroid Build Coastguard Worker			// Should return with no entries.
222*333d2b36SAndroid Build Coastguard Worker			name: "two entries first malformed",
223*333d2b36SAndroid Build Coastguard Worker			in: []byte{
224*333d2b36SAndroid Build Coastguard Worker				// __ino64_t d_ino;
225*333d2b36SAndroid Build Coastguard Worker				0xfb, 0x10, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00,
226*333d2b36SAndroid Build Coastguard Worker				// __off64_t d_off;
227*333d2b36SAndroid Build Coastguard Worker				0xeb, 0x85, 0x20, 0x91, 0xb9, 0x14, 0x34, 0x03,
228*333d2b36SAndroid Build Coastguard Worker				// unsigned short int d_reclen;
229*333d2b36SAndroid Build Coastguard Worker				0x10, 0x00,
230*333d2b36SAndroid Build Coastguard Worker				// unsigned char d_type;
231*333d2b36SAndroid Build Coastguard Worker				0x04,
232*333d2b36SAndroid Build Coastguard Worker				// char d_name[];
233*333d2b36SAndroid Build Coastguard Worker				0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x00,
234*333d2b36SAndroid Build Coastguard Worker
235*333d2b36SAndroid Build Coastguard Worker				// __ino64_t d_ino;
236*333d2b36SAndroid Build Coastguard Worker				0xfb, 0x10, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00,
237*333d2b36SAndroid Build Coastguard Worker				// __off64_t d_off;
238*333d2b36SAndroid Build Coastguard Worker				0xeb, 0x85, 0x20, 0x91, 0xb9, 0x14, 0x34, 0x03,
239*333d2b36SAndroid Build Coastguard Worker				// unsigned short int d_reclen;
240*333d2b36SAndroid Build Coastguard Worker				0x28, 0x00,
241*333d2b36SAndroid Build Coastguard Worker				// unsigned char d_type;
242*333d2b36SAndroid Build Coastguard Worker				0x04,
243*333d2b36SAndroid Build Coastguard Worker				// char d_name[];
244*333d2b36SAndroid Build Coastguard Worker				0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73,
245*333d2b36SAndroid Build Coastguard Worker				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
246*333d2b36SAndroid Build Coastguard Worker			},
247*333d2b36SAndroid Build Coastguard Worker			out: nil,
248*333d2b36SAndroid Build Coastguard Worker		},
249*333d2b36SAndroid Build Coastguard Worker		{
250*333d2b36SAndroid Build Coastguard Worker			// Test two sequential entries where the second has an incorrect d_reclen.
251*333d2b36SAndroid Build Coastguard Worker			// Should return the first entry.
252*333d2b36SAndroid Build Coastguard Worker			name: "two entries second malformed",
253*333d2b36SAndroid Build Coastguard Worker			in: []byte{
254*333d2b36SAndroid Build Coastguard Worker				// __ino64_t d_ino;
255*333d2b36SAndroid Build Coastguard Worker				0xfb, 0x10, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00,
256*333d2b36SAndroid Build Coastguard Worker				// __off64_t d_off;
257*333d2b36SAndroid Build Coastguard Worker				0xeb, 0x85, 0x20, 0x91, 0xb9, 0x14, 0x34, 0x03,
258*333d2b36SAndroid Build Coastguard Worker				// unsigned short int d_reclen;
259*333d2b36SAndroid Build Coastguard Worker				0x28, 0x00,
260*333d2b36SAndroid Build Coastguard Worker				// unsigned char d_type;
261*333d2b36SAndroid Build Coastguard Worker				0x04,
262*333d2b36SAndroid Build Coastguard Worker				// char d_name[];
263*333d2b36SAndroid Build Coastguard Worker				0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x00,
264*333d2b36SAndroid Build Coastguard Worker
265*333d2b36SAndroid Build Coastguard Worker				// __ino64_t d_ino;
266*333d2b36SAndroid Build Coastguard Worker				0xfb, 0x10, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00,
267*333d2b36SAndroid Build Coastguard Worker				// __off64_t d_off;
268*333d2b36SAndroid Build Coastguard Worker				0xeb, 0x85, 0x20, 0x91, 0xb9, 0x14, 0x34, 0x03,
269*333d2b36SAndroid Build Coastguard Worker				// unsigned short int d_reclen;
270*333d2b36SAndroid Build Coastguard Worker				0x10, 0x00,
271*333d2b36SAndroid Build Coastguard Worker				// unsigned char d_type;
272*333d2b36SAndroid Build Coastguard Worker				0x04,
273*333d2b36SAndroid Build Coastguard Worker				// char d_name[];
274*333d2b36SAndroid Build Coastguard Worker				0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73,
275*333d2b36SAndroid Build Coastguard Worker				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
276*333d2b36SAndroid Build Coastguard Worker			},
277*333d2b36SAndroid Build Coastguard Worker			out: []*dirEntryInfo{
278*333d2b36SAndroid Build Coastguard Worker				{".module_path", os.ModeDir, true},
279*333d2b36SAndroid Build Coastguard Worker			},
280*333d2b36SAndroid Build Coastguard Worker		},
281*333d2b36SAndroid Build Coastguard Worker		{
282*333d2b36SAndroid Build Coastguard Worker			// Test a reclen that goes past the end of the buffer.
283*333d2b36SAndroid Build Coastguard Worker			name: "overrun",
284*333d2b36SAndroid Build Coastguard Worker			in: []byte{
285*333d2b36SAndroid Build Coastguard Worker				// __ino64_t d_ino;
286*333d2b36SAndroid Build Coastguard Worker				0xfb, 0x10, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00,
287*333d2b36SAndroid Build Coastguard Worker				// __off64_t d_off;
288*333d2b36SAndroid Build Coastguard Worker				0xeb, 0x85, 0x20, 0x91, 0xb9, 0x14, 0x34, 0x03,
289*333d2b36SAndroid Build Coastguard Worker				// unsigned short int d_reclen;
290*333d2b36SAndroid Build Coastguard Worker				0x30, 0x00,
291*333d2b36SAndroid Build Coastguard Worker				// unsigned char d_type;
292*333d2b36SAndroid Build Coastguard Worker				0x04,
293*333d2b36SAndroid Build Coastguard Worker				// char d_name[];
294*333d2b36SAndroid Build Coastguard Worker				0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x00,
295*333d2b36SAndroid Build Coastguard Worker			},
296*333d2b36SAndroid Build Coastguard Worker			out: nil,
297*333d2b36SAndroid Build Coastguard Worker		},
298*333d2b36SAndroid Build Coastguard Worker	}
299*333d2b36SAndroid Build Coastguard Worker
300*333d2b36SAndroid Build Coastguard Worker	if runtime.GOOS != "linux" {
301*333d2b36SAndroid Build Coastguard Worker		t.Skip("depends on Linux definitions of syscall.Dirent")
302*333d2b36SAndroid Build Coastguard Worker	}
303*333d2b36SAndroid Build Coastguard Worker
304*333d2b36SAndroid Build Coastguard Worker	for _, testCase := range testCases {
305*333d2b36SAndroid Build Coastguard Worker		t.Run(testCase.name, func(t *testing.T) {
306*333d2b36SAndroid Build Coastguard Worker			entries := parseDirent(testCase.in, nil)
307*333d2b36SAndroid Build Coastguard Worker			if !reflect.DeepEqual(testCase.out, entries) {
308*333d2b36SAndroid Build Coastguard Worker				t.Fatalf("expected:\n %v\ngot:\n %v\n", testCase.out, entries)
309*333d2b36SAndroid Build Coastguard Worker			}
310*333d2b36SAndroid Build Coastguard Worker		})
311*333d2b36SAndroid Build Coastguard Worker	}
312*333d2b36SAndroid Build Coastguard Worker}
313