summaryrefslogtreecommitdiff
path: root/api/server/server_unit_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'api/server/server_unit_test.go')
-rw-r--r--api/server/server_unit_test.go172
1 files changed, 170 insertions, 2 deletions
diff --git a/api/server/server_unit_test.go b/api/server/server_unit_test.go
index 32f8e42b18..2d14f89551 100644
--- a/api/server/server_unit_test.go
+++ b/api/server/server_unit_test.go
@@ -4,12 +4,14 @@ import (
"bytes"
"encoding/json"
"fmt"
- "github.com/dotcloud/docker/api"
- "github.com/dotcloud/docker/engine"
"io"
"net/http"
"net/http/httptest"
+ "strings"
"testing"
+
+ "github.com/dotcloud/docker/api"
+ "github.com/dotcloud/docker/engine"
)
func TestGetBoolParam(t *testing.T) {
@@ -151,6 +153,172 @@ func TestGetContainersByName(t *testing.T) {
}
}
+func TestGetEvents(t *testing.T) {
+ eng := engine.New()
+ var called bool
+ eng.Register("events", func(job *engine.Job) engine.Status {
+ called = true
+ since := job.Getenv("since")
+ if since != "1" {
+ t.Fatalf("'since' should be 1, found %#v instead", since)
+ }
+ until := job.Getenv("until")
+ if until != "0" {
+ t.Fatalf("'until' should be 0, found %#v instead", until)
+ }
+ v := &engine.Env{}
+ v.Set("since", since)
+ v.Set("until", until)
+ if _, err := v.WriteTo(job.Stdout); err != nil {
+ return job.Error(err)
+ }
+ return engine.StatusOK
+ })
+ r := serveRequest("GET", "/events?since=1&until=0", nil, eng, t)
+ if !called {
+ t.Fatal("handler was not called")
+ }
+ if r.HeaderMap.Get("Content-Type") != "application/json" {
+ t.Fatalf("%#v\n", r)
+ }
+ var stdout_json struct {
+ Since int
+ Until int
+ }
+ if err := json.Unmarshal(r.Body.Bytes(), &stdout_json); err != nil {
+ t.Fatalf("%#v", err)
+ }
+ if stdout_json.Since != 1 {
+ t.Fatalf("since != 1: %#v", stdout_json.Since)
+ }
+ if stdout_json.Until != 0 {
+ t.Fatalf("until != 0: %#v", stdout_json.Until)
+ }
+}
+
+func TestLogs(t *testing.T) {
+ eng := engine.New()
+ var inspect bool
+ var logs bool
+ eng.Register("container_inspect", func(job *engine.Job) engine.Status {
+ inspect = true
+ if len(job.Args) == 0 {
+ t.Fatal("Job arguments is empty")
+ }
+ if job.Args[0] != "test" {
+ t.Fatalf("Container name %s, must be test", job.Args[0])
+ }
+ return engine.StatusOK
+ })
+ expected := "logs"
+ eng.Register("logs", func(job *engine.Job) engine.Status {
+ logs = true
+ if len(job.Args) == 0 {
+ t.Fatal("Job arguments is empty")
+ }
+ if job.Args[0] != "test" {
+ t.Fatalf("Container name %s, must be test", job.Args[0])
+ }
+ follow := job.Getenv("follow")
+ if follow != "1" {
+ t.Fatalf("follow: %s, must be 1", follow)
+ }
+ stdout := job.Getenv("stdout")
+ if stdout != "1" {
+ t.Fatalf("stdout %s, must be 1", stdout)
+ }
+ stderr := job.Getenv("stderr")
+ if stderr != "" {
+ t.Fatalf("stderr %s, must be empty", stderr)
+ }
+ timestamps := job.Getenv("timestamps")
+ if timestamps != "1" {
+ t.Fatalf("timestamps %s, must be 1", timestamps)
+ }
+ job.Stdout.Write([]byte(expected))
+ return engine.StatusOK
+ })
+ r := serveRequest("GET", "/containers/test/logs?follow=1&stdout=1&timestamps=1", nil, eng, t)
+ if r.Code != http.StatusOK {
+ t.Fatalf("Got status %d, expected %d", r.Code, http.StatusOK)
+ }
+ if !inspect {
+ t.Fatal("container_inspect job was not called")
+ }
+ if !logs {
+ t.Fatal("logs job was not called")
+ }
+ res := r.Body.String()
+ if res != expected {
+ t.Fatalf("Output %s, expected %s", res, expected)
+ }
+}
+
+func TestLogsNoStreams(t *testing.T) {
+ eng := engine.New()
+ var inspect bool
+ var logs bool
+ eng.Register("container_inspect", func(job *engine.Job) engine.Status {
+ inspect = true
+ if len(job.Args) == 0 {
+ t.Fatal("Job arguments is empty")
+ }
+ if job.Args[0] != "test" {
+ t.Fatalf("Container name %s, must be test", job.Args[0])
+ }
+ return engine.StatusOK
+ })
+ eng.Register("logs", func(job *engine.Job) engine.Status {
+ logs = true
+ return engine.StatusOK
+ })
+ r := serveRequest("GET", "/containers/test/logs", nil, eng, t)
+ if r.Code != http.StatusBadRequest {
+ t.Fatalf("Got status %d, expected %d", r.Code, http.StatusBadRequest)
+ }
+ if inspect {
+ t.Fatal("container_inspect job was called, but it shouldn't")
+ }
+ if logs {
+ t.Fatal("logs job was called, but it shouldn't")
+ }
+ res := strings.TrimSpace(r.Body.String())
+ expected := "Bad parameters: you must choose at least one stream"
+ if !strings.Contains(res, expected) {
+ t.Fatalf("Output %s, expected %s in it", res, expected)
+ }
+}
+
+func TestGetImagesHistory(t *testing.T) {
+ eng := engine.New()
+ imageName := "docker-test-image"
+ var called bool
+ eng.Register("history", func(job *engine.Job) engine.Status {
+ called = true
+ if len(job.Args) == 0 {
+ t.Fatal("Job arguments is empty")
+ }
+ if job.Args[0] != imageName {
+ t.Fatalf("name != '%s': %#v", imageName, job.Args[0])
+ }
+ v := &engine.Env{}
+ if _, err := v.WriteTo(job.Stdout); err != nil {
+ return job.Error(err)
+ }
+ return engine.StatusOK
+ })
+ r := serveRequest("GET", "/images/"+imageName+"/history", nil, eng, t)
+ if !called {
+ t.Fatalf("handler was not called")
+ }
+ if r.Code != http.StatusOK {
+ t.Fatalf("Got status %d, expected %d", r.Code, http.StatusOK)
+ }
+ if r.HeaderMap.Get("Content-Type") != "application/json" {
+ t.Fatalf("%#v\n", r)
+ }
+}
+
func serveRequest(method, target string, body io.Reader, eng *engine.Engine, t *testing.T) *httptest.ResponseRecorder {
r := httptest.NewRecorder()
req, err := http.NewRequest(method, target, body)