builder/context_test.go
593e2915
 package builder
 
 import (
 	"archive/tar"
 	"bytes"
 	"io"
 	"io/ioutil"
 	"path/filepath"
ccd0da90
 	"runtime"
593e2915
 	"strings"
 	"testing"
 
 	"github.com/docker/docker/pkg/archive"
 )
 
ab2baf08
 var prepareEmpty = func(t *testing.T) (string, func()) {
 	return "", func() {}
593e2915
 }
 
ab2baf08
 var prepareNoFiles = func(t *testing.T) (string, func()) {
 	return createTestTempDir(t, "", "builder-context-test")
593e2915
 }
 
ab2baf08
 var prepareOneFile = func(t *testing.T) (string, func()) {
 	contextDir, cleanup := createTestTempDir(t, "", "builder-context-test")
 	createTestTempFile(t, contextDir, DefaultDockerfileName, dockerfileContents, 0777)
 	return contextDir, cleanup
593e2915
 }
 
ab2baf08
 func testValidateContextDirectory(t *testing.T, prepare func(t *testing.T) (string, func()), excludes []string) {
 	contextDir, cleanup := prepare(t)
 	defer cleanup()
593e2915
 
 	err := ValidateContextDirectory(contextDir, excludes)
 
 	if err != nil {
 		t.Fatalf("Error should be nil, got: %s", err)
 	}
 }
 
 func TestGetContextFromLocalDirNoDockerfile(t *testing.T) {
ab2baf08
 	contextDir, cleanup := createTestTempDir(t, "", "builder-context-test")
 	defer cleanup()
593e2915
 
 	absContextDir, relDockerfile, err := GetContextFromLocalDir(contextDir, "")
 
 	if err == nil {
 		t.Fatalf("Error should not be nil")
 	}
 
 	if absContextDir != "" {
 		t.Fatalf("Absolute directory path should be empty, got: %s", absContextDir)
 	}
 
 	if relDockerfile != "" {
 		t.Fatalf("Relative path to Dockerfile should be empty, got: %s", relDockerfile)
 	}
 }
 
 func TestGetContextFromLocalDirNotExistingDir(t *testing.T) {
ab2baf08
 	contextDir, cleanup := createTestTempDir(t, "", "builder-context-test")
 	defer cleanup()
593e2915
 
 	fakePath := filepath.Join(contextDir, "fake")
 
 	absContextDir, relDockerfile, err := GetContextFromLocalDir(fakePath, "")
 
 	if err == nil {
 		t.Fatalf("Error should not be nil")
 	}
 
 	if absContextDir != "" {
 		t.Fatalf("Absolute directory path should be empty, got: %s", absContextDir)
 	}
 
 	if relDockerfile != "" {
 		t.Fatalf("Relative path to Dockerfile should be empty, got: %s", relDockerfile)
 	}
 }
 
 func TestGetContextFromLocalDirNotExistingDockerfile(t *testing.T) {
ab2baf08
 	contextDir, cleanup := createTestTempDir(t, "", "builder-context-test")
 	defer cleanup()
593e2915
 
 	fakePath := filepath.Join(contextDir, "fake")
 
 	absContextDir, relDockerfile, err := GetContextFromLocalDir(contextDir, fakePath)
 
 	if err == nil {
 		t.Fatalf("Error should not be nil")
 	}
 
 	if absContextDir != "" {
 		t.Fatalf("Absolute directory path should be empty, got: %s", absContextDir)
 	}
 
 	if relDockerfile != "" {
 		t.Fatalf("Relative path to Dockerfile should be empty, got: %s", relDockerfile)
 	}
 }
 
 func TestGetContextFromLocalDirWithNoDirectory(t *testing.T) {
ab2baf08
 	contextDir, dirCleanup := createTestTempDir(t, "", "builder-context-test")
 	defer dirCleanup()
593e2915
 
ab2baf08
 	createTestTempFile(t, contextDir, DefaultDockerfileName, dockerfileContents, 0777)
593e2915
 
ab2baf08
 	chdirCleanup := chdir(t, contextDir)
 	defer chdirCleanup()
593e2915
 
ccd0da90
 	absContextDir, relDockerfile, err := GetContextFromLocalDir(contextDir, "")
593e2915
 
 	if err != nil {
 		t.Fatalf("Error when getting context from local dir: %s", err)
 	}
 
 	if absContextDir != contextDir {
 		t.Fatalf("Absolute directory path should be equal to %s, got: %s", contextDir, absContextDir)
 	}
 
 	if relDockerfile != DefaultDockerfileName {
 		t.Fatalf("Relative path to dockerfile should be equal to %s, got: %s", DefaultDockerfileName, relDockerfile)
 	}
 }
 
 func TestGetContextFromLocalDirWithDockerfile(t *testing.T) {
ab2baf08
 	contextDir, cleanup := createTestTempDir(t, "", "builder-context-test")
 	defer cleanup()
593e2915
 
ab2baf08
 	createTestTempFile(t, contextDir, DefaultDockerfileName, dockerfileContents, 0777)
593e2915
 
 	absContextDir, relDockerfile, err := GetContextFromLocalDir(contextDir, "")
 
 	if err != nil {
 		t.Fatalf("Error when getting context from local dir: %s", err)
 	}
 
 	if absContextDir != contextDir {
 		t.Fatalf("Absolute directory path should be equal to %s, got: %s", contextDir, absContextDir)
 	}
 
 	if relDockerfile != DefaultDockerfileName {
 		t.Fatalf("Relative path to dockerfile should be equal to %s, got: %s", DefaultDockerfileName, relDockerfile)
 	}
 }
 
 func TestGetContextFromLocalDirLocalFile(t *testing.T) {
ab2baf08
 	contextDir, cleanup := createTestTempDir(t, "", "builder-context-test")
 	defer cleanup()
593e2915
 
ab2baf08
 	createTestTempFile(t, contextDir, DefaultDockerfileName, dockerfileContents, 0777)
 	testFilename := createTestTempFile(t, contextDir, "tmpTest", "test", 0777)
593e2915
 
 	absContextDir, relDockerfile, err := GetContextFromLocalDir(testFilename, "")
 
 	if err == nil {
 		t.Fatalf("Error should not be nil")
 	}
 
 	if absContextDir != "" {
 		t.Fatalf("Absolute directory path should be empty, got: %s", absContextDir)
 	}
 
 	if relDockerfile != "" {
 		t.Fatalf("Relative path to Dockerfile should be empty, got: %s", relDockerfile)
 	}
 }
 
 func TestGetContextFromLocalDirWithCustomDockerfile(t *testing.T) {
ab2baf08
 	contextDir, cleanup := createTestTempDir(t, "", "builder-context-test")
 	defer cleanup()
593e2915
 
ab2baf08
 	chdirCleanup := chdir(t, contextDir)
 	defer chdirCleanup()
593e2915
 
ab2baf08
 	createTestTempFile(t, contextDir, DefaultDockerfileName, dockerfileContents, 0777)
593e2915
 
ab2baf08
 	absContextDir, relDockerfile, err := GetContextFromLocalDir(contextDir, DefaultDockerfileName)
593e2915
 
 	if err != nil {
 		t.Fatalf("Error when getting context from local dir: %s", err)
 	}
 
 	if absContextDir != contextDir {
 		t.Fatalf("Absolute directory path should be equal to %s, got: %s", contextDir, absContextDir)
 	}
 
ab2baf08
 	if relDockerfile != DefaultDockerfileName {
 		t.Fatalf("Relative path to dockerfile should be equal to %s, got: %s", DefaultDockerfileName, relDockerfile)
593e2915
 	}
 
 }
 
 func TestGetContextFromReaderString(t *testing.T) {
ab2baf08
 	tarArchive, relDockerfile, err := GetContextFromReader(ioutil.NopCloser(strings.NewReader(dockerfileContents)), "")
593e2915
 
 	if err != nil {
 		t.Fatalf("Error when executing GetContextFromReader: %s", err)
 	}
 
 	tarReader := tar.NewReader(tarArchive)
 
 	_, err = tarReader.Next()
 
 	if err != nil {
 		t.Fatalf("Error when reading tar archive: %s", err)
 	}
 
 	buff := new(bytes.Buffer)
 	buff.ReadFrom(tarReader)
 	contents := buff.String()
 
 	_, err = tarReader.Next()
 
 	if err != io.EOF {
 		t.Fatalf("Tar stream too long: %s", err)
 	}
 
 	if err = tarArchive.Close(); err != nil {
 		t.Fatalf("Error when closing tar stream: %s", err)
 	}
 
ab2baf08
 	if dockerfileContents != contents {
 		t.Fatalf("Uncompressed tar archive does not equal: %s, got: %s", dockerfileContents, contents)
593e2915
 	}
 
 	if relDockerfile != DefaultDockerfileName {
 		t.Fatalf("Relative path not equals %s, got: %s", DefaultDockerfileName, relDockerfile)
 	}
 }
 
 func TestGetContextFromReaderTar(t *testing.T) {
ab2baf08
 	contextDir, cleanup := createTestTempDir(t, "", "builder-context-test")
 	defer cleanup()
593e2915
 
ab2baf08
 	createTestTempFile(t, contextDir, DefaultDockerfileName, dockerfileContents, 0777)
593e2915
 
 	tarStream, err := archive.Tar(contextDir, archive.Uncompressed)
 
 	if err != nil {
 		t.Fatalf("Error when creating tar: %s", err)
 	}
 
ab2baf08
 	tarArchive, relDockerfile, err := GetContextFromReader(tarStream, DefaultDockerfileName)
593e2915
 
 	if err != nil {
 		t.Fatalf("Error when executing GetContextFromReader: %s", err)
 	}
 
 	tarReader := tar.NewReader(tarArchive)
 
 	header, err := tarReader.Next()
 
 	if err != nil {
 		t.Fatalf("Error when reading tar archive: %s", err)
 	}
 
ab2baf08
 	if header.Name != DefaultDockerfileName {
 		t.Fatalf("Dockerfile name should be: %s, got: %s", DefaultDockerfileName, header.Name)
593e2915
 	}
 
 	buff := new(bytes.Buffer)
 	buff.ReadFrom(tarReader)
 	contents := buff.String()
 
 	_, err = tarReader.Next()
 
 	if err != io.EOF {
 		t.Fatalf("Tar stream too long: %s", err)
 	}
 
 	if err = tarArchive.Close(); err != nil {
 		t.Fatalf("Error when closing tar stream: %s", err)
 	}
 
ab2baf08
 	if dockerfileContents != contents {
 		t.Fatalf("Uncompressed tar archive does not equal: %s, got: %s", dockerfileContents, contents)
593e2915
 	}
 
ab2baf08
 	if relDockerfile != DefaultDockerfileName {
 		t.Fatalf("Relative path not equals %s, got: %s", DefaultDockerfileName, relDockerfile)
593e2915
 	}
 }
 
 func TestValidateContextDirectoryEmptyContext(t *testing.T) {
ccd0da90
 	// This isn't a valid test on Windows. See https://play.golang.org/p/RR6z6jxR81.
 	// The test will ultimately end up calling filepath.Abs(""). On Windows,
 	// golang will error. On Linux, golang will return /. Due to there being
 	// drive letters on Windows, this is probably the correct behaviour for
 	// Windows.
 	if runtime.GOOS == "windows" {
 		t.Skip("Invalid test on Windows")
 	}
593e2915
 	testValidateContextDirectory(t, prepareEmpty, []string{})
 }
 
 func TestValidateContextDirectoryContextWithNoFiles(t *testing.T) {
 	testValidateContextDirectory(t, prepareNoFiles, []string{})
 }
 
 func TestValidateContextDirectoryWithOneFile(t *testing.T) {
 	testValidateContextDirectory(t, prepareOneFile, []string{})
 }
 
 func TestValidateContextDirectoryWithOneFileExcludes(t *testing.T) {
ab2baf08
 	testValidateContextDirectory(t, prepareOneFile, []string{DefaultDockerfileName})
593e2915
 }