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