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
... ...
@@ -2994,6 +2994,118 @@ RUN cat /existing-directory-trailing-slash/test/foo | grep Hi`
2994 2994
 	logDone("build - ADD tar")
2995 2995
 }
2996 2996
 
2997
+func TestBuildAddTarXz(t *testing.T) {
2998
+	name := "testbuildaddtarxz"
2999
+	defer deleteImages(name)
3000
+
3001
+	ctx := func() *FakeContext {
3002
+		dockerfile := `
3003
+			FROM busybox
3004
+			ADD test.tar.xz /
3005
+			RUN cat /test/foo | grep Hi`
3006
+		tmpDir, err := ioutil.TempDir("", "fake-context")
3007
+		testTar, err := os.Create(filepath.Join(tmpDir, "test.tar"))
3008
+		if err != nil {
3009
+			t.Fatalf("failed to create test.tar archive: %v", err)
3010
+		}
3011
+		defer testTar.Close()
3012
+
3013
+		tw := tar.NewWriter(testTar)
3014
+
3015
+		if err := tw.WriteHeader(&tar.Header{
3016
+			Name: "test/foo",
3017
+			Size: 2,
3018
+		}); err != nil {
3019
+			t.Fatalf("failed to write tar file header: %v", err)
3020
+		}
3021
+		if _, err := tw.Write([]byte("Hi")); err != nil {
3022
+			t.Fatalf("failed to write tar file content: %v", err)
3023
+		}
3024
+		if err := tw.Close(); err != nil {
3025
+			t.Fatalf("failed to close tar archive: %v", err)
3026
+		}
3027
+		xzCompressCmd := exec.Command("xz", "test.tar")
3028
+		xzCompressCmd.Dir = tmpDir
3029
+		out, _, err := runCommandWithOutput(xzCompressCmd)
3030
+		if err != nil {
3031
+			t.Fatal(err, out)
3032
+		}
3033
+
3034
+		if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
3035
+			t.Fatalf("failed to open destination dockerfile: %v", err)
3036
+		}
3037
+		return &FakeContext{Dir: tmpDir}
3038
+	}()
3039
+
3040
+	defer ctx.Close()
3041
+
3042
+	if _, err := buildImageFromContext(name, ctx, true); err != nil {
3043
+		t.Fatalf("build failed to complete for TestBuildAddTarXz: %v", err)
3044
+	}
3045
+
3046
+	logDone("build - ADD tar.xz")
3047
+}
3048
+
3049
+func TestBuildAddTarXzGz(t *testing.T) {
3050
+	name := "testbuildaddtarxzgz"
3051
+	defer deleteImages(name)
3052
+
3053
+	ctx := func() *FakeContext {
3054
+		dockerfile := `
3055
+			FROM busybox
3056
+			ADD test.tar.xz.gz /
3057
+			RUN ls /test.tar.xz.gz`
3058
+		tmpDir, err := ioutil.TempDir("", "fake-context")
3059
+		testTar, err := os.Create(filepath.Join(tmpDir, "test.tar"))
3060
+		if err != nil {
3061
+			t.Fatalf("failed to create test.tar archive: %v", err)
3062
+		}
3063
+		defer testTar.Close()
3064
+
3065
+		tw := tar.NewWriter(testTar)
3066
+
3067
+		if err := tw.WriteHeader(&tar.Header{
3068
+			Name: "test/foo",
3069
+			Size: 2,
3070
+		}); err != nil {
3071
+			t.Fatalf("failed to write tar file header: %v", err)
3072
+		}
3073
+		if _, err := tw.Write([]byte("Hi")); err != nil {
3074
+			t.Fatalf("failed to write tar file content: %v", err)
3075
+		}
3076
+		if err := tw.Close(); err != nil {
3077
+			t.Fatalf("failed to close tar archive: %v", err)
3078
+		}
3079
+
3080
+		xzCompressCmd := exec.Command("xz", "test.tar")
3081
+		xzCompressCmd.Dir = tmpDir
3082
+		out, _, err := runCommandWithOutput(xzCompressCmd)
3083
+		if err != nil {
3084
+			t.Fatal(err, out)
3085
+		}
3086
+
3087
+		gzipCompressCmd := exec.Command("gzip", "test.tar.xz")
3088
+		gzipCompressCmd.Dir = tmpDir
3089
+		out, _, err = runCommandWithOutput(gzipCompressCmd)
3090
+		if err != nil {
3091
+			t.Fatal(err, out)
3092
+		}
3093
+
3094
+		if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
3095
+			t.Fatalf("failed to open destination dockerfile: %v", err)
3096
+		}
3097
+		return &FakeContext{Dir: tmpDir}
3098
+	}()
3099
+
3100
+	defer ctx.Close()
3101
+
3102
+	if _, err := buildImageFromContext(name, ctx, true); err != nil {
3103
+		t.Fatalf("build failed to complete for TestBuildAddTarXz: %v", err)
3104
+	}
3105
+
3106
+	logDone("build - ADD tar.xz.gz")
3107
+}
3108
+
2997 3109
 func TestBuildFromGIT(t *testing.T) {
2998 3110
 	name := "testbuildfromgit"
2999 3111
 	defer deleteImages(name)
... ...
@@ -62,6 +62,140 @@ func TestSaveAndLoadRepoStdout(t *testing.T) {
62 62
 	logDone("load - load a repo using stdout")
63 63
 }
64 64
 
65
+// save a repo using gz compression and try to load it using stdout
66
+func TestSaveXzAndLoadRepoStdout(t *testing.T) {
67
+	tempDir, err := ioutil.TempDir("", "test-save-xz-gz-load-repo-stdout")
68
+	if err != nil {
69
+		t.Fatal(err)
70
+	}
71
+	defer os.RemoveAll(tempDir)
72
+
73
+	tarballPath := filepath.Join(tempDir, "foobar-save-load-test.tar.xz.gz")
74
+
75
+	runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
76
+	out, _, err := runCommandWithOutput(runCmd)
77
+	if err != nil {
78
+		t.Fatalf("failed to create a container: %v %v", out, err)
79
+	}
80
+
81
+	cleanedContainerID := stripTrailingCharacters(out)
82
+
83
+	repoName := "foobar-save-load-test-xz-gz"
84
+
85
+	inspectCmd := exec.Command(dockerBinary, "inspect", cleanedContainerID)
86
+	out, _, err = runCommandWithOutput(inspectCmd)
87
+	if err != nil {
88
+		t.Fatalf("output should've been a container id: %v %v", cleanedContainerID, err)
89
+	}
90
+
91
+	commitCmd := exec.Command(dockerBinary, "commit", cleanedContainerID, repoName)
92
+	out, _, err = runCommandWithOutput(commitCmd)
93
+	if err != nil {
94
+		t.Fatalf("failed to commit container: %v %v", out, err)
95
+	}
96
+
97
+	inspectCmd = exec.Command(dockerBinary, "inspect", repoName)
98
+	before, _, err := runCommandWithOutput(inspectCmd)
99
+	if err != nil {
100
+		t.Fatalf("the repo should exist before saving it: %v %v", before, err)
101
+	}
102
+
103
+	saveCmdTemplate := `%v save %v | xz -c | gzip -c > %s`
104
+	saveCmdFinal := fmt.Sprintf(saveCmdTemplate, dockerBinary, repoName, tarballPath)
105
+	saveCmd := exec.Command("bash", "-c", saveCmdFinal)
106
+	out, _, err = runCommandWithOutput(saveCmd)
107
+	if err != nil {
108
+		t.Fatalf("failed to save repo: %v %v", out, err)
109
+	}
110
+
111
+	deleteImages(repoName)
112
+
113
+	loadCmdFinal := fmt.Sprintf(`cat %s | docker load`, tarballPath)
114
+	loadCmd := exec.Command("bash", "-c", loadCmdFinal)
115
+	out, _, err = runCommandWithOutput(loadCmd)
116
+	if err == nil {
117
+		t.Fatalf("expected error, but succeeded with no error and output: %v", out)
118
+	}
119
+
120
+	inspectCmd = exec.Command(dockerBinary, "inspect", repoName)
121
+	after, _, err := runCommandWithOutput(inspectCmd)
122
+	if err == nil {
123
+		t.Fatalf("the repo should not exist: %v", after)
124
+	}
125
+
126
+	deleteContainer(cleanedContainerID)
127
+	deleteImages(repoName)
128
+
129
+	logDone("load - save a repo with xz compression & load it using stdout")
130
+}
131
+
132
+// save a repo using xz+gz compression and try to load it using stdout
133
+func TestSaveXzGzAndLoadRepoStdout(t *testing.T) {
134
+	tempDir, err := ioutil.TempDir("", "test-save-xz-gz-load-repo-stdout")
135
+	if err != nil {
136
+		t.Fatal(err)
137
+	}
138
+	defer os.RemoveAll(tempDir)
139
+
140
+	tarballPath := filepath.Join(tempDir, "foobar-save-load-test.tar.xz.gz")
141
+
142
+	runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
143
+	out, _, err := runCommandWithOutput(runCmd)
144
+	if err != nil {
145
+		t.Fatalf("failed to create a container: %v %v", out, err)
146
+	}
147
+
148
+	cleanedContainerID := stripTrailingCharacters(out)
149
+
150
+	repoName := "foobar-save-load-test-xz-gz"
151
+
152
+	inspectCmd := exec.Command(dockerBinary, "inspect", cleanedContainerID)
153
+	out, _, err = runCommandWithOutput(inspectCmd)
154
+	if err != nil {
155
+		t.Fatalf("output should've been a container id: %v %v", cleanedContainerID, err)
156
+	}
157
+
158
+	commitCmd := exec.Command(dockerBinary, "commit", cleanedContainerID, repoName)
159
+	out, _, err = runCommandWithOutput(commitCmd)
160
+	if err != nil {
161
+		t.Fatalf("failed to commit container: %v %v", out, err)
162
+	}
163
+
164
+	inspectCmd = exec.Command(dockerBinary, "inspect", repoName)
165
+	before, _, err := runCommandWithOutput(inspectCmd)
166
+	if err != nil {
167
+		t.Fatalf("the repo should exist before saving it: %v %v", before, err)
168
+	}
169
+
170
+	saveCmdTemplate := `%v save %v | xz -c | gzip -c > %s`
171
+	saveCmdFinal := fmt.Sprintf(saveCmdTemplate, dockerBinary, repoName, tarballPath)
172
+	saveCmd := exec.Command("bash", "-c", saveCmdFinal)
173
+	out, _, err = runCommandWithOutput(saveCmd)
174
+	if err != nil {
175
+		t.Fatalf("failed to save repo: %v %v", out, err)
176
+	}
177
+
178
+	deleteImages(repoName)
179
+
180
+	loadCmdFinal := fmt.Sprintf(`cat %s | docker load`, tarballPath)
181
+	loadCmd := exec.Command("bash", "-c", loadCmdFinal)
182
+	out, _, err = runCommandWithOutput(loadCmd)
183
+	if err == nil {
184
+		t.Fatalf("expected error, but succeeded with no error and output: %v", out)
185
+	}
186
+
187
+	inspectCmd = exec.Command(dockerBinary, "inspect", repoName)
188
+	after, _, err := runCommandWithOutput(inspectCmd)
189
+	if err == nil {
190
+		t.Fatalf("the repo should not exist: %v", after)
191
+	}
192
+
193
+	deleteContainer(cleanedContainerID)
194
+	deleteImages(repoName)
195
+
196
+	logDone("load - save a repo with xz+gz compression & load it using stdout")
197
+}
198
+
65 199
 func TestSaveSingleTag(t *testing.T) {
66 200
 	repoName := "foobar-save-single-tag-test"
67 201