Browse code

Add build tests covering extraction in chroot

Signed-off-by: Cristian Staretu <cristian.staretu@gmail.com>

Cristian Staretu authored on 2014/12/09 05:40:27
Showing 2 changed files
... ...
@@ -3304,6 +3304,118 @@ RUN cat /existing-directory-trailing-slash/test/foo | grep Hi`
3304 3304
 	logDone("build - ADD tar")
3305 3305
 }
3306 3306
 
3307
+func TestBuildAddTarXz(t *testing.T) {
3308
+	name := "testbuildaddtarxz"
3309
+	defer deleteImages(name)
3310
+
3311
+	ctx := func() *FakeContext {
3312
+		dockerfile := `
3313
+			FROM busybox
3314
+			ADD test.tar.xz /
3315
+			RUN cat /test/foo | grep Hi`
3316
+		tmpDir, err := ioutil.TempDir("", "fake-context")
3317
+		testTar, err := os.Create(filepath.Join(tmpDir, "test.tar"))
3318
+		if err != nil {
3319
+			t.Fatalf("failed to create test.tar archive: %v", err)
3320
+		}
3321
+		defer testTar.Close()
3322
+
3323
+		tw := tar.NewWriter(testTar)
3324
+
3325
+		if err := tw.WriteHeader(&tar.Header{
3326
+			Name: "test/foo",
3327
+			Size: 2,
3328
+		}); err != nil {
3329
+			t.Fatalf("failed to write tar file header: %v", err)
3330
+		}
3331
+		if _, err := tw.Write([]byte("Hi")); err != nil {
3332
+			t.Fatalf("failed to write tar file content: %v", err)
3333
+		}
3334
+		if err := tw.Close(); err != nil {
3335
+			t.Fatalf("failed to close tar archive: %v", err)
3336
+		}
3337
+		xzCompressCmd := exec.Command("xz", "test.tar")
3338
+		xzCompressCmd.Dir = tmpDir
3339
+		out, _, err := runCommandWithOutput(xzCompressCmd)
3340
+		if err != nil {
3341
+			t.Fatal(err, out)
3342
+		}
3343
+
3344
+		if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
3345
+			t.Fatalf("failed to open destination dockerfile: %v", err)
3346
+		}
3347
+		return &FakeContext{Dir: tmpDir}
3348
+	}()
3349
+
3350
+	defer ctx.Close()
3351
+
3352
+	if _, err := buildImageFromContext(name, ctx, true); err != nil {
3353
+		t.Fatalf("build failed to complete for TestBuildAddTarXz: %v", err)
3354
+	}
3355
+
3356
+	logDone("build - ADD tar.xz")
3357
+}
3358
+
3359
+func TestBuildAddTarXzGz(t *testing.T) {
3360
+	name := "testbuildaddtarxzgz"
3361
+	defer deleteImages(name)
3362
+
3363
+	ctx := func() *FakeContext {
3364
+		dockerfile := `
3365
+			FROM busybox
3366
+			ADD test.tar.xz.gz /
3367
+			RUN ls /test.tar.xz.gz`
3368
+		tmpDir, err := ioutil.TempDir("", "fake-context")
3369
+		testTar, err := os.Create(filepath.Join(tmpDir, "test.tar"))
3370
+		if err != nil {
3371
+			t.Fatalf("failed to create test.tar archive: %v", err)
3372
+		}
3373
+		defer testTar.Close()
3374
+
3375
+		tw := tar.NewWriter(testTar)
3376
+
3377
+		if err := tw.WriteHeader(&tar.Header{
3378
+			Name: "test/foo",
3379
+			Size: 2,
3380
+		}); err != nil {
3381
+			t.Fatalf("failed to write tar file header: %v", err)
3382
+		}
3383
+		if _, err := tw.Write([]byte("Hi")); err != nil {
3384
+			t.Fatalf("failed to write tar file content: %v", err)
3385
+		}
3386
+		if err := tw.Close(); err != nil {
3387
+			t.Fatalf("failed to close tar archive: %v", err)
3388
+		}
3389
+
3390
+		xzCompressCmd := exec.Command("xz", "test.tar")
3391
+		xzCompressCmd.Dir = tmpDir
3392
+		out, _, err := runCommandWithOutput(xzCompressCmd)
3393
+		if err != nil {
3394
+			t.Fatal(err, out)
3395
+		}
3396
+
3397
+		gzipCompressCmd := exec.Command("gzip", "test.tar.xz")
3398
+		gzipCompressCmd.Dir = tmpDir
3399
+		out, _, err = runCommandWithOutput(gzipCompressCmd)
3400
+		if err != nil {
3401
+			t.Fatal(err, out)
3402
+		}
3403
+
3404
+		if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
3405
+			t.Fatalf("failed to open destination dockerfile: %v", err)
3406
+		}
3407
+		return &FakeContext{Dir: tmpDir}
3408
+	}()
3409
+
3410
+	defer ctx.Close()
3411
+
3412
+	if _, err := buildImageFromContext(name, ctx, true); err != nil {
3413
+		t.Fatalf("build failed to complete for TestBuildAddTarXz: %v", err)
3414
+	}
3415
+
3416
+	logDone("build - ADD tar.xz.gz")
3417
+}
3418
+
3307 3419
 func TestBuildFromGIT(t *testing.T) {
3308 3420
 	name := "testbuildfromgit"
3309 3421
 	defer deleteImages(name)
... ...
@@ -104,6 +104,140 @@ func TestSaveAndLoadRepoStdout(t *testing.T) {
104 104
 	logDone("save - do not save to a tty")
105 105
 }
106 106
 
107
+// save a repo using gz compression and try to load it using stdout
108
+func TestSaveXzAndLoadRepoStdout(t *testing.T) {
109
+	tempDir, err := ioutil.TempDir("", "test-save-xz-gz-load-repo-stdout")
110
+	if err != nil {
111
+		t.Fatal(err)
112
+	}
113
+	defer os.RemoveAll(tempDir)
114
+
115
+	tarballPath := filepath.Join(tempDir, "foobar-save-load-test.tar.xz.gz")
116
+
117
+	runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
118
+	out, _, err := runCommandWithOutput(runCmd)
119
+	if err != nil {
120
+		t.Fatalf("failed to create a container: %v %v", out, err)
121
+	}
122
+
123
+	cleanedContainerID := stripTrailingCharacters(out)
124
+
125
+	repoName := "foobar-save-load-test-xz-gz"
126
+
127
+	inspectCmd := exec.Command(dockerBinary, "inspect", cleanedContainerID)
128
+	out, _, err = runCommandWithOutput(inspectCmd)
129
+	if err != nil {
130
+		t.Fatalf("output should've been a container id: %v %v", cleanedContainerID, err)
131
+	}
132
+
133
+	commitCmd := exec.Command(dockerBinary, "commit", cleanedContainerID, repoName)
134
+	out, _, err = runCommandWithOutput(commitCmd)
135
+	if err != nil {
136
+		t.Fatalf("failed to commit container: %v %v", out, err)
137
+	}
138
+
139
+	inspectCmd = exec.Command(dockerBinary, "inspect", repoName)
140
+	before, _, err := runCommandWithOutput(inspectCmd)
141
+	if err != nil {
142
+		t.Fatalf("the repo should exist before saving it: %v %v", before, err)
143
+	}
144
+
145
+	saveCmdTemplate := `%v save %v | xz -c | gzip -c > %s`
146
+	saveCmdFinal := fmt.Sprintf(saveCmdTemplate, dockerBinary, repoName, tarballPath)
147
+	saveCmd := exec.Command("bash", "-c", saveCmdFinal)
148
+	out, _, err = runCommandWithOutput(saveCmd)
149
+	if err != nil {
150
+		t.Fatalf("failed to save repo: %v %v", out, err)
151
+	}
152
+
153
+	deleteImages(repoName)
154
+
155
+	loadCmdFinal := fmt.Sprintf(`cat %s | docker load`, tarballPath)
156
+	loadCmd := exec.Command("bash", "-c", loadCmdFinal)
157
+	out, _, err = runCommandWithOutput(loadCmd)
158
+	if err == nil {
159
+		t.Fatalf("expected error, but succeeded with no error and output: %v", out)
160
+	}
161
+
162
+	inspectCmd = exec.Command(dockerBinary, "inspect", repoName)
163
+	after, _, err := runCommandWithOutput(inspectCmd)
164
+	if err == nil {
165
+		t.Fatalf("the repo should not exist: %v", after)
166
+	}
167
+
168
+	deleteContainer(cleanedContainerID)
169
+	deleteImages(repoName)
170
+
171
+	logDone("load - save a repo with xz compression & load it using stdout")
172
+}
173
+
174
+// save a repo using xz+gz compression and try to load it using stdout
175
+func TestSaveXzGzAndLoadRepoStdout(t *testing.T) {
176
+	tempDir, err := ioutil.TempDir("", "test-save-xz-gz-load-repo-stdout")
177
+	if err != nil {
178
+		t.Fatal(err)
179
+	}
180
+	defer os.RemoveAll(tempDir)
181
+
182
+	tarballPath := filepath.Join(tempDir, "foobar-save-load-test.tar.xz.gz")
183
+
184
+	runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
185
+	out, _, err := runCommandWithOutput(runCmd)
186
+	if err != nil {
187
+		t.Fatalf("failed to create a container: %v %v", out, err)
188
+	}
189
+
190
+	cleanedContainerID := stripTrailingCharacters(out)
191
+
192
+	repoName := "foobar-save-load-test-xz-gz"
193
+
194
+	inspectCmd := exec.Command(dockerBinary, "inspect", cleanedContainerID)
195
+	out, _, err = runCommandWithOutput(inspectCmd)
196
+	if err != nil {
197
+		t.Fatalf("output should've been a container id: %v %v", cleanedContainerID, err)
198
+	}
199
+
200
+	commitCmd := exec.Command(dockerBinary, "commit", cleanedContainerID, repoName)
201
+	out, _, err = runCommandWithOutput(commitCmd)
202
+	if err != nil {
203
+		t.Fatalf("failed to commit container: %v %v", out, err)
204
+	}
205
+
206
+	inspectCmd = exec.Command(dockerBinary, "inspect", repoName)
207
+	before, _, err := runCommandWithOutput(inspectCmd)
208
+	if err != nil {
209
+		t.Fatalf("the repo should exist before saving it: %v %v", before, err)
210
+	}
211
+
212
+	saveCmdTemplate := `%v save %v | xz -c | gzip -c > %s`
213
+	saveCmdFinal := fmt.Sprintf(saveCmdTemplate, dockerBinary, repoName, tarballPath)
214
+	saveCmd := exec.Command("bash", "-c", saveCmdFinal)
215
+	out, _, err = runCommandWithOutput(saveCmd)
216
+	if err != nil {
217
+		t.Fatalf("failed to save repo: %v %v", out, err)
218
+	}
219
+
220
+	deleteImages(repoName)
221
+
222
+	loadCmdFinal := fmt.Sprintf(`cat %s | docker load`, tarballPath)
223
+	loadCmd := exec.Command("bash", "-c", loadCmdFinal)
224
+	out, _, err = runCommandWithOutput(loadCmd)
225
+	if err == nil {
226
+		t.Fatalf("expected error, but succeeded with no error and output: %v", out)
227
+	}
228
+
229
+	inspectCmd = exec.Command(dockerBinary, "inspect", repoName)
230
+	after, _, err := runCommandWithOutput(inspectCmd)
231
+	if err == nil {
232
+		t.Fatalf("the repo should not exist: %v", after)
233
+	}
234
+
235
+	deleteContainer(cleanedContainerID)
236
+	deleteImages(repoName)
237
+
238
+	logDone("load - save a repo with xz+gz compression & load it using stdout")
239
+}
240
+
107 241
 func TestSaveSingleTag(t *testing.T) {
108 242
 	repoName := "foobar-save-single-tag-test"
109 243