Browse code

Builder/context unit tests

Signed-off-by: Tomasz Kopczynski <tomek@kopczynski.net.pl>

Tomasz Kopczynski authored on 2016/03/09 06:43:38
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,416 @@
0
+package builder
1
+
2
+import (
3
+	"archive/tar"
4
+	"bytes"
5
+	"io"
6
+	"io/ioutil"
7
+	"os"
8
+	"path/filepath"
9
+	"strings"
10
+	"testing"
11
+
12
+	"github.com/docker/docker/pkg/archive"
13
+)
14
+
15
+const (
16
+	dockerfileTestName = "Dockerfile-test"
17
+	dockerfileContent  = "FROM busybox"
18
+)
19
+
20
+var prepareEmpty = func(t *testing.T) string {
21
+	return ""
22
+}
23
+
24
+var prepareNoFiles = func(t *testing.T) string {
25
+	contextDir, err := ioutil.TempDir("", "builder-context-test")
26
+
27
+	if err != nil {
28
+		t.Fatalf("Error when creating temporary directory: %s", err)
29
+	}
30
+
31
+	return contextDir
32
+}
33
+
34
+var prepareOneFile = func(t *testing.T) string {
35
+	contextDir, err := ioutil.TempDir("", "builder-context-test")
36
+
37
+	if err != nil {
38
+		t.Fatalf("Error when creating temporary directory: %s", err)
39
+	}
40
+
41
+	dockerfileFilename := filepath.Join(contextDir, dockerfileTestName)
42
+	err = ioutil.WriteFile(dockerfileFilename, []byte(dockerfileContent), 0777)
43
+
44
+	if err != nil {
45
+		t.Fatalf("Error with writing to file: %s", err)
46
+	}
47
+
48
+	return contextDir
49
+}
50
+
51
+func testValidateContextDirectory(t *testing.T, prepare func(t *testing.T) string, excludes []string) {
52
+	contextDir := prepare(t)
53
+
54
+	defer os.RemoveAll(contextDir)
55
+
56
+	err := ValidateContextDirectory(contextDir, excludes)
57
+
58
+	if err != nil {
59
+		t.Fatalf("Error should be nil, got: %s", err)
60
+	}
61
+}
62
+
63
+func TestGetContextFromLocalDirNoDockerfile(t *testing.T) {
64
+	contextDir, err := ioutil.TempDir("", "builder-context-test")
65
+
66
+	defer os.RemoveAll(contextDir)
67
+
68
+	if err != nil {
69
+		t.Fatalf("Error with creating temporary directory: %s", err)
70
+	}
71
+
72
+	absContextDir, relDockerfile, err := GetContextFromLocalDir(contextDir, "")
73
+
74
+	if err == nil {
75
+		t.Fatalf("Error should not be nil")
76
+	}
77
+
78
+	if absContextDir != "" {
79
+		t.Fatalf("Absolute directory path should be empty, got: %s", absContextDir)
80
+	}
81
+
82
+	if relDockerfile != "" {
83
+		t.Fatalf("Relative path to Dockerfile should be empty, got: %s", relDockerfile)
84
+	}
85
+}
86
+
87
+func TestGetContextFromLocalDirNotExistingDir(t *testing.T) {
88
+	contextDir, err := ioutil.TempDir("", "builder-context-test")
89
+
90
+	if err != nil {
91
+		t.Fatalf("Error with creating temporary directory: %s", err)
92
+	}
93
+
94
+	defer os.RemoveAll(contextDir)
95
+
96
+	fakePath := filepath.Join(contextDir, "fake")
97
+
98
+	absContextDir, relDockerfile, err := GetContextFromLocalDir(fakePath, "")
99
+
100
+	if err == nil {
101
+		t.Fatalf("Error should not be nil")
102
+	}
103
+
104
+	if absContextDir != "" {
105
+		t.Fatalf("Absolute directory path should be empty, got: %s", absContextDir)
106
+	}
107
+
108
+	if relDockerfile != "" {
109
+		t.Fatalf("Relative path to Dockerfile should be empty, got: %s", relDockerfile)
110
+	}
111
+}
112
+
113
+func TestGetContextFromLocalDirNotExistingDockerfile(t *testing.T) {
114
+	contextDir, err := ioutil.TempDir("", "builder-context-test")
115
+
116
+	if err != nil {
117
+		t.Fatalf("Error with creating temporary directory: %s", err)
118
+	}
119
+
120
+	defer os.RemoveAll(contextDir)
121
+
122
+	fakePath := filepath.Join(contextDir, "fake")
123
+
124
+	absContextDir, relDockerfile, err := GetContextFromLocalDir(contextDir, fakePath)
125
+
126
+	if err == nil {
127
+		t.Fatalf("Error should not be nil")
128
+	}
129
+
130
+	if absContextDir != "" {
131
+		t.Fatalf("Absolute directory path should be empty, got: %s", absContextDir)
132
+	}
133
+
134
+	if relDockerfile != "" {
135
+		t.Fatalf("Relative path to Dockerfile should be empty, got: %s", relDockerfile)
136
+	}
137
+}
138
+
139
+func TestGetContextFromLocalDirWithNoDirectory(t *testing.T) {
140
+	contextDir, err := ioutil.TempDir("", "builder-context-test")
141
+
142
+	if err != nil {
143
+		t.Fatalf("Error with creating temporary directory: %s", err)
144
+	}
145
+
146
+	defer os.RemoveAll(contextDir)
147
+
148
+	dockerfileFilename := filepath.Join(contextDir, DefaultDockerfileName)
149
+	err = ioutil.WriteFile(dockerfileFilename, []byte(dockerfileContent), 0777)
150
+
151
+	if err != nil {
152
+		t.Fatalf("Error when writing file (%s) contents: %s", dockerfileFilename, err)
153
+	}
154
+
155
+	workingDirectory, err := os.Getwd()
156
+
157
+	if err != nil {
158
+		t.Fatalf("Error when retrieving working directory: %s", err)
159
+	}
160
+
161
+	defer os.Chdir(workingDirectory)
162
+
163
+	err = os.Chdir(contextDir)
164
+
165
+	if err != nil {
166
+		t.Fatalf("Error when changing directory to %s: %s", contextDir, err)
167
+	}
168
+
169
+	absContextDir, relDockerfile, err := GetContextFromLocalDir("", "")
170
+
171
+	if err != nil {
172
+		t.Fatalf("Error when getting context from local dir: %s", err)
173
+	}
174
+
175
+	if absContextDir != contextDir {
176
+		t.Fatalf("Absolute directory path should be equal to %s, got: %s", contextDir, absContextDir)
177
+	}
178
+
179
+	if relDockerfile != DefaultDockerfileName {
180
+		t.Fatalf("Relative path to dockerfile should be equal to %s, got: %s", DefaultDockerfileName, relDockerfile)
181
+	}
182
+}
183
+
184
+func TestGetContextFromLocalDirWithDockerfile(t *testing.T) {
185
+	contextDir, err := ioutil.TempDir("", "builder-context-test")
186
+
187
+	if err != nil {
188
+		t.Fatalf("Error with creating temporary directory: %s", err)
189
+	}
190
+
191
+	defer os.RemoveAll(contextDir)
192
+
193
+	dockerfileFilename := filepath.Join(contextDir, DefaultDockerfileName)
194
+	err = ioutil.WriteFile(dockerfileFilename, []byte(dockerfileContent), 0777)
195
+
196
+	if err != nil {
197
+		t.Fatalf("Error when writing file (%s) contents: %s", dockerfileFilename, err)
198
+	}
199
+
200
+	absContextDir, relDockerfile, err := GetContextFromLocalDir(contextDir, "")
201
+
202
+	if err != nil {
203
+		t.Fatalf("Error when getting context from local dir: %s", err)
204
+	}
205
+
206
+	if absContextDir != contextDir {
207
+		t.Fatalf("Absolute directory path should be equal to %s, got: %s", contextDir, absContextDir)
208
+	}
209
+
210
+	if relDockerfile != DefaultDockerfileName {
211
+		t.Fatalf("Relative path to dockerfile should be equal to %s, got: %s", DefaultDockerfileName, relDockerfile)
212
+	}
213
+}
214
+
215
+func TestGetContextFromLocalDirLocalFile(t *testing.T) {
216
+	contextDir, err := ioutil.TempDir("", "builder-context-test")
217
+
218
+	if err != nil {
219
+		t.Fatalf("Error with creating temporary directory: %s", err)
220
+	}
221
+
222
+	defer os.RemoveAll(contextDir)
223
+
224
+	dockerfileFilename := filepath.Join(contextDir, DefaultDockerfileName)
225
+	err = ioutil.WriteFile(dockerfileFilename, []byte(dockerfileContent), 0777)
226
+
227
+	if err != nil {
228
+		t.Fatalf("Error when writing file (%s) contents: %s", dockerfileFilename, err)
229
+	}
230
+
231
+	testFilename := filepath.Join(contextDir, "tmpTest")
232
+	testContent := "test"
233
+	err = ioutil.WriteFile(testFilename, []byte(testContent), 0777)
234
+
235
+	if err != nil {
236
+		t.Fatalf("Error when writing file (%s) contents: %s", testFilename, err)
237
+	}
238
+
239
+	absContextDir, relDockerfile, err := GetContextFromLocalDir(testFilename, "")
240
+
241
+	if err == nil {
242
+		t.Fatalf("Error should not be nil")
243
+	}
244
+
245
+	if absContextDir != "" {
246
+		t.Fatalf("Absolute directory path should be empty, got: %s", absContextDir)
247
+	}
248
+
249
+	if relDockerfile != "" {
250
+		t.Fatalf("Relative path to Dockerfile should be empty, got: %s", relDockerfile)
251
+	}
252
+}
253
+
254
+func TestGetContextFromLocalDirWithCustomDockerfile(t *testing.T) {
255
+	contextDir, err := ioutil.TempDir("", "builder-context-test")
256
+
257
+	if err != nil {
258
+		t.Fatalf("Error with creating temporary directory: %s", err)
259
+	}
260
+
261
+	defer os.RemoveAll(contextDir)
262
+
263
+	workingDirectory, err := os.Getwd()
264
+
265
+	if err != nil {
266
+		t.Fatalf("Error when retrieving working directory: %s", err)
267
+	}
268
+
269
+	defer os.Chdir(workingDirectory)
270
+
271
+	err = os.Chdir(contextDir)
272
+
273
+	if err != nil {
274
+		t.Fatalf("Error when changing directory to %s: %s", contextDir, err)
275
+	}
276
+
277
+	dockerfileFilename := filepath.Join(contextDir, dockerfileTestName)
278
+	err = ioutil.WriteFile(dockerfileFilename, []byte(dockerfileContent), 0777)
279
+
280
+	if err != nil {
281
+		t.Fatalf("Error when writing file (%s) contents: %s", dockerfileFilename, err)
282
+	}
283
+
284
+	absContextDir, relDockerfile, err := GetContextFromLocalDir(contextDir, dockerfileTestName)
285
+
286
+	if err != nil {
287
+		t.Fatalf("Error when getting context from local dir: %s", err)
288
+	}
289
+
290
+	if absContextDir != contextDir {
291
+		t.Fatalf("Absolute directory path should be equal to %s, got: %s", contextDir, absContextDir)
292
+	}
293
+
294
+	if relDockerfile != dockerfileTestName {
295
+		t.Fatalf("Relative path to dockerfile should be equal to %s, got: %s", dockerfileTestName, relDockerfile)
296
+	}
297
+
298
+}
299
+
300
+func TestGetContextFromReaderString(t *testing.T) {
301
+	tarArchive, relDockerfile, err := GetContextFromReader(ioutil.NopCloser(strings.NewReader(dockerfileContent)), "")
302
+
303
+	if err != nil {
304
+		t.Fatalf("Error when executing GetContextFromReader: %s", err)
305
+	}
306
+
307
+	tarReader := tar.NewReader(tarArchive)
308
+
309
+	_, err = tarReader.Next()
310
+
311
+	if err != nil {
312
+		t.Fatalf("Error when reading tar archive: %s", err)
313
+	}
314
+
315
+	buff := new(bytes.Buffer)
316
+	buff.ReadFrom(tarReader)
317
+	contents := buff.String()
318
+
319
+	_, err = tarReader.Next()
320
+
321
+	if err != io.EOF {
322
+		t.Fatalf("Tar stream too long: %s", err)
323
+	}
324
+
325
+	if err = tarArchive.Close(); err != nil {
326
+		t.Fatalf("Error when closing tar stream: %s", err)
327
+	}
328
+
329
+	if dockerfileContent != contents {
330
+		t.Fatalf("Uncompressed tar archive does not equal: %s, got: %s", dockerfileContent, contents)
331
+	}
332
+
333
+	if relDockerfile != DefaultDockerfileName {
334
+		t.Fatalf("Relative path not equals %s, got: %s", DefaultDockerfileName, relDockerfile)
335
+	}
336
+}
337
+
338
+func TestGetContextFromReaderTar(t *testing.T) {
339
+	contextDir, err := ioutil.TempDir("", "builder-context-test")
340
+
341
+	if err != nil {
342
+		t.Fatalf("Error with creating temporary directory: %s", err)
343
+	}
344
+
345
+	defer os.RemoveAll(contextDir)
346
+
347
+	dockerfileFilename := filepath.Join(contextDir, dockerfileTestName)
348
+	err = ioutil.WriteFile(dockerfileFilename, []byte(dockerfileContent), 0777)
349
+
350
+	if err != nil {
351
+		t.Fatalf("Error when writing file (%s) contents: %s", dockerfileFilename, err)
352
+	}
353
+
354
+	tarStream, err := archive.Tar(contextDir, archive.Uncompressed)
355
+
356
+	if err != nil {
357
+		t.Fatalf("Error when creating tar: %s", err)
358
+	}
359
+
360
+	tarArchive, relDockerfile, err := GetContextFromReader(tarStream, dockerfileTestName)
361
+
362
+	if err != nil {
363
+		t.Fatalf("Error when executing GetContextFromReader: %s", err)
364
+	}
365
+
366
+	tarReader := tar.NewReader(tarArchive)
367
+
368
+	header, err := tarReader.Next()
369
+
370
+	if err != nil {
371
+		t.Fatalf("Error when reading tar archive: %s", err)
372
+	}
373
+
374
+	if header.Name != dockerfileTestName {
375
+		t.Fatalf("Dockerfile name should be: %s, got: %s", dockerfileTestName, header.Name)
376
+	}
377
+
378
+	buff := new(bytes.Buffer)
379
+	buff.ReadFrom(tarReader)
380
+	contents := buff.String()
381
+
382
+	_, err = tarReader.Next()
383
+
384
+	if err != io.EOF {
385
+		t.Fatalf("Tar stream too long: %s", err)
386
+	}
387
+
388
+	if err = tarArchive.Close(); err != nil {
389
+		t.Fatalf("Error when closing tar stream: %s", err)
390
+	}
391
+
392
+	if dockerfileContent != contents {
393
+		t.Fatalf("Uncompressed tar archive does not equal: %s, got: %s", dockerfileContent, contents)
394
+	}
395
+
396
+	if relDockerfile != dockerfileTestName {
397
+		t.Fatalf("Relative path not equals %s, got: %s", dockerfileTestName, relDockerfile)
398
+	}
399
+}
400
+
401
+func TestValidateContextDirectoryEmptyContext(t *testing.T) {
402
+	testValidateContextDirectory(t, prepareEmpty, []string{})
403
+}
404
+
405
+func TestValidateContextDirectoryContextWithNoFiles(t *testing.T) {
406
+	testValidateContextDirectory(t, prepareNoFiles, []string{})
407
+}
408
+
409
+func TestValidateContextDirectoryWithOneFile(t *testing.T) {
410
+	testValidateContextDirectory(t, prepareOneFile, []string{})
411
+}
412
+
413
+func TestValidateContextDirectoryWithOneFileExcludes(t *testing.T) {
414
+	testValidateContextDirectory(t, prepareOneFile, []string{dockerfileTestName})
415
+}