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")
		}
	}
}