xref: /aosp_15_r20/build/soong/mk2rbc/find_mockfs.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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