e0ef11a4c2
This patch creates interfaces in builder/ for building Docker images. It is a first step in a series of patches to remove the daemon dependency on builder and later allow a client-side Dockerfile builder as well as potential builder plugins. It is needed because we cannot remove the /build API endpoint, so we need to keep the server-side Dockerfile builder, but we also want to reuse the same Dockerfile parser and evaluator for both server-side and client-side. builder/dockerfile/ and api/server/builder.go contain implementations of those interfaces as a refactoring of the current code. Signed-off-by: Tibor Vass <tibor@docker.com>
103 lines
2.3 KiB
Go
103 lines
2.3 KiB
Go
package utils
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func TestReplaceAndAppendEnvVars(t *testing.T) {
|
|
var (
|
|
d = []string{"HOME=/"}
|
|
o = []string{"HOME=/root", "TERM=xterm"}
|
|
)
|
|
|
|
env := ReplaceOrAppendEnvValues(d, o)
|
|
if len(env) != 2 {
|
|
t.Fatalf("expected len of 2 got %d", len(env))
|
|
}
|
|
if env[0] != "HOME=/root" {
|
|
t.Fatalf("expected HOME=/root got '%s'", env[0])
|
|
}
|
|
if env[1] != "TERM=xterm" {
|
|
t.Fatalf("expected TERM=xterm got '%s'", env[1])
|
|
}
|
|
}
|
|
|
|
func TestImageReference(t *testing.T) {
|
|
tests := []struct {
|
|
repo string
|
|
ref string
|
|
expected string
|
|
}{
|
|
{"repo", "tag", "repo:tag"},
|
|
{"repo", "sha256:c100b11b25d0cacd52c14e0e7bf525e1a4c0e6aec8827ae007055545909d1a64", "repo@sha256:c100b11b25d0cacd52c14e0e7bf525e1a4c0e6aec8827ae007055545909d1a64"},
|
|
}
|
|
|
|
for i, test := range tests {
|
|
actual := ImageReference(test.repo, test.ref)
|
|
if test.expected != actual {
|
|
t.Errorf("%d: expected %q, got %q", i, test.expected, actual)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestDigestReference(t *testing.T) {
|
|
input := "sha256:c100b11b25d0cacd52c14e0e7bf525e1a4c0e6aec8827ae007055545909d1a64"
|
|
if !DigestReference(input) {
|
|
t.Errorf("Expected DigestReference=true for input %q", input)
|
|
}
|
|
|
|
input = "latest"
|
|
if DigestReference(input) {
|
|
t.Errorf("Unexpected DigestReference=true for input %q", input)
|
|
}
|
|
}
|
|
|
|
func TestReadDockerIgnore(t *testing.T) {
|
|
tmpDir, err := ioutil.TempDir("", "dockerignore-test")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.RemoveAll(tmpDir)
|
|
|
|
di, err := ReadDockerIgnore(nil)
|
|
if err != nil {
|
|
t.Fatalf("Expected not to have error, got %v", err)
|
|
}
|
|
|
|
if diLen := len(di); diLen != 0 {
|
|
t.Fatalf("Expected to have zero dockerignore entry, got %d", diLen)
|
|
}
|
|
|
|
diName := filepath.Join(tmpDir, ".dockerignore")
|
|
content := fmt.Sprintf("test1\n/test2\n/a/file/here\n\nlastfile")
|
|
err = ioutil.WriteFile(diName, []byte(content), 0777)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
diFd, err := os.Open(diName)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
di, err = ReadDockerIgnore(diFd)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if di[0] != "test1" {
|
|
t.Fatalf("First element is not test1")
|
|
}
|
|
if di[1] != "/test2" {
|
|
t.Fatalf("Second element is not /test2")
|
|
}
|
|
if di[2] != "/a/file/here" {
|
|
t.Fatalf("Third element is not /a/file/here")
|
|
}
|
|
if di[3] != "lastfile" {
|
|
t.Fatalf("Fourth element is not lastfile")
|
|
}
|
|
}
|