1*333d2b36SAndroid Build Coastguard Workerpackage mk2rbc 2*333d2b36SAndroid Build Coastguard Worker 3*333d2b36SAndroid Build Coastguard Workerimport ( 4*333d2b36SAndroid Build Coastguard Worker "io/fs" 5*333d2b36SAndroid Build Coastguard Worker "os" 6*333d2b36SAndroid Build Coastguard Worker "path/filepath" 7*333d2b36SAndroid Build Coastguard Worker "time" 8*333d2b36SAndroid Build Coastguard Worker) 9*333d2b36SAndroid Build Coastguard Worker 10*333d2b36SAndroid Build Coastguard Worker// Mock FS. Maps a directory name to an array of entries. 11*333d2b36SAndroid Build Coastguard Worker// An entry implements fs.DirEntry, fs.FIleInfo and fs.File interface 12*333d2b36SAndroid Build Coastguard Workertype FindMockFS struct { 13*333d2b36SAndroid Build Coastguard Worker dirs map[string][]myFileInfo 14*333d2b36SAndroid Build Coastguard Worker} 15*333d2b36SAndroid Build Coastguard Worker 16*333d2b36SAndroid Build Coastguard Workerfunc (m FindMockFS) locate(name string) (myFileInfo, bool) { 17*333d2b36SAndroid Build Coastguard Worker if name == "." { 18*333d2b36SAndroid Build Coastguard Worker return myFileInfo{".", true}, true 19*333d2b36SAndroid Build Coastguard Worker } 20*333d2b36SAndroid Build Coastguard Worker dir := filepath.Dir(name) 21*333d2b36SAndroid Build Coastguard Worker base := filepath.Base(name) 22*333d2b36SAndroid Build Coastguard Worker if entries, ok := m.dirs[dir]; ok { 23*333d2b36SAndroid Build Coastguard Worker for _, e := range entries { 24*333d2b36SAndroid Build Coastguard Worker if e.name == base { 25*333d2b36SAndroid Build Coastguard Worker return e, true 26*333d2b36SAndroid Build Coastguard Worker } 27*333d2b36SAndroid Build Coastguard Worker } 28*333d2b36SAndroid Build Coastguard Worker } 29*333d2b36SAndroid Build Coastguard Worker return myFileInfo{}, false 30*333d2b36SAndroid Build Coastguard Worker} 31*333d2b36SAndroid Build Coastguard Worker 32*333d2b36SAndroid Build Coastguard Workerfunc (m FindMockFS) create(name string, isDir bool) { 33*333d2b36SAndroid Build Coastguard Worker dir := filepath.Dir(name) 34*333d2b36SAndroid Build Coastguard Worker m.dirs[dir] = append(m.dirs[dir], myFileInfo{filepath.Base(name), isDir}) 35*333d2b36SAndroid Build Coastguard Worker} 36*333d2b36SAndroid Build Coastguard Worker 37*333d2b36SAndroid Build Coastguard Workerfunc (m FindMockFS) Stat(name string) (fs.FileInfo, error) { 38*333d2b36SAndroid Build Coastguard Worker if fi, ok := m.locate(name); ok { 39*333d2b36SAndroid Build Coastguard Worker return fi, nil 40*333d2b36SAndroid Build Coastguard Worker } 41*333d2b36SAndroid Build Coastguard Worker return nil, os.ErrNotExist 42*333d2b36SAndroid Build Coastguard Worker} 43*333d2b36SAndroid Build Coastguard Worker 44*333d2b36SAndroid Build Coastguard Workertype myFileInfo struct { 45*333d2b36SAndroid Build Coastguard Worker name string 46*333d2b36SAndroid Build Coastguard Worker isDir bool 47*333d2b36SAndroid Build Coastguard Worker} 48*333d2b36SAndroid Build Coastguard Worker 49*333d2b36SAndroid Build Coastguard Workerfunc (m myFileInfo) Info() (fs.FileInfo, error) { 50*333d2b36SAndroid Build Coastguard Worker panic("implement me") 51*333d2b36SAndroid Build Coastguard Worker} 52*333d2b36SAndroid Build Coastguard Worker 53*333d2b36SAndroid Build Coastguard Workerfunc (m myFileInfo) Size() int64 { 54*333d2b36SAndroid Build Coastguard Worker panic("implement me") 55*333d2b36SAndroid Build Coastguard Worker} 56*333d2b36SAndroid Build Coastguard Worker 57*333d2b36SAndroid Build Coastguard Workerfunc (m myFileInfo) Mode() fs.FileMode { 58*333d2b36SAndroid Build Coastguard Worker panic("implement me") 59*333d2b36SAndroid Build Coastguard Worker} 60*333d2b36SAndroid Build Coastguard Worker 61*333d2b36SAndroid Build Coastguard Workerfunc (m myFileInfo) ModTime() time.Time { 62*333d2b36SAndroid Build Coastguard Worker panic("implement me") 63*333d2b36SAndroid Build Coastguard Worker} 64*333d2b36SAndroid Build Coastguard Worker 65*333d2b36SAndroid Build Coastguard Workerfunc (m myFileInfo) Sys() interface{} { 66*333d2b36SAndroid Build Coastguard Worker return nil 67*333d2b36SAndroid Build Coastguard Worker} 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Workerfunc (m myFileInfo) Stat() (fs.FileInfo, error) { 70*333d2b36SAndroid Build Coastguard Worker return m, nil 71*333d2b36SAndroid Build Coastguard Worker} 72*333d2b36SAndroid Build Coastguard Worker 73*333d2b36SAndroid Build Coastguard Workerfunc (m myFileInfo) Read(bytes []byte) (int, error) { 74*333d2b36SAndroid Build Coastguard Worker panic("implement me") 75*333d2b36SAndroid Build Coastguard Worker} 76*333d2b36SAndroid Build Coastguard Worker 77*333d2b36SAndroid Build Coastguard Workerfunc (m myFileInfo) Close() error { 78*333d2b36SAndroid Build Coastguard Worker panic("implement me") 79*333d2b36SAndroid Build Coastguard Worker} 80*333d2b36SAndroid Build Coastguard Worker 81*333d2b36SAndroid Build Coastguard Workerfunc (m myFileInfo) Name() string { 82*333d2b36SAndroid Build Coastguard Worker return m.name 83*333d2b36SAndroid Build Coastguard Worker} 84*333d2b36SAndroid Build Coastguard Worker 85*333d2b36SAndroid Build Coastguard Workerfunc (m myFileInfo) IsDir() bool { 86*333d2b36SAndroid Build Coastguard Worker return m.isDir 87*333d2b36SAndroid Build Coastguard Worker} 88*333d2b36SAndroid Build Coastguard Worker 89*333d2b36SAndroid Build Coastguard Workerfunc (m myFileInfo) Type() fs.FileMode { 90*333d2b36SAndroid Build Coastguard Worker return m.Mode() 91*333d2b36SAndroid Build Coastguard Worker} 92*333d2b36SAndroid Build Coastguard Worker 93*333d2b36SAndroid Build Coastguard Workerfunc (m FindMockFS) Open(name string) (fs.File, error) { 94*333d2b36SAndroid Build Coastguard Worker panic("implement me") 95*333d2b36SAndroid Build Coastguard Worker} 96*333d2b36SAndroid Build Coastguard Worker 97*333d2b36SAndroid Build Coastguard Workerfunc (m FindMockFS) ReadDir(name string) ([]fs.DirEntry, error) { 98*333d2b36SAndroid Build Coastguard Worker if d, ok := m.dirs[name]; ok { 99*333d2b36SAndroid Build Coastguard Worker var res []fs.DirEntry 100*333d2b36SAndroid Build Coastguard Worker for _, e := range d { 101*333d2b36SAndroid Build Coastguard Worker res = append(res, e) 102*333d2b36SAndroid Build Coastguard Worker } 103*333d2b36SAndroid Build Coastguard Worker return res, nil 104*333d2b36SAndroid Build Coastguard Worker } 105*333d2b36SAndroid Build Coastguard Worker return nil, os.ErrNotExist 106*333d2b36SAndroid Build Coastguard Worker} 107*333d2b36SAndroid Build Coastguard Worker 108*333d2b36SAndroid Build Coastguard Workerfunc NewFindMockFS(files []string) FindMockFS { 109*333d2b36SAndroid Build Coastguard Worker myfs := FindMockFS{make(map[string][]myFileInfo)} 110*333d2b36SAndroid Build Coastguard Worker for _, f := range files { 111*333d2b36SAndroid Build Coastguard Worker isDir := false 112*333d2b36SAndroid Build Coastguard Worker for f != "." { 113*333d2b36SAndroid Build Coastguard Worker if _, ok := myfs.locate(f); !ok { 114*333d2b36SAndroid Build Coastguard Worker myfs.create(f, isDir) 115*333d2b36SAndroid Build Coastguard Worker } 116*333d2b36SAndroid Build Coastguard Worker isDir = true 117*333d2b36SAndroid Build Coastguard Worker f = filepath.Dir(f) 118*333d2b36SAndroid Build Coastguard Worker } 119*333d2b36SAndroid Build Coastguard Worker } 120*333d2b36SAndroid Build Coastguard Worker return myfs 121*333d2b36SAndroid Build Coastguard Worker} 122