mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Add build tests covering extraction in chroot
Signed-off-by: Cristian Staretu <cristian.staretu@gmail.com>
This commit is contained in:
parent
e629e255d8
commit
aef842e7df
2 changed files with 246 additions and 0 deletions
|
@ -2994,6 +2994,118 @@ RUN cat /existing-directory-trailing-slash/test/foo | grep Hi`
|
||||||
logDone("build - ADD tar")
|
logDone("build - ADD tar")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestBuildAddTarXz(t *testing.T) {
|
||||||
|
name := "testbuildaddtarxz"
|
||||||
|
defer deleteImages(name)
|
||||||
|
|
||||||
|
ctx := func() *FakeContext {
|
||||||
|
dockerfile := `
|
||||||
|
FROM busybox
|
||||||
|
ADD test.tar.xz /
|
||||||
|
RUN cat /test/foo | grep Hi`
|
||||||
|
tmpDir, err := ioutil.TempDir("", "fake-context")
|
||||||
|
testTar, err := os.Create(filepath.Join(tmpDir, "test.tar"))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to create test.tar archive: %v", err)
|
||||||
|
}
|
||||||
|
defer testTar.Close()
|
||||||
|
|
||||||
|
tw := tar.NewWriter(testTar)
|
||||||
|
|
||||||
|
if err := tw.WriteHeader(&tar.Header{
|
||||||
|
Name: "test/foo",
|
||||||
|
Size: 2,
|
||||||
|
}); err != nil {
|
||||||
|
t.Fatalf("failed to write tar file header: %v", err)
|
||||||
|
}
|
||||||
|
if _, err := tw.Write([]byte("Hi")); err != nil {
|
||||||
|
t.Fatalf("failed to write tar file content: %v", err)
|
||||||
|
}
|
||||||
|
if err := tw.Close(); err != nil {
|
||||||
|
t.Fatalf("failed to close tar archive: %v", err)
|
||||||
|
}
|
||||||
|
xzCompressCmd := exec.Command("xz", "test.tar")
|
||||||
|
xzCompressCmd.Dir = tmpDir
|
||||||
|
out, _, err := runCommandWithOutput(xzCompressCmd)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err, out)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
|
||||||
|
t.Fatalf("failed to open destination dockerfile: %v", err)
|
||||||
|
}
|
||||||
|
return &FakeContext{Dir: tmpDir}
|
||||||
|
}()
|
||||||
|
|
||||||
|
defer ctx.Close()
|
||||||
|
|
||||||
|
if _, err := buildImageFromContext(name, ctx, true); err != nil {
|
||||||
|
t.Fatalf("build failed to complete for TestBuildAddTarXz: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
logDone("build - ADD tar.xz")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestBuildAddTarXzGz(t *testing.T) {
|
||||||
|
name := "testbuildaddtarxzgz"
|
||||||
|
defer deleteImages(name)
|
||||||
|
|
||||||
|
ctx := func() *FakeContext {
|
||||||
|
dockerfile := `
|
||||||
|
FROM busybox
|
||||||
|
ADD test.tar.xz.gz /
|
||||||
|
RUN ls /test.tar.xz.gz`
|
||||||
|
tmpDir, err := ioutil.TempDir("", "fake-context")
|
||||||
|
testTar, err := os.Create(filepath.Join(tmpDir, "test.tar"))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to create test.tar archive: %v", err)
|
||||||
|
}
|
||||||
|
defer testTar.Close()
|
||||||
|
|
||||||
|
tw := tar.NewWriter(testTar)
|
||||||
|
|
||||||
|
if err := tw.WriteHeader(&tar.Header{
|
||||||
|
Name: "test/foo",
|
||||||
|
Size: 2,
|
||||||
|
}); err != nil {
|
||||||
|
t.Fatalf("failed to write tar file header: %v", err)
|
||||||
|
}
|
||||||
|
if _, err := tw.Write([]byte("Hi")); err != nil {
|
||||||
|
t.Fatalf("failed to write tar file content: %v", err)
|
||||||
|
}
|
||||||
|
if err := tw.Close(); err != nil {
|
||||||
|
t.Fatalf("failed to close tar archive: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
xzCompressCmd := exec.Command("xz", "test.tar")
|
||||||
|
xzCompressCmd.Dir = tmpDir
|
||||||
|
out, _, err := runCommandWithOutput(xzCompressCmd)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err, out)
|
||||||
|
}
|
||||||
|
|
||||||
|
gzipCompressCmd := exec.Command("gzip", "test.tar.xz")
|
||||||
|
gzipCompressCmd.Dir = tmpDir
|
||||||
|
out, _, err = runCommandWithOutput(gzipCompressCmd)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err, out)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
|
||||||
|
t.Fatalf("failed to open destination dockerfile: %v", err)
|
||||||
|
}
|
||||||
|
return &FakeContext{Dir: tmpDir}
|
||||||
|
}()
|
||||||
|
|
||||||
|
defer ctx.Close()
|
||||||
|
|
||||||
|
if _, err := buildImageFromContext(name, ctx, true); err != nil {
|
||||||
|
t.Fatalf("build failed to complete for TestBuildAddTarXz: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
logDone("build - ADD tar.xz.gz")
|
||||||
|
}
|
||||||
|
|
||||||
func TestBuildFromGIT(t *testing.T) {
|
func TestBuildFromGIT(t *testing.T) {
|
||||||
name := "testbuildfromgit"
|
name := "testbuildfromgit"
|
||||||
defer deleteImages(name)
|
defer deleteImages(name)
|
||||||
|
|
|
@ -62,6 +62,140 @@ func TestSaveAndLoadRepoStdout(t *testing.T) {
|
||||||
logDone("load - load a repo using stdout")
|
logDone("load - load a repo using stdout")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// save a repo using gz compression and try to load it using stdout
|
||||||
|
func TestSaveXzAndLoadRepoStdout(t *testing.T) {
|
||||||
|
tempDir, err := ioutil.TempDir("", "test-save-xz-gz-load-repo-stdout")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(tempDir)
|
||||||
|
|
||||||
|
tarballPath := filepath.Join(tempDir, "foobar-save-load-test.tar.xz.gz")
|
||||||
|
|
||||||
|
runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
|
||||||
|
out, _, err := runCommandWithOutput(runCmd)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to create a container: %v %v", out, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanedContainerID := stripTrailingCharacters(out)
|
||||||
|
|
||||||
|
repoName := "foobar-save-load-test-xz-gz"
|
||||||
|
|
||||||
|
inspectCmd := exec.Command(dockerBinary, "inspect", cleanedContainerID)
|
||||||
|
out, _, err = runCommandWithOutput(inspectCmd)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("output should've been a container id: %v %v", cleanedContainerID, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
commitCmd := exec.Command(dockerBinary, "commit", cleanedContainerID, repoName)
|
||||||
|
out, _, err = runCommandWithOutput(commitCmd)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to commit container: %v %v", out, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
inspectCmd = exec.Command(dockerBinary, "inspect", repoName)
|
||||||
|
before, _, err := runCommandWithOutput(inspectCmd)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("the repo should exist before saving it: %v %v", before, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
saveCmdTemplate := `%v save %v | xz -c | gzip -c > %s`
|
||||||
|
saveCmdFinal := fmt.Sprintf(saveCmdTemplate, dockerBinary, repoName, tarballPath)
|
||||||
|
saveCmd := exec.Command("bash", "-c", saveCmdFinal)
|
||||||
|
out, _, err = runCommandWithOutput(saveCmd)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to save repo: %v %v", out, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteImages(repoName)
|
||||||
|
|
||||||
|
loadCmdFinal := fmt.Sprintf(`cat %s | docker load`, tarballPath)
|
||||||
|
loadCmd := exec.Command("bash", "-c", loadCmdFinal)
|
||||||
|
out, _, err = runCommandWithOutput(loadCmd)
|
||||||
|
if err == nil {
|
||||||
|
t.Fatalf("expected error, but succeeded with no error and output: %v", out)
|
||||||
|
}
|
||||||
|
|
||||||
|
inspectCmd = exec.Command(dockerBinary, "inspect", repoName)
|
||||||
|
after, _, err := runCommandWithOutput(inspectCmd)
|
||||||
|
if err == nil {
|
||||||
|
t.Fatalf("the repo should not exist: %v", after)
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteContainer(cleanedContainerID)
|
||||||
|
deleteImages(repoName)
|
||||||
|
|
||||||
|
logDone("load - save a repo with xz compression & load it using stdout")
|
||||||
|
}
|
||||||
|
|
||||||
|
// save a repo using xz+gz compression and try to load it using stdout
|
||||||
|
func TestSaveXzGzAndLoadRepoStdout(t *testing.T) {
|
||||||
|
tempDir, err := ioutil.TempDir("", "test-save-xz-gz-load-repo-stdout")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(tempDir)
|
||||||
|
|
||||||
|
tarballPath := filepath.Join(tempDir, "foobar-save-load-test.tar.xz.gz")
|
||||||
|
|
||||||
|
runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
|
||||||
|
out, _, err := runCommandWithOutput(runCmd)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to create a container: %v %v", out, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanedContainerID := stripTrailingCharacters(out)
|
||||||
|
|
||||||
|
repoName := "foobar-save-load-test-xz-gz"
|
||||||
|
|
||||||
|
inspectCmd := exec.Command(dockerBinary, "inspect", cleanedContainerID)
|
||||||
|
out, _, err = runCommandWithOutput(inspectCmd)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("output should've been a container id: %v %v", cleanedContainerID, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
commitCmd := exec.Command(dockerBinary, "commit", cleanedContainerID, repoName)
|
||||||
|
out, _, err = runCommandWithOutput(commitCmd)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to commit container: %v %v", out, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
inspectCmd = exec.Command(dockerBinary, "inspect", repoName)
|
||||||
|
before, _, err := runCommandWithOutput(inspectCmd)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("the repo should exist before saving it: %v %v", before, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
saveCmdTemplate := `%v save %v | xz -c | gzip -c > %s`
|
||||||
|
saveCmdFinal := fmt.Sprintf(saveCmdTemplate, dockerBinary, repoName, tarballPath)
|
||||||
|
saveCmd := exec.Command("bash", "-c", saveCmdFinal)
|
||||||
|
out, _, err = runCommandWithOutput(saveCmd)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to save repo: %v %v", out, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteImages(repoName)
|
||||||
|
|
||||||
|
loadCmdFinal := fmt.Sprintf(`cat %s | docker load`, tarballPath)
|
||||||
|
loadCmd := exec.Command("bash", "-c", loadCmdFinal)
|
||||||
|
out, _, err = runCommandWithOutput(loadCmd)
|
||||||
|
if err == nil {
|
||||||
|
t.Fatalf("expected error, but succeeded with no error and output: %v", out)
|
||||||
|
}
|
||||||
|
|
||||||
|
inspectCmd = exec.Command(dockerBinary, "inspect", repoName)
|
||||||
|
after, _, err := runCommandWithOutput(inspectCmd)
|
||||||
|
if err == nil {
|
||||||
|
t.Fatalf("the repo should not exist: %v", after)
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteContainer(cleanedContainerID)
|
||||||
|
deleteImages(repoName)
|
||||||
|
|
||||||
|
logDone("load - save a repo with xz+gz compression & load it using stdout")
|
||||||
|
}
|
||||||
|
|
||||||
func TestSaveSingleTag(t *testing.T) {
|
func TestSaveSingleTag(t *testing.T) {
|
||||||
repoName := "foobar-save-single-tag-test"
|
repoName := "foobar-save-single-tag-test"
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue