github.com/jiasir/docker@v1.3.3-0.20170609024000-252e610103e7/builder/dockerfile/internals_test.go (about) 1 package dockerfile 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/docker/docker/api/types" 8 "github.com/docker/docker/api/types/backend" 9 "github.com/docker/docker/api/types/container" 10 "github.com/docker/docker/builder" 11 "github.com/docker/docker/builder/remotecontext" 12 "github.com/docker/docker/pkg/archive" 13 "github.com/stretchr/testify/assert" 14 "github.com/stretchr/testify/require" 15 ) 16 17 func TestEmptyDockerfile(t *testing.T) { 18 contextDir, cleanup := createTestTempDir(t, "", "builder-dockerfile-test") 19 defer cleanup() 20 21 createTestTempFile(t, contextDir, builder.DefaultDockerfileName, "", 0777) 22 23 readAndCheckDockerfile(t, "emptyDockerfile", contextDir, "", "the Dockerfile (Dockerfile) cannot be empty") 24 } 25 26 func TestSymlinkDockerfile(t *testing.T) { 27 contextDir, cleanup := createTestTempDir(t, "", "builder-dockerfile-test") 28 defer cleanup() 29 30 createTestSymlink(t, contextDir, builder.DefaultDockerfileName, "/etc/passwd") 31 32 // The reason the error is "Cannot locate specified Dockerfile" is because 33 // in the builder, the symlink is resolved within the context, therefore 34 // Dockerfile -> /etc/passwd becomes etc/passwd from the context which is 35 // a nonexistent file. 36 expectedError := fmt.Sprintf("Cannot locate specified Dockerfile: %s", builder.DefaultDockerfileName) 37 38 readAndCheckDockerfile(t, "symlinkDockerfile", contextDir, builder.DefaultDockerfileName, expectedError) 39 } 40 41 func TestDockerfileOutsideTheBuildContext(t *testing.T) { 42 contextDir, cleanup := createTestTempDir(t, "", "builder-dockerfile-test") 43 defer cleanup() 44 45 expectedError := "Forbidden path outside the build context: ../../Dockerfile ()" 46 47 readAndCheckDockerfile(t, "DockerfileOutsideTheBuildContext", contextDir, "../../Dockerfile", expectedError) 48 } 49 50 func TestNonExistingDockerfile(t *testing.T) { 51 contextDir, cleanup := createTestTempDir(t, "", "builder-dockerfile-test") 52 defer cleanup() 53 54 expectedError := "Cannot locate specified Dockerfile: Dockerfile" 55 56 readAndCheckDockerfile(t, "NonExistingDockerfile", contextDir, "Dockerfile", expectedError) 57 } 58 59 func readAndCheckDockerfile(t *testing.T, testName, contextDir, dockerfilePath, expectedError string) { 60 tarStream, err := archive.Tar(contextDir, archive.Uncompressed) 61 require.NoError(t, err) 62 63 defer func() { 64 if err = tarStream.Close(); err != nil { 65 t.Fatalf("Error when closing tar stream: %s", err) 66 } 67 }() 68 69 if dockerfilePath == "" { // handled in BuildWithContext 70 dockerfilePath = builder.DefaultDockerfileName 71 } 72 73 config := backend.BuildConfig{ 74 Options: &types.ImageBuildOptions{Dockerfile: dockerfilePath}, 75 Source: tarStream, 76 } 77 _, _, err = remotecontext.Detect(config) 78 assert.EqualError(t, err, expectedError) 79 } 80 81 func TestCopyRunConfig(t *testing.T) { 82 defaultEnv := []string{"foo=1"} 83 defaultCmd := []string{"old"} 84 85 var testcases = []struct { 86 doc string 87 modifiers []runConfigModifier 88 expected *container.Config 89 }{ 90 { 91 doc: "Set the command", 92 modifiers: []runConfigModifier{withCmd([]string{"new"})}, 93 expected: &container.Config{ 94 Cmd: []string{"new"}, 95 Env: defaultEnv, 96 }, 97 }, 98 { 99 doc: "Set the command to a comment", 100 modifiers: []runConfigModifier{withCmdComment("comment")}, 101 expected: &container.Config{ 102 Cmd: append(defaultShell, "#(nop) ", "comment"), 103 Env: defaultEnv, 104 }, 105 }, 106 { 107 doc: "Set the command and env", 108 modifiers: []runConfigModifier{ 109 withCmd([]string{"new"}), 110 withEnv([]string{"one", "two"}), 111 }, 112 expected: &container.Config{ 113 Cmd: []string{"new"}, 114 Env: []string{"one", "two"}, 115 }, 116 }, 117 } 118 119 for _, testcase := range testcases { 120 runConfig := &container.Config{ 121 Cmd: defaultCmd, 122 Env: defaultEnv, 123 } 124 runConfigCopy := copyRunConfig(runConfig, testcase.modifiers...) 125 assert.Equal(t, testcase.expected, runConfigCopy, testcase.doc) 126 // Assert the original was not modified 127 assert.NotEqual(t, runConfig, runConfigCopy, testcase.doc) 128 } 129 130 }