package docker

import (
	"github.com/dotcloud/docker/utils"
	"strings"
	"testing"
)

const Dockerfile = `
# VERSION		0.1
# DOCKER-VERSION	0.2

from   ` + unitTestImageName + `
run    sh -c 'echo root:testpass > /tmp/passwd'
run    mkdir -p /var/run/sshd
`

const DockerfileNoNewLine = `
# VERSION		0.1
# DOCKER-VERSION	0.2

from   ` + unitTestImageName + `
run    sh -c 'echo root:testpass > /tmp/passwd'
run    mkdir -p /var/run/sshd`

// FIXME: test building with a context

// FIXME: test building with a local ADD as first command

// FIXME: test building with 2 successive overlapping ADD commands

func TestBuild(t *testing.T) {
	dockerfiles := []string{Dockerfile, DockerfileNoNewLine}
	for _, Dockerfile := range dockerfiles {
		runtime, err := newTestRuntime()
		if err != nil {
			t.Fatal(err)
		}
		defer nuke(runtime)

		srv := &Server{runtime: runtime}

		buildfile := NewBuildFile(srv, &utils.NopWriter{})

		imgID, err := buildfile.Build(strings.NewReader(Dockerfile), nil)
		if err != nil {
			t.Fatal(err)
		}

		builder := NewBuilder(runtime)
		container, err := builder.Create(
			&Config{
				Image: imgID,
				Cmd:   []string{"cat", "/tmp/passwd"},
			},
		)
		if err != nil {
			t.Fatal(err)
		}
		defer runtime.Destroy(container)

		output, err := container.Output()
		if err != nil {
			t.Fatal(err)
		}
		if string(output) != "root:testpass\n" {
			t.Fatalf("Unexpected output. Read '%s', expected '%s'", output, "root:testpass\n")
		}

		container2, err := builder.Create(
			&Config{
				Image: imgID,
				Cmd:   []string{"ls", "-d", "/var/run/sshd"},
			},
		)
		if err != nil {
			t.Fatal(err)
		}
		defer runtime.Destroy(container2)

		output, err = container2.Output()
		if err != nil {
			t.Fatal(err)
		}
		if string(output) != "/var/run/sshd\n" {
			t.Fatal("/var/run/sshd has not been created")
		}
	}
}
