diff --git a/api_test.go b/api_test.go index 757004b26b..17ada96eab 100644 --- a/api_test.go +++ b/api_test.go @@ -41,10 +41,8 @@ func TestGetBoolParam(t *testing.T) { } func TestGetVersion(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + var err error + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime} @@ -65,10 +63,7 @@ func TestGetVersion(t *testing.T) { } func TestGetInfo(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime} @@ -95,10 +90,7 @@ func TestGetInfo(t *testing.T) { } func TestGetImagesJSON(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime} @@ -220,10 +212,7 @@ func TestGetImagesJSON(t *testing.T) { } func TestGetImagesViz(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime} @@ -248,10 +237,7 @@ func TestGetImagesViz(t *testing.T) { } func TestGetImagesHistory(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime} @@ -272,10 +258,7 @@ func TestGetImagesHistory(t *testing.T) { } func TestGetImagesByName(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime} @@ -295,10 +278,7 @@ func TestGetImagesByName(t *testing.T) { } func TestGetContainersJSON(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime} @@ -334,10 +314,7 @@ func TestGetContainersJSON(t *testing.T) { } func TestGetContainersExport(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime} @@ -389,10 +366,7 @@ func TestGetContainersExport(t *testing.T) { } func TestGetContainersChanges(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime} @@ -492,10 +466,7 @@ func TestGetContainersTop(t *testing.T) { } func TestGetContainersByName(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime} @@ -528,10 +499,7 @@ func TestGetContainersByName(t *testing.T) { } func TestPostCommit(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime} @@ -576,249 +544,8 @@ func TestPostCommit(t *testing.T) { } } -func TestPostImagesCreate(t *testing.T) { - // FIXME: Use the staging in order to perform tests - - // runtime, err := newTestRuntime() - // if err != nil { - // t.Fatal(err) - // } - // defer nuke(runtime) - - // srv := &Server{runtime: runtime} - - // stdin, stdinPipe := io.Pipe() - // stdout, stdoutPipe := io.Pipe() - - // c1 := make(chan struct{}) - // go func() { - // defer close(c1) - - // r := &hijackTester{ - // ResponseRecorder: httptest.NewRecorder(), - // in: stdin, - // out: stdoutPipe, - // } - - // req, err := http.NewRequest("POST", "/images/create?fromImage="+unitTestImageName, bytes.NewReader([]byte{})) - // if err != nil { - // t.Fatal(err) - // } - - // body, err := postImagesCreate(srv, r, req, nil) - // if err != nil { - // t.Fatal(err) - // } - // if body != nil { - // t.Fatalf("No body expected, received: %s\n", body) - // } - // }() - - // // Acknowledge hijack - // setTimeout(t, "hijack acknowledge timed out", 2*time.Second, func() { - // stdout.Read([]byte{}) - // stdout.Read(make([]byte, 4096)) - // }) - - // setTimeout(t, "Waiting for imagesCreate output", 5*time.Second, func() { - // reader := bufio.NewReader(stdout) - // line, err := reader.ReadString('\n') - // if err != nil { - // t.Fatal(err) - // } - // if !strings.HasPrefix(line, "Pulling repository d from") { - // t.Fatalf("Expected Pulling repository docker-ut from..., found %s", line) - // } - // }) - - // // Close pipes (client disconnects) - // if err := closeWrap(stdin, stdinPipe, stdout, stdoutPipe); err != nil { - // t.Fatal(err) - // } - - // // Wait for imagesCreate to finish, the client disconnected, therefore, Create finished his job - // setTimeout(t, "Waiting for imagesCreate timed out", 10*time.Second, func() { - // <-c1 - // }) -} - -func TestPostImagesInsert(t *testing.T) { - // runtime, err := newTestRuntime() - // if err != nil { - // t.Fatal(err) - // } - // defer nuke(runtime) - - // srv := &Server{runtime: runtime} - - // stdin, stdinPipe := io.Pipe() - // stdout, stdoutPipe := io.Pipe() - - // // Attach to it - // c1 := make(chan struct{}) - // go func() { - // defer close(c1) - // r := &hijackTester{ - // ResponseRecorder: httptest.NewRecorder(), - // in: stdin, - // out: stdoutPipe, - // } - - // req, err := http.NewRequest("POST", "/images/"+unitTestImageName+"/insert?path=%2Ftest&url=https%3A%2F%2Fraw.github.com%2Fdotcloud%2Fdocker%2Fmaster%2FREADME.md", bytes.NewReader([]byte{})) - // if err != nil { - // t.Fatal(err) - // } - // if err := postContainersCreate(srv, r, req, nil); err != nil { - // t.Fatal(err) - // } - // }() - - // // Acknowledge hijack - // setTimeout(t, "hijack acknowledge timed out", 5*time.Second, func() { - // stdout.Read([]byte{}) - // stdout.Read(make([]byte, 4096)) - // }) - - // id := "" - // setTimeout(t, "Waiting for imagesInsert output", 10*time.Second, func() { - // for { - // reader := bufio.NewReader(stdout) - // id, err = reader.ReadString('\n') - // if err != nil { - // t.Fatal(err) - // } - // } - // }) - - // // Close pipes (client disconnects) - // if err := closeWrap(stdin, stdinPipe, stdout, stdoutPipe); err != nil { - // t.Fatal(err) - // } - - // // Wait for attach to finish, the client disconnected, therefore, Attach finished his job - // setTimeout(t, "Waiting for CmdAttach timed out", 2*time.Second, func() { - // <-c1 - // }) - - // img, err := srv.runtime.repositories.LookupImage(id) - // if err != nil { - // t.Fatalf("New image %s expected but not found", id) - // } - - // layer, err := img.layer() - // if err != nil { - // t.Fatal(err) - // } - - // if _, err := os.Stat(path.Join(layer, "test")); err != nil { - // t.Fatalf("The test file has not been found") - // } - - // if err := srv.runtime.graph.Delete(img.ID); err != nil { - // t.Fatal(err) - // } -} - -func TestPostImagesPush(t *testing.T) { - //FIXME: Use staging in order to perform tests - // runtime, err := newTestRuntime() - // if err != nil { - // t.Fatal(err) - // } - // defer nuke(runtime) - - // srv := &Server{runtime: runtime} - - // stdin, stdinPipe := io.Pipe() - // stdout, stdoutPipe := io.Pipe() - - // c1 := make(chan struct{}) - // go func() { - // r := &hijackTester{ - // ResponseRecorder: httptest.NewRecorder(), - // in: stdin, - // out: stdoutPipe, - // } - - // req, err := http.NewRequest("POST", "/images/docker-ut/push", bytes.NewReader([]byte{})) - // if err != nil { - // t.Fatal(err) - // } - - // body, err := postImagesPush(srv, r, req, map[string]string{"name": "docker-ut"}) - // close(c1) - // if err != nil { - // t.Fatal(err) - // } - // if body != nil { - // t.Fatalf("No body expected, received: %s\n", body) - // } - // }() - - // // Acknowledge hijack - // setTimeout(t, "hijack acknowledge timed out", 2*time.Second, func() { - // stdout.Read([]byte{}) - // stdout.Read(make([]byte, 4096)) - // }) - - // setTimeout(t, "Waiting for imagesCreate output", 5*time.Second, func() { - // reader := bufio.NewReader(stdout) - // line, err := reader.ReadString('\n') - // if err != nil { - // t.Fatal(err) - // } - // if !strings.HasPrefix(line, "Processing checksum") { - // t.Fatalf("Processing checksum..., found %s", line) - // } - // }) - - // // Close pipes (client disconnects) - // if err := closeWrap(stdin, stdinPipe, stdout, stdoutPipe); err != nil { - // t.Fatal(err) - // } - - // // Wait for imagesPush to finish, the client disconnected, therefore, Push finished his job - // setTimeout(t, "Waiting for imagesPush timed out", 10*time.Second, func() { - // <-c1 - // }) -} - -func TestPostImagesTag(t *testing.T) { - // FIXME: Use staging in order to perform tests - - // runtime, err := newTestRuntime() - // if err != nil { - // t.Fatal(err) - // } - // defer nuke(runtime) - - // srv := &Server{runtime: runtime} - - // r := httptest.NewRecorder() - - // req, err := http.NewRequest("POST", "/images/docker-ut/tag?repo=testrepo&tag=testtag", bytes.NewReader([]byte{})) - // if err != nil { - // t.Fatal(err) - // } - - // body, err := postImagesTag(srv, r, req, map[string]string{"name": "docker-ut"}) - // if err != nil { - // t.Fatal(err) - // } - - // if body != nil { - // t.Fatalf("No body expected, received: %s\n", body) - // } - // if r.Code != http.StatusCreated { - // t.Fatalf("%d Created expected, received %d\n", http.StatusCreated, r.Code) - // } -} - func TestPostContainersCreate(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime} @@ -869,10 +596,7 @@ func TestPostContainersCreate(t *testing.T) { } func TestPostContainersKill(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime} @@ -914,10 +638,7 @@ func TestPostContainersKill(t *testing.T) { } func TestPostContainersRestart(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime} @@ -971,10 +692,7 @@ func TestPostContainersRestart(t *testing.T) { } func TestPostContainersStart(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime} @@ -1024,10 +742,7 @@ func TestPostContainersStart(t *testing.T) { } func TestPostContainersStop(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime} @@ -1074,10 +789,7 @@ func TestPostContainersStop(t *testing.T) { } func TestPostContainersWait(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime} @@ -1119,10 +831,7 @@ func TestPostContainersWait(t *testing.T) { } func TestPostContainersAttach(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime} @@ -1208,10 +917,7 @@ func TestPostContainersAttach(t *testing.T) { // FIXME: Test deleting container with volume // FIXME: Test deleting volume in use by other container func TestDeleteContainers(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime} @@ -1251,10 +957,7 @@ func TestDeleteContainers(t *testing.T) { } func TestOptionsRoute(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime, enableCors: true} @@ -1277,10 +980,7 @@ func TestOptionsRoute(t *testing.T) { } func TestGetEnabledCors(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime, enableCors: true} @@ -1318,10 +1018,7 @@ func TestGetEnabledCors(t *testing.T) { } func TestDeleteImages(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime} diff --git a/buildfile_test.go b/buildfile_test.go index 9250f73765..b85a62cd05 100644 --- a/buildfile_test.go +++ b/buildfile_test.go @@ -105,10 +105,7 @@ CMD Hello world func TestBuild(t *testing.T) { for _, ctx := range testContexts { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{ diff --git a/commands_test.go b/commands_test.go index fe1c51a2a2..3f4c53db03 100644 --- a/commands_test.go +++ b/commands_test.go @@ -59,79 +59,6 @@ func assertPipe(input, output string, r io.Reader, w io.Writer, count int) error return nil } -/*TODO -func cmdImages(srv *Server, args ...string) (string, error) { - stdout, stdoutPipe := io.Pipe() - - go func() { - if err := srv.CmdImages(nil, stdoutPipe, args...); err != nil { - return - } - - // force the pipe closed, so that the code below gets an EOF - stdoutPipe.Close() - }() - - output, err := ioutil.ReadAll(stdout) - if err != nil { - return "", err - } - - // Cleanup pipes - return string(output), closeWrap(stdout, stdoutPipe) -} - -// TestImages checks that 'docker images' displays information correctly -func TestImages(t *testing.T) { - - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } - defer nuke(runtime) - - srv := &Server{runtime: runtime} - - output, err := cmdImages(srv) - - if !strings.Contains(output, "REPOSITORY") { - t.Fatal("'images' should have a header") - } - if !strings.Contains(output, "docker-ut") { - t.Fatal("'images' should show the docker-ut image") - } - if !strings.Contains(output, "e9aa60c60128") { - t.Fatal("'images' should show the docker-ut image id") - } - - output, err = cmdImages(srv, "-q") - - if strings.Contains(output, "REPOSITORY") { - t.Fatal("'images -q' should not have a header") - } - if strings.Contains(output, "docker-ut") { - t.Fatal("'images' should not show the docker-ut image name") - } - if !strings.Contains(output, "e9aa60c60128") { - t.Fatal("'images' should show the docker-ut image id") - } - - output, err = cmdImages(srv, "-viz") - - if !strings.HasPrefix(output, "digraph docker {") { - t.Fatal("'images -v' should start with the dot header") - } - if !strings.HasSuffix(output, "}\n") { - t.Fatal("'images -v' should end with a '}'") - } - if !strings.Contains(output, "base -> \"e9aa60c60128\" [style=invis]") { - t.Fatal("'images -v' should have the docker-ut image id node") - } - - // todo: add checks for -a -} - -*/ // TestRunHostname checks that 'docker run -h' correctly sets a custom hostname func TestRunHostname(t *testing.T) { @@ -164,163 +91,6 @@ func TestRunHostname(t *testing.T) { } -/* -func TestRunExit(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } - defer nuke(runtime) - - srv := &Server{runtime: runtime} - - stdin, stdinPipe := io.Pipe() - stdout, stdoutPipe := io.Pipe() - c1 := make(chan struct{}) - go func() { - srv.CmdRun(stdin, rcli.NewDockerLocalConn(stdoutPipe), "-i", GetTestImage(runtime).Id, "/bin/cat") - close(c1) - }() - - setTimeout(t, "Read/Write assertion timed out", 2*time.Second, func() { - if err := assertPipe("hello\n", "hello", stdout, stdinPipe, 15); err != nil { - t.Fatal(err) - } - }) - - container := runtime.List()[0] - - // Closing /bin/cat stdin, expect it to exit - p, err := container.StdinPipe() - if err != nil { - t.Fatal(err) - } - if err := p.Close(); err != nil { - t.Fatal(err) - } - - // as the process exited, CmdRun must finish and unblock. Wait for it - setTimeout(t, "Waiting for CmdRun timed out", 2*time.Second, func() { - <-c1 - cmdWait(srv, container) - }) - - // Make sure that the client has been disconnected - setTimeout(t, "The client should have been disconnected once the remote process exited.", 2*time.Second, func() { - // Expecting pipe i/o error, just check that read does not block - stdin.Read([]byte{}) - }) - - // Cleanup pipes - if err := closeWrap(stdin, stdinPipe, stdout, stdoutPipe); err != nil { - t.Fatal(err) - } -} - -// Expected behaviour: the process dies when the client disconnects -func TestRunDisconnect(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } - defer nuke(runtime) - - srv := &Server{runtime: runtime} - - stdin, stdinPipe := io.Pipe() - stdout, stdoutPipe := io.Pipe() - c1 := make(chan struct{}) - go func() { - // We're simulating a disconnect so the return value doesn't matter. What matters is the - // fact that CmdRun returns. - srv.CmdRun(stdin, rcli.NewDockerLocalConn(stdoutPipe), "-i", GetTestImage(runtime).Id, "/bin/cat") - close(c1) - }() - - setTimeout(t, "Read/Write assertion timed out", 2*time.Second, func() { - if err := assertPipe("hello\n", "hello", stdout, stdinPipe, 15); err != nil { - t.Fatal(err) - } - }) - - // Close pipes (simulate disconnect) - if err := closeWrap(stdin, stdinPipe, stdout, stdoutPipe); err != nil { - t.Fatal(err) - } - - // as the pipes are close, we expect the process to die, - // therefore CmdRun to unblock. Wait for CmdRun - setTimeout(t, "Waiting for CmdRun timed out", 2*time.Second, func() { - <-c1 - }) - - // Client disconnect after run -i should cause stdin to be closed, which should - // cause /bin/cat to exit. - setTimeout(t, "Waiting for /bin/cat to exit timed out", 2*time.Second, func() { - container := runtime.List()[0] - container.Wait() - if container.State.Running { - t.Fatalf("/bin/cat is still running after closing stdin") - } - }) -} - -// Expected behaviour: the process dies when the client disconnects -func TestRunDisconnectTty(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } - defer nuke(runtime) - - srv := &Server{runtime: runtime} - - stdin, stdinPipe := io.Pipe() - stdout, stdoutPipe := io.Pipe() - c1 := make(chan struct{}) - go func() { - // We're simulating a disconnect so the return value doesn't matter. What matters is the - // fact that CmdRun returns. - srv.CmdRun(stdin, rcli.NewDockerLocalConn(stdoutPipe), "-i", "-t", GetTestImage(runtime).Id, "/bin/cat") - close(c1) - }() - - setTimeout(t, "Waiting for the container to be started timed out", 2*time.Second, func() { - for { - // Client disconnect after run -i should keep stdin out in TTY mode - l := runtime.List() - if len(l) == 1 && l[0].State.Running { - break - } - - time.Sleep(10 * time.Millisecond) - } - }) - - // Client disconnect after run -i should keep stdin out in TTY mode - container := runtime.List()[0] - - setTimeout(t, "Read/Write assertion timed out", 2*time.Second, func() { - if err := assertPipe("hello\n", "hello", stdout, stdinPipe, 15); err != nil { - t.Fatal(err) - } - }) - - // Close pipes (simulate disconnect) - if err := closeWrap(stdin, stdinPipe, stdout, stdoutPipe); err != nil { - t.Fatal(err) - } - - // In tty mode, we expect the process to stay alive even after client's stdin closes. - // Do not wait for run to finish - - // Give some time to monitor to do his thing - container.WaitTimeout(500 * time.Millisecond) - if !container.State.Running { - t.Fatalf("/bin/cat should still be running after closing stdin (tty mode)") - } -} -*/ // TestAttachStdin checks attaching to stdin without stdout and stderr. // 'docker run -i -a stdin' should sends the client's stdin to the command, @@ -387,74 +157,3 @@ func TestRunAttachStdin(t *testing.T) { } } } - -/* -// Expected behaviour, the process stays alive when the client disconnects -func TestAttachDisconnect(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } - defer nuke(runtime) - - srv := &Server{runtime: runtime} - - container, err := NewBuilder(runtime).Create( - &Config{ - Image: GetTestImage(runtime).Id, - CpuShares: 1000, - Memory: 33554432, - Cmd: []string{"/bin/cat"}, - OpenStdin: true, - }, - ) - if err != nil { - t.Fatal(err) - } - defer runtime.Destroy(container) - - // Start the process - if err := container.Start(); err != nil { - t.Fatal(err) - } - - stdin, stdinPipe := io.Pipe() - stdout, stdoutPipe := io.Pipe() - - // Attach to it - c1 := make(chan struct{}) - go func() { - // We're simulating a disconnect so the return value doesn't matter. What matters is the - // fact that CmdAttach returns. - srv.CmdAttach(stdin, rcli.NewDockerLocalConn(stdoutPipe), container.Id) - close(c1) - }() - - setTimeout(t, "First read/write assertion timed out", 2*time.Second, func() { - if err := assertPipe("hello\n", "hello", stdout, stdinPipe, 15); err != nil { - t.Fatal(err) - } - }) - // Close pipes (client disconnects) - if err := closeWrap(stdin, stdinPipe, stdout, stdoutPipe); err != nil { - t.Fatal(err) - } - - // Wait for attach to finish, the client disconnected, therefore, Attach finished his job - setTimeout(t, "Waiting for CmdAttach timed out", 2*time.Second, func() { - <-c1 - }) - - // We closed stdin, expect /bin/cat to still be running - // Wait a little bit to make sure container.monitor() did his thing - err = container.WaitTimeout(500 * time.Millisecond) - if err == nil || !container.State.Running { - t.Fatalf("/bin/cat is not running after closing stdin") - } - - // Try to avoid the timeoout in destroy. Best effort, don't check error - cStdin, _ := container.StdinPipe() - cStdin.Close() - container.Wait() -} -*/ diff --git a/container_test.go b/container_test.go index 7646bb3793..e7f6818eb6 100644 --- a/container_test.go +++ b/container_test.go @@ -1046,10 +1046,7 @@ func TestEnv(t *testing.T) { } func TestEntrypoint(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) container, err := NewBuilder(runtime).Create( &Config{ @@ -1125,10 +1122,7 @@ func TestLXCConfig(t *testing.T) { } func BenchmarkRunSequencial(b *testing.B) { - runtime, err := newTestRuntime() - if err != nil { - b.Fatal(err) - } + runtime := mkRuntime(b) defer nuke(runtime) for i := 0; i < b.N; i++ { container, err := NewBuilder(runtime).Create(&Config{ @@ -1154,10 +1148,7 @@ func BenchmarkRunSequencial(b *testing.B) { } func BenchmarkRunParallel(b *testing.B) { - runtime, err := newTestRuntime() - if err != nil { - b.Fatal(err) - } + runtime := mkRuntime(b) defer nuke(runtime) var tasks []chan error diff --git a/runtime_test.go b/runtime_test.go index d8033467c2..9d43bd46e5 100644 --- a/runtime_test.go +++ b/runtime_test.go @@ -114,26 +114,6 @@ func init() { // FIXME: test that ImagePull(json=true) send correct json output -func newTestRuntime() (*Runtime, error) { - root, err := ioutil.TempDir("", "docker-test") - if err != nil { - return nil, err - } - if err := os.Remove(root); err != nil { - return nil, err - } - if err := utils.CopyDirectory(unitTestStoreBase, root); err != nil { - return nil, err - } - - runtime, err := NewRuntimeFromDirectory(root, false) - if err != nil { - return nil, err - } - runtime.UpdateCapabilities(true) - return runtime, nil -} - func GetTestImage(runtime *Runtime) *Image { imgs, err := runtime.graph.All() if err != nil { @@ -148,10 +128,7 @@ func GetTestImage(runtime *Runtime) *Image { } func TestRuntimeCreate(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) // Make sure we start we 0 containers @@ -223,10 +200,7 @@ func TestRuntimeCreate(t *testing.T) { } func TestDestroy(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) container, err := NewBuilder(runtime).Create(&Config{ Image: GetTestImage(runtime).ID, @@ -270,10 +244,7 @@ func TestDestroy(t *testing.T) { } func TestGet(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) builder := NewBuilder(runtime) @@ -323,11 +294,8 @@ func TestGet(t *testing.T) { } func startEchoServerContainer(t *testing.T, proto string) (*Runtime, *Container, string) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } - + var err error + runtime := mkRuntime(t) port := 5554 var container *Container var strPort string diff --git a/server_test.go b/server_test.go index cf3e3f0bc8..05a286aaa8 100644 --- a/server_test.go +++ b/server_test.go @@ -5,10 +5,7 @@ import ( ) func TestContainerTagImageDelete(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime} @@ -62,10 +59,7 @@ func TestContainerTagImageDelete(t *testing.T) { } func TestCreateRm(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime} @@ -95,10 +89,7 @@ func TestCreateRm(t *testing.T) { } func TestCreateStartRestartStopStartKillRm(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) srv := &Server{runtime: runtime} @@ -154,11 +145,9 @@ func TestCreateStartRestartStopStartKillRm(t *testing.T) { } func TestRunWithTooLowMemoryLimit(t *testing.T) { - runtime, err := newTestRuntime() + var err error + runtime := mkRuntime(t) srv := &Server{runtime: runtime} - if err != nil { - t.Fatal(err) - } defer nuke(runtime) // Try to create a container with a memory limit of 1 byte less than the minimum allowed limit. _, err = srv.ContainerCreate( diff --git a/tags_test.go b/tags_test.go index 1974e751be..d920943795 100644 --- a/tags_test.go +++ b/tags_test.go @@ -5,10 +5,7 @@ import ( ) func TestLookupImage(t *testing.T) { - runtime, err := newTestRuntime() - if err != nil { - t.Fatal(err) - } + runtime := mkRuntime(t) defer nuke(runtime) if img, err := runtime.repositories.LookupImage(unitTestImageName); err != nil { diff --git a/utils_test.go b/utils_test.go index 5958aa70fe..4951d3a02d 100644 --- a/utils_test.go +++ b/utils_test.go @@ -7,6 +7,7 @@ import ( "path" "strings" "testing" + "github.com/dotcloud/docker/utils" ) // This file contains utility functions for docker's unit test suite. @@ -15,14 +16,40 @@ import ( // Create a temporary runtime suitable for unit testing. // Call t.Fatal() at the first error. -func mkRuntime(t *testing.T) *Runtime { +func mkRuntime(f Fataler) *Runtime { runtime, err := newTestRuntime() if err != nil { - t.Fatal(err) + f.Fatal(err) } return runtime } +// A common interface to access the Fatal method of +// both testing.B and testing.T. +type Fataler interface { + Fatal(args ...interface{}) +} + +func newTestRuntime() (*Runtime, error) { + root, err := ioutil.TempDir("", "docker-test") + if err != nil { + return nil, err + } + if err := os.Remove(root); err != nil { + return nil, err + } + if err := utils.CopyDirectory(unitTestStoreBase, root); err != nil { + return nil, err + } + + runtime, err := NewRuntimeFromDirectory(root, false) + if err != nil { + return nil, err + } + runtime.UpdateCapabilities(true) + return runtime, nil +} + // Write `content` to the file at path `dst`, creating it if necessary, // as well as any missing directories. // The file is truncated if it already exists.