1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package fstest
20
21 import (
22 "io/fs"
23 "os"
24 "path"
25 "path/filepath"
26 "runtime"
27 "testing/fstest"
28 "time"
29 )
30
31 var files = []struct {
32 name string
33 file *fstest.MapFile
34 }{
35 {
36 name: ".",
37 file: &fstest.MapFile{
38 Mode: fs.ModeDir | 0o755,
39 ModTime: time.Unix(1609459200, 0),
40 },
41 },
42 {name: "empty.txt", file: &fstest.MapFile{Mode: 0o600}},
43 {name: "emptydir", file: &fstest.MapFile{Mode: fs.ModeDir | 0o755}},
44 {name: "animals.txt", file: &fstest.MapFile{Data: []byte(`bear
45 cat
46 shark
47 dinosaur
48 human
49 `), Mode: 0o644, ModTime: time.Unix(1667482413, 0)}},
50 {name: "sub", file: &fstest.MapFile{
51 Mode: fs.ModeDir | 0o755,
52 ModTime: time.Unix(1640995200, 0),
53 }},
54 {name: "sub/test.txt", file: &fstest.MapFile{
55 Data: []byte("greet sub dir\n"),
56 Mode: 0o444,
57 ModTime: time.Unix(1672531200, 0),
58 }},
59 {name: "dir", file: &fstest.MapFile{Mode: fs.ModeDir | 0o755}},
60 {name: "dir/-", file: &fstest.MapFile{Mode: 0o400}},
61 {name: "dir/a-", file: &fstest.MapFile{Mode: fs.ModeDir | 0o755}},
62 {name: "dir/ab-", file: &fstest.MapFile{Mode: 0o400}},
63 }
64
65
66 var FS = func() fstest.MapFS {
67 testFS := make(fstest.MapFS, len(files))
68 for _, nf := range files {
69 testFS[nf.name] = nf.file
70 }
71 return testFS
72 }()
73
74
75
76 func WriteTestFiles(tmpDir string) (err error) {
77
78
79 for _, nf := range files {
80 if err = writeTestFile(tmpDir, nf.name, nf.file); err != nil {
81 return
82 }
83 }
84
85
86
87
88
89
90 if runtime.GOOS == "windows" {
91 return filepath.WalkDir(tmpDir, func(path string, d fs.DirEntry, err error) error {
92 if err != nil {
93 return err
94 }
95 info, err := d.Info()
96 if err != nil {
97 return err
98 }
99
100
101 st, err := os.Stat(path)
102 if err != nil {
103 return err
104 } else if st.ModTime() == info.ModTime() {
105 return nil
106 }
107
108
109 atimeNsec, mtimeNsec := timesFromFileInfo(st)
110 return os.Chtimes(path, time.Unix(0, atimeNsec), time.Unix(0, mtimeNsec))
111 })
112 }
113 return
114 }
115
116
117
118 func TestFS(testfs fs.FS) error {
119 expected := make([]string, 0, len(files))
120 for _, nf := range files[1:] {
121 expected = append(expected, nf.name)
122 }
123 return fstest.TestFS(testfs, expected...)
124 }
125
126 var defaultTime = time.Unix(1577836800, 0)
127
128 func writeTestFile(tmpDir, name string, file *fstest.MapFile) (err error) {
129 fullPath := path.Join(tmpDir, name)
130 if mode := file.Mode; mode&fs.ModeDir != 0 {
131 if name != "." {
132 err = os.Mkdir(fullPath, mode)
133 }
134 } else {
135 err = os.WriteFile(fullPath, file.Data, mode)
136 }
137
138 if err != nil {
139 return
140 }
141
142 mtim := file.ModTime
143 if mtim.Unix() == 0 {
144 mtim = defaultTime
145 }
146 return os.Chtimes(fullPath, mtim, mtim)
147 }
148
View as plain text