1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package file
16
17 import (
18 "fmt"
19 "os"
20 "path/filepath"
21 "reflect"
22 "testing"
23
24 "cuelang.org/go/cue"
25 "cuelang.org/go/cue/parser"
26 "cuelang.org/go/internal/task"
27 "cuelang.org/go/internal/value"
28 )
29
30 func parse(t *testing.T, kind, expr string) cue.Value {
31 t.Helper()
32
33 x, err := parser.ParseExpr("test", expr)
34 if err != nil {
35 t.Fatal(err)
36 }
37 var r cue.Runtime
38 i, err := r.CompileExpr(x)
39 if err != nil {
40 t.Fatal(err)
41 }
42 return value.UnifyBuiltin(i.Value(), kind)
43 }
44
45 func TestRead(t *testing.T) {
46 v := parse(t, "tool/file.Read", `{filename: "testdata/input.foo"}`)
47 got, err := (*cmdRead).Run(nil, &task.Context{Obj: v})
48 if err != nil {
49 t.Fatal(err)
50 }
51 want := map[string]interface{}{"contents": []byte("This is a test.")}
52 if !reflect.DeepEqual(got, want) {
53 t.Errorf("got %v; want %v", got, want)
54 }
55
56 v = parse(t, "tool/file.Read", `{
57 filename: "testdata/input.foo"
58 contents: string
59 }`)
60 got, err = (*cmdRead).Run(nil, &task.Context{Obj: v})
61 if err != nil {
62 t.Fatal(err)
63 }
64 want = map[string]interface{}{"contents": "This is a test."}
65 if !reflect.DeepEqual(got, want) {
66 t.Errorf("got %v; want %v", got, want)
67 }
68 }
69
70 func TestAppend(t *testing.T) {
71 name := filepath.Join(t.TempDir(), "file")
72 name = filepath.ToSlash(name)
73
74 v := parse(t, "tool/file.Append", fmt.Sprintf(`{
75 filename: "%s"
76 contents: "This is a test."
77 }`, name))
78 _, err := (*cmdAppend).Run(nil, &task.Context{Obj: v})
79 if err != nil {
80 t.Fatal(err)
81 }
82
83 b, err := os.ReadFile(name)
84 if err != nil {
85 t.Fatal(err)
86 }
87
88 if got, want := string(b), "This is a test."; got != want {
89 t.Errorf("got %v; want %v", got, want)
90 }
91 }
92
93 func TestCreate(t *testing.T) {
94 name := filepath.Join(t.TempDir(), "file")
95 name = filepath.ToSlash(name)
96
97 v := parse(t, "tool/file.Create", fmt.Sprintf(`{
98 filename: "%s"
99 contents: "This is a test."
100 }`, name))
101 _, err := (*cmdCreate).Run(nil, &task.Context{Obj: v})
102 if err != nil {
103 t.Fatal(err)
104 }
105
106 b, err := os.ReadFile(name)
107 if err != nil {
108 t.Fatal(err)
109 }
110
111 if got, want := string(b), "This is a test."; got != want {
112 t.Errorf("got %v; want %v", got, want)
113 }
114 }
115
116 func TestGlob(t *testing.T) {
117 v := parse(t, "tool/file.Glob", `{
118 glob: "testdata/input.*"
119 }`)
120 got, err := (*cmdGlob).Run(nil, &task.Context{Obj: v})
121 if err != nil {
122 t.Fatal(err)
123 }
124 if want := map[string]interface{}{"files": []string{"testdata/input.foo"}}; !reflect.DeepEqual(got, want) {
125 t.Errorf("got %v; want %v", got, want)
126 }
127 }
128
129 func TestMkdir(t *testing.T) {
130 baseDir := t.TempDir()
131
132
133 d1 := filepath.Join(baseDir, "foo")
134 v := parse(t, "tool/file.Mkdir", fmt.Sprintf(`{path: #"%s"#}`, d1))
135 _, err := (*cmdMkdir).Run(nil, &task.Context{Obj: v})
136 if err != nil {
137 t.Fatal(err)
138 }
139 fi1, err := os.Stat(d1)
140 if err != nil {
141 t.Fatal(err)
142 }
143 if !fi1.IsDir() {
144 t.Fatal("not a directory")
145 }
146
147
148 v = parse(t, "tool/file.Mkdir", fmt.Sprintf(`{path: #"%s"#}`, d1))
149 _, err = (*cmdMkdir).Run(nil, &task.Context{Obj: v})
150 if err != nil {
151 t.Fatal(err)
152 }
153
154
155
156 d2 := filepath.Join(baseDir, "bar/x")
157 v = parse(t, "tool/file.MkdirAll", fmt.Sprintf(`{path: #"%s"#, permissions: 0o700}`, d2))
158 _, err = (*cmdMkdir).Run(nil, &task.Context{Obj: v})
159 if err != nil {
160 t.Fatal(err)
161 }
162 fi2, err := os.Stat(d2)
163 if err != nil {
164 t.Fatal(err)
165 }
166 if !fi2.IsDir() {
167 t.Fatal("not a directory")
168 }
169
170
171 f, err := os.CreateTemp(baseDir, "")
172 if err != nil {
173 t.Fatal(err)
174 }
175 f.Close()
176 v = parse(t, "tool/file.Mkdir", fmt.Sprintf(`{path: #"%s"#}`, f.Name()))
177 _, err = (*cmdMkdir).Run(nil, &task.Context{Obj: v})
178 if err == nil {
179 t.Fatal("should not create directory at existing filepath")
180 }
181 }
182
183 func TestMkdirTemp(t *testing.T) {
184
185 v := parse(t, "tool/file.MkdirTemp", "{}")
186 r, err := (*cmdMkdirTemp).Run(nil, &task.Context{Obj: v})
187 if err != nil {
188 t.Fatal(err)
189 }
190 if _, exists := r.(map[string]interface{})["path"]; !exists {
191 t.Fatal("no directory path returned")
192 }
193 path := r.(map[string]interface{})["path"].(string)
194 t.Cleanup(func() { os.RemoveAll(path) })
195 fi, err := os.Stat(path)
196 if err != nil {
197 t.Fatal(err)
198 }
199 if !fi.IsDir() {
200 t.Fatal("not a directory")
201 }
202
203
204 v2 := parse(t, "tool/file.RemoveAll", fmt.Sprintf(`{path: #"%s"#}`, path))
205 _, err = (*cmdRemoveAll).Run(nil, &task.Context{Obj: v2})
206 if err != nil {
207 t.Fatal(err)
208 }
209 _, err = os.Stat(path)
210 if err == nil {
211 t.Fatal(err)
212 }
213
214 }
215
View as plain text