1
2
3
4 package copyutil_test
5
6 import (
7 "fmt"
8 "os"
9 "path/filepath"
10 "testing"
11
12 "github.com/stretchr/testify/assert"
13 "github.com/stretchr/testify/require"
14 . "sigs.k8s.io/kustomize/kyaml/copyutil"
15 "sigs.k8s.io/kustomize/kyaml/filesys"
16 )
17
18
19 func TestDiff_identical(t *testing.T) {
20 s := t.TempDir()
21 d := t.TempDir()
22
23 err := os.Mkdir(filepath.Join(s, "a1"), 0700)
24 require.NoError(t, err)
25 err = os.WriteFile(
26 filepath.Join(s, "a1", "f.yaml"), []byte(`a`), 0600)
27 require.NoError(t, err)
28
29 err = os.Mkdir(filepath.Join(d, "a1"), 0700)
30 require.NoError(t, err)
31 err = os.WriteFile(
32 filepath.Join(d, "a1", "f.yaml"), []byte(`a`), 0600)
33 require.NoError(t, err)
34
35 diff, err := Diff(s, d)
36 require.NoError(t, err)
37 assert.Empty(t, diff.List())
38 }
39
40
41
42 func TestDiff_additionalSourceFiles(t *testing.T) {
43 s := t.TempDir()
44 d := t.TempDir()
45
46 err := os.Mkdir(filepath.Join(s, "a1"), 0700)
47 require.NoError(t, err)
48
49 err = os.Mkdir(filepath.Join(s, "a2"), 0700)
50 require.NoError(t, err)
51
52 err = os.Mkdir(filepath.Join(d, "a1"), 0700)
53 require.NoError(t, err)
54
55 diff, err := Diff(s, d)
56 require.NoError(t, err)
57 assert.ElementsMatch(t, diff.List(), []string{"a2"})
58 }
59
60
61
62 func TestDiff_additionalDestFiles(t *testing.T) {
63 s := t.TempDir()
64 d := t.TempDir()
65
66 err := os.Mkdir(filepath.Join(s, "a1"), 0700)
67 require.NoError(t, err)
68
69 err = os.Mkdir(filepath.Join(d, "a1"), 0700)
70 require.NoError(t, err)
71
72 err = os.Mkdir(filepath.Join(d, "a2"), 0700)
73 require.NoError(t, err)
74
75 diff, err := Diff(s, d)
76 require.NoError(t, err)
77 assert.ElementsMatch(t, diff.List(), []string{"a2"})
78 }
79
80
81
82
83 func TestDiff_srcDestContentsDiffer(t *testing.T) {
84 s := t.TempDir()
85 d := t.TempDir()
86
87 err := os.Mkdir(filepath.Join(s, "a1"), 0700)
88 require.NoError(t, err)
89 err = os.WriteFile(
90 filepath.Join(s, "a1", "f.yaml"), []byte(`a`), 0600)
91 require.NoError(t, err)
92
93 err = os.Mkdir(filepath.Join(d, "a1"), 0700)
94 require.NoError(t, err)
95 err = os.WriteFile(
96 filepath.Join(d, "a1", "f.yaml"), []byte(`b`), 0600)
97 require.NoError(t, err)
98
99 diff, err := Diff(s, d)
100 require.NoError(t, err)
101 assert.ElementsMatch(t, diff.List(), []string{
102 fmt.Sprintf("a1%sf.yaml", string(filepath.Separator)),
103 })
104 }
105
106
107
108 func TestDiff_srcDestContentsDifferInDirs(t *testing.T) {
109 s := t.TempDir()
110 d := t.TempDir()
111
112 err := os.Mkdir(filepath.Join(s, "a1"), 0700)
113 require.NoError(t, err)
114 err = os.WriteFile(
115 filepath.Join(s, "a1", "f.yaml"), []byte(`a`), 0600)
116 require.NoError(t, err)
117
118 err = os.Mkdir(filepath.Join(d, "b1"), 0700)
119 require.NoError(t, err)
120 err = os.WriteFile(
121 filepath.Join(d, "b1", "f.yaml"), []byte(`a`), 0600)
122 require.NoError(t, err)
123
124 diff, err := Diff(s, d)
125 require.NoError(t, err)
126 assert.ElementsMatch(t, diff.List(), []string{
127 "a1",
128 fmt.Sprintf("a1%sf.yaml", string(filepath.Separator)),
129 fmt.Sprintf("b1%sf.yaml", string(filepath.Separator)),
130 "b1",
131 })
132 }
133
134
135
136 func TestDiff_skipGitSrc(t *testing.T) {
137 s := t.TempDir()
138 d := t.TempDir()
139
140 err := os.Mkdir(filepath.Join(s, "a1"), 0700)
141 require.NoError(t, err)
142 err = os.WriteFile(
143 filepath.Join(s, "a1", "f.yaml"), []byte(`a`), 0600)
144 require.NoError(t, err)
145
146
147 err = os.WriteFile(
148 filepath.Join(s, ".gitlab-ci.yml"), []byte(`a`), 0600)
149 require.NoError(t, err)
150
151
152 err = os.Mkdir(filepath.Join(s, ".git"), 0700)
153 require.NoError(t, err)
154 err = os.WriteFile(
155 filepath.Join(s, ".git", "f.yaml"), []byte(`a`), 0600)
156 require.NoError(t, err)
157
158 err = os.Mkdir(filepath.Join(d, "a1"), 0700)
159 require.NoError(t, err)
160 err = os.WriteFile(
161 filepath.Join(d, "a1", "f.yaml"), []byte(`a`), 0600)
162 require.NoError(t, err)
163
164 err = os.WriteFile(
165 filepath.Join(d, ".gitlab-ci.yml"), []byte(`a`), 0600)
166 require.NoError(t, err)
167
168 diff, err := Diff(s, d)
169 require.NoError(t, err)
170 assert.Empty(t, diff.List())
171 }
172
173
174
175 func TestDiff_skipGitDest(t *testing.T) {
176 s := t.TempDir()
177 d := t.TempDir()
178
179 err := os.Mkdir(filepath.Join(s, "a1"), 0700)
180 require.NoError(t, err)
181 err = os.WriteFile(
182 filepath.Join(s, "a1", "f.yaml"), []byte(`a`), 0600)
183 require.NoError(t, err)
184
185 err = os.Mkdir(filepath.Join(d, "a1"), 0700)
186 require.NoError(t, err)
187 err = os.WriteFile(
188 filepath.Join(d, "a1", "f.yaml"), []byte(`a`), 0600)
189 require.NoError(t, err)
190
191
192 err = os.Mkdir(filepath.Join(d, ".git"), 0700)
193 require.NoError(t, err)
194 err = os.WriteFile(
195 filepath.Join(d, ".git", "f.yaml"), []byte(`a`), 0600)
196 require.NoError(t, err)
197
198 diff, err := Diff(s, d)
199 require.NoError(t, err)
200 assert.Empty(t, diff.List())
201 }
202
203
204 func TestSyncFile(t *testing.T) {
205 d1 := t.TempDir()
206 d2 := t.TempDir()
207 f1Name := d1 + "/temp.txt"
208 f2Name := d2 + "/temp.txt"
209 err := os.WriteFile(f1Name, []byte("abc"), 0600)
210 require.NoError(t, err)
211 err = os.WriteFile(f2Name, []byte("def"), 0644)
212 expectedFileInfo, _ := os.Stat(f2Name)
213 require.NoError(t, err)
214 err = SyncFile(f1Name, f2Name)
215 require.NoError(t, err)
216 actual, err := os.ReadFile(f2Name)
217 require.NoError(t, err)
218 assert.Equal(t, "abc", string(actual))
219 dstFileInfo, _ := os.Stat(f2Name)
220 assert.Equal(t, expectedFileInfo.Mode().String(), dstFileInfo.Mode().String())
221 }
222
223
224 func TestSyncFileNoDestFile(t *testing.T) {
225 d1 := t.TempDir()
226 d2 := t.TempDir()
227 f1Name := d1 + "/temp.txt"
228 f2Name := d2 + "/temp.txt"
229 err := os.WriteFile(f1Name, []byte("abc"), 0644)
230 require.NoError(t, err)
231 err = SyncFile(f1Name, f2Name)
232 require.NoError(t, err)
233 actual, err := os.ReadFile(f2Name)
234 require.NoError(t, err)
235 assert.Equal(t, "abc", string(actual))
236 dstFileInfo, _ := os.Stat(f2Name)
237 srcFileInfo, _ := os.Stat(f1Name)
238 assert.Equal(t, srcFileInfo.Mode().String(), dstFileInfo.Mode().String())
239 }
240
241
242 func TestSyncFileNoSrcFile(t *testing.T) {
243 d1 := t.TempDir()
244 d2 := t.TempDir()
245 f1Name := d1 + "/temp.txt"
246 f2Name := d2 + "/temp.txt"
247 err := os.WriteFile(f2Name, []byte("abc"), 0644)
248 require.NoError(t, err)
249 err = SyncFile(f1Name, f2Name)
250 require.NoError(t, err)
251 _, err = os.ReadFile(f2Name)
252 require.Error(t, err)
253 }
254
255 func TestPrettyFileDiff(t *testing.T) {
256 s1 := `apiVersion: someversion/v1alpha2
257 kind: ContainerCluster
258 metadata:
259 clusterName: "some_cluster"
260 name: asm-cluster
261 namespace: "PROJECT_ID" # {"$ref":"#/definitions/io.k8s.cli.setters.gcloud.core.project"}`
262
263 s2 := `apiVersion: someversion/v1alpha2
264 kind: ContainerCluster
265 metadata:
266 clusterName: "some_cluster"
267 name: asm-cluster
268 namespace: "some_project" # {"$ref":"#/definitions/io.k8s.cli.setters.gcloud.core.project"}`
269
270 expectedLine1 := `[31m namespace: "PROJECT_ID" # {"$ref":"#/definitions/io.k8s.cli.setters.gcloud.core.project"}`
271 expectedLine2 := `[32m namespace: "some_project" # {"$ref":"#/definitions/io.k8s.cli.setters.gcloud.core.project"}`
272
273 assert.Contains(t, PrettyFileDiff(s1, s2), expectedLine1)
274 assert.Contains(t, PrettyFileDiff(s1, s2), expectedLine2)
275 }
276
277 func TestCopyDir(t *testing.T) {
278 s := t.TempDir()
279 v := t.TempDir()
280
281 err := os.Mkdir(filepath.Join(s, "a1"), 0700)
282 require.NoError(t, err)
283 err = os.WriteFile(
284 filepath.Join(s, "a1", "f.yaml"), []byte(`a`), 0600)
285 require.NoError(t, err)
286
287
288 err = os.WriteFile(
289 filepath.Join(s, ".gitlab-ci.yml"), []byte(`a`), 0600)
290 require.NoError(t, err)
291
292
293 err = os.Mkdir(filepath.Join(s, ".git"), 0700)
294 require.NoError(t, err)
295 err = os.WriteFile(
296 filepath.Join(s, ".git", "f.yaml"), []byte(`a`), 0600)
297 require.NoError(t, err)
298
299 err = os.Mkdir(filepath.Join(v, "a1"), 0700)
300 require.NoError(t, err)
301 err = os.WriteFile(
302 filepath.Join(v, "a1", "f.yaml"), []byte(`a`), 0600)
303 require.NoError(t, err)
304
305 err = os.WriteFile(
306 filepath.Join(v, ".gitlab-ci.yml"), []byte(`a`), 0600)
307 require.NoError(t, err)
308
309 d := t.TempDir()
310
311 err = CopyDir(filesys.MakeFsOnDisk(), s, d)
312 require.NoError(t, err)
313
314 diff, err := Diff(d, v)
315 require.NoError(t, err)
316 assert.Empty(t, diff.List())
317 }
318
319 func TestIsDotGitFolder(t *testing.T) {
320 testCases := []struct {
321 name string
322 path string
323 isDotGitFolder bool
324 }{
325 {
326 name: ".git folder",
327 path: "/foo/bar/.git",
328 isDotGitFolder: true,
329 },
330 {
331 name: "subfolder of .git folder",
332 path: "/foo/.git/bar/zoo",
333 isDotGitFolder: true,
334 },
335 {
336 name: "subfolder of .gitignore folder",
337 path: "/foo/.gitignore/bar",
338 isDotGitFolder: false,
339 },
340 {
341 name: ".gitignore file",
342 path: "foo/bar/.gitignore",
343 isDotGitFolder: false,
344 },
345 {
346 name: ".gitlab-ci.yml under .git folder",
347 path: "/foo/.git/bar/.gitignore",
348 isDotGitFolder: true,
349 },
350 {
351 name: "windows path with .git folder",
352 path: "c:/foo/.git/bar",
353 isDotGitFolder: true,
354 },
355 {
356 name: "windows path with .gitignore file",
357 path: "d:/foo/bar/.gitignore",
358 isDotGitFolder: false,
359 },
360 }
361
362 for i := range testCases {
363 test := testCases[i]
364 t.Run(test.name, func(t *testing.T) {
365 assert.Equal(t, test.isDotGitFolder, IsDotGitFolder(test.path))
366 })
367 }
368 }
369
View as plain text