2013-05-28 22:31:06 +00:00
|
|
|
package docker
|
|
|
|
|
|
|
|
import (
|
2013-07-02 10:47:37 +00:00
|
|
|
"fmt"
|
2013-06-15 18:07:49 +00:00
|
|
|
"io/ioutil"
|
2013-05-28 22:31:06 +00:00
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
2013-06-15 18:07:49 +00:00
|
|
|
// mkTestContext generates a build context from the contents of the provided dockerfile.
|
|
|
|
// This context is suitable for use as an argument to BuildFile.Build()
|
|
|
|
func mkTestContext(dockerfile string, files [][2]string, t *testing.T) Archive {
|
2013-07-02 22:27:22 +00:00
|
|
|
context, err := mkBuildContext(fmt.Sprintf(dockerfile, unitTestImageID), files)
|
2013-06-15 18:07:49 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
return context
|
|
|
|
}
|
2013-05-28 22:31:06 +00:00
|
|
|
|
2013-06-15 18:07:49 +00:00
|
|
|
// A testContextTemplate describes a build context and how to test it
|
|
|
|
type testContextTemplate struct {
|
|
|
|
// Contents of the Dockerfile
|
|
|
|
dockerfile string
|
|
|
|
// Additional files in the context, eg [][2]string{"./passwd", "gordon"}
|
|
|
|
files [][2]string
|
|
|
|
}
|
2013-06-11 14:39:06 +00:00
|
|
|
|
2013-06-15 18:07:49 +00:00
|
|
|
// A table of all the contexts to build and test.
|
|
|
|
// A new docker runtime will be created and torn down for each context.
|
2013-07-02 22:27:22 +00:00
|
|
|
var testContexts = []testContextTemplate{
|
2013-06-15 18:07:49 +00:00
|
|
|
{
|
|
|
|
`
|
2013-06-30 04:22:15 +00:00
|
|
|
from %s
|
2013-06-11 14:39:06 +00:00
|
|
|
run sh -c 'echo root:testpass > /tmp/passwd'
|
2013-06-14 01:52:41 +00:00
|
|
|
run mkdir -p /var/run/sshd
|
2013-06-21 03:16:39 +00:00
|
|
|
run [ "$(cat /tmp/passwd)" = "root:testpass" ]
|
|
|
|
run [ "$(ls -d /var/run/sshd)" = "/var/run/sshd" ]
|
2013-06-15 18:07:49 +00:00
|
|
|
`,
|
|
|
|
nil,
|
|
|
|
},
|
2013-06-15 18:35:56 +00:00
|
|
|
|
|
|
|
{
|
|
|
|
`
|
2013-06-30 04:22:15 +00:00
|
|
|
from %s
|
2013-06-21 03:42:19 +00:00
|
|
|
add foo /usr/lib/bla/bar
|
|
|
|
run [ "$(cat /usr/lib/bla/bar)" = 'hello world!' ]
|
|
|
|
`,
|
2013-06-15 18:35:56 +00:00
|
|
|
[][2]string{{"foo", "hello world!"}},
|
2013-06-21 03:42:19 +00:00
|
|
|
},
|
2013-06-11 14:39:06 +00:00
|
|
|
|
2013-06-21 03:42:19 +00:00
|
|
|
{
|
|
|
|
`
|
2013-06-30 04:22:15 +00:00
|
|
|
from %s
|
2013-06-21 03:42:19 +00:00
|
|
|
add f /
|
|
|
|
run [ "$(cat /f)" = "hello" ]
|
|
|
|
add f /abc
|
|
|
|
run [ "$(cat /abc)" = "hello" ]
|
|
|
|
add f /x/y/z
|
|
|
|
run [ "$(cat /x/y/z)" = "hello" ]
|
|
|
|
add f /x/y/d/
|
|
|
|
run [ "$(cat /x/y/d/f)" = "hello" ]
|
|
|
|
add d /
|
|
|
|
run [ "$(cat /ga)" = "bu" ]
|
|
|
|
add d /somewhere
|
|
|
|
run [ "$(cat /somewhere/ga)" = "bu" ]
|
|
|
|
add d /anotherplace/
|
|
|
|
run [ "$(cat /anotherplace/ga)" = "bu" ]
|
|
|
|
add d /somewheeeere/over/the/rainbooow
|
|
|
|
run [ "$(cat /somewheeeere/over/the/rainbooow/ga)" = "bu" ]
|
|
|
|
`,
|
|
|
|
[][2]string{
|
|
|
|
{"f", "hello"},
|
|
|
|
{"d/ga", "bu"},
|
2013-06-15 18:35:56 +00:00
|
|
|
},
|
|
|
|
},
|
2013-06-14 23:43:39 +00:00
|
|
|
|
2013-06-21 05:02:36 +00:00
|
|
|
{
|
|
|
|
`
|
2013-06-30 04:22:15 +00:00
|
|
|
from %s
|
2013-06-21 05:02:36 +00:00
|
|
|
env FOO BAR
|
|
|
|
run [ "$FOO" = "BAR" ]
|
2013-06-25 02:20:05 +00:00
|
|
|
`,
|
|
|
|
nil,
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
`
|
2013-07-08 22:23:04 +00:00
|
|
|
from %s
|
2013-06-25 02:20:05 +00:00
|
|
|
ENTRYPOINT /bin/echo
|
|
|
|
CMD Hello world
|
2013-07-04 02:33:30 +00:00
|
|
|
`,
|
|
|
|
nil,
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
`
|
2013-07-10 16:03:07 +00:00
|
|
|
from %s
|
2013-07-04 02:33:30 +00:00
|
|
|
VOLUME /test
|
|
|
|
CMD Hello world
|
2013-06-21 05:02:36 +00:00
|
|
|
`,
|
|
|
|
nil,
|
|
|
|
},
|
|
|
|
}
|
2013-06-14 23:43:39 +00:00
|
|
|
|
|
|
|
// FIXME: test building with 2 successive overlapping ADD commands
|
|
|
|
|
2013-05-28 22:31:06 +00:00
|
|
|
func TestBuild(t *testing.T) {
|
2013-06-15 18:07:49 +00:00
|
|
|
for _, ctx := range testContexts {
|
2013-06-11 14:39:06 +00:00
|
|
|
runtime, err := newTestRuntime()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
defer nuke(runtime)
|
2013-05-28 22:31:06 +00:00
|
|
|
|
2013-06-28 00:52:47 +00:00
|
|
|
srv := &Server{
|
2013-07-02 10:47:37 +00:00
|
|
|
runtime: runtime,
|
2013-06-28 00:52:47 +00:00
|
|
|
pullingPool: make(map[string]struct{}),
|
|
|
|
pushingPool: make(map[string]struct{}),
|
|
|
|
}
|
2013-05-28 22:31:06 +00:00
|
|
|
|
2013-06-15 18:07:49 +00:00
|
|
|
buildfile := NewBuildFile(srv, ioutil.Discard)
|
2013-06-21 03:42:19 +00:00
|
|
|
if _, err := buildfile.Build(mkTestContext(ctx.dockerfile, ctx.files, t)); err != nil {
|
2013-06-11 14:39:06 +00:00
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2013-05-28 22:31:06 +00:00
|
|
|
}
|
|
|
|
}
|
2013-07-08 13:02:06 +00:00
|
|
|
|
|
|
|
func TestVolume(t *testing.T) {
|
|
|
|
runtime, err := newTestRuntime()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
defer nuke(runtime)
|
|
|
|
|
|
|
|
srv := &Server{
|
|
|
|
runtime: runtime,
|
|
|
|
pullingPool: make(map[string]struct{}),
|
|
|
|
pushingPool: make(map[string]struct{}),
|
|
|
|
}
|
|
|
|
|
|
|
|
buildfile := NewBuildFile(srv, ioutil.Discard)
|
|
|
|
imgId, err := buildfile.Build(mkTestContext(`
|
2013-07-10 16:03:07 +00:00
|
|
|
from %s
|
2013-07-08 13:02:06 +00:00
|
|
|
VOLUME /test
|
|
|
|
CMD Hello world
|
|
|
|
`, nil, t))
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
img, err := srv.ImageInspect(imgId)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
if len(img.Config.Volumes) == 0 {
|
|
|
|
t.Fail()
|
|
|
|
}
|
|
|
|
for key, _ := range img.Config.Volumes {
|
|
|
|
if key != "/test" {
|
|
|
|
t.Fail()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|