mirror of https://github.com/docker/docs.git
Merge pull request #5004 from shykes/api-unit-tests
Replace integration tests with unit tests for the remote API
This commit is contained in:
commit
dbd1e304f5
|
|
@ -2,8 +2,13 @@ package server
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/dotcloud/docker/api"
|
||||||
|
"github.com/dotcloud/docker/engine"
|
||||||
|
"github.com/dotcloud/docker/utils"
|
||||||
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -50,3 +55,126 @@ func TesthttpError(t *testing.T) {
|
||||||
t.Fatalf("Expected %d, got %d", http.StatusInternalServerError, r.Code)
|
t.Fatalf("Expected %d, got %d", http.StatusInternalServerError, r.Code)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetVersion(t *testing.T) {
|
||||||
|
tmp, err := utils.TestDirectory("")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(tmp)
|
||||||
|
eng, err := engine.New(tmp)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
var called bool
|
||||||
|
eng.Register("version", func(job *engine.Job) engine.Status {
|
||||||
|
called = true
|
||||||
|
v := &engine.Env{}
|
||||||
|
v.Set("Version", "42.1")
|
||||||
|
v.Set("ApiVersion", "1.1.1.1.1")
|
||||||
|
v.Set("GoVersion", "2.42")
|
||||||
|
v.Set("Os", "Linux")
|
||||||
|
v.Set("Arch", "x86_64")
|
||||||
|
if _, err := v.WriteTo(job.Stdout); err != nil {
|
||||||
|
return job.Error(err)
|
||||||
|
}
|
||||||
|
return engine.StatusOK
|
||||||
|
})
|
||||||
|
|
||||||
|
r := httptest.NewRecorder()
|
||||||
|
req, err := http.NewRequest("GET", "/version", nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
// FIXME getting the version should require an actual running Server
|
||||||
|
if err := ServeRequest(eng, api.APIVERSION, r, req); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if !called {
|
||||||
|
t.Fatalf("handler was not called")
|
||||||
|
}
|
||||||
|
out := engine.NewOutput()
|
||||||
|
v, err := out.AddEnv()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if _, err := io.Copy(out, r.Body); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
out.Close()
|
||||||
|
expected := "42.1"
|
||||||
|
if result := v.Get("Version"); result != expected {
|
||||||
|
t.Errorf("Expected version %s, %s found", expected, result)
|
||||||
|
}
|
||||||
|
expected = "application/json"
|
||||||
|
if result := r.HeaderMap.Get("Content-Type"); result != expected {
|
||||||
|
t.Errorf("Expected Content-Type %s, %s found", expected, result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetInfo(t *testing.T) {
|
||||||
|
tmp, err := utils.TestDirectory("")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(tmp)
|
||||||
|
eng, err := engine.New(tmp)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var called bool
|
||||||
|
eng.Register("info", func(job *engine.Job) engine.Status {
|
||||||
|
called = true
|
||||||
|
v := &engine.Env{}
|
||||||
|
v.SetInt("Containers", 1)
|
||||||
|
v.SetInt("Images", 42000)
|
||||||
|
if _, err := v.WriteTo(job.Stdout); err != nil {
|
||||||
|
return job.Error(err)
|
||||||
|
}
|
||||||
|
return engine.StatusOK
|
||||||
|
})
|
||||||
|
|
||||||
|
r := httptest.NewRecorder()
|
||||||
|
req, err := http.NewRequest("GET", "/info", nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
// FIXME getting the version should require an actual running Server
|
||||||
|
if err := ServeRequest(eng, api.APIVERSION, r, req); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if !called {
|
||||||
|
t.Fatalf("handler was not called")
|
||||||
|
}
|
||||||
|
|
||||||
|
out := engine.NewOutput()
|
||||||
|
i, err := out.AddEnv()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if _, err := io.Copy(out, r.Body); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
out.Close()
|
||||||
|
{
|
||||||
|
expected := 42000
|
||||||
|
result := i.GetInt("Images")
|
||||||
|
if expected != result {
|
||||||
|
t.Fatalf("%#v\n", result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
expected := 1
|
||||||
|
result := i.GetInt("Containers")
|
||||||
|
if expected != result {
|
||||||
|
t.Fatalf("%#v\n", result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
expected := "application/json"
|
||||||
|
if result := r.HeaderMap.Get("Content-Type"); result != expected {
|
||||||
|
t.Fatalf("%#v\n", result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -194,25 +194,7 @@ func (env *Env) SetAuto(k string, v interface{}) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (env *Env) Encode(dst io.Writer) error {
|
func (env *Env) Encode(dst io.Writer) error {
|
||||||
m := make(map[string]interface{})
|
return json.NewEncoder(dst).Encode(env.Map())
|
||||||
for k, v := range env.Map() {
|
|
||||||
var val interface{}
|
|
||||||
if err := json.Unmarshal([]byte(v), &val); err == nil {
|
|
||||||
// FIXME: we fix-convert float values to int, because
|
|
||||||
// encoding/json decodes integers to float64, but cannot encode them back.
|
|
||||||
// (See http://golang.org/src/pkg/encoding/json/decode.go#L46)
|
|
||||||
if fval, isFloat := val.(float64); isFloat {
|
|
||||||
val = int(fval)
|
|
||||||
}
|
|
||||||
m[k] = val
|
|
||||||
} else {
|
|
||||||
m[k] = v
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err := json.NewEncoder(dst).Encode(&m); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (env *Env) WriteTo(dst io.Writer) (n int64, err error) {
|
func (env *Env) WriteTo(dst io.Writer) (n int64, err error) {
|
||||||
|
|
|
||||||
|
|
@ -95,3 +95,21 @@ func TestEnviron(t *testing.T) {
|
||||||
t.Fatalf("bar not found in the environ")
|
t.Fatalf("bar not found in the environ")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestEnvWriteTo(t *testing.T) {
|
||||||
|
e := &Env{}
|
||||||
|
inputKey := "Version"
|
||||||
|
inputVal := "42.1"
|
||||||
|
e.Set(inputKey, inputVal)
|
||||||
|
out := NewOutput()
|
||||||
|
e2, err := out.AddEnv()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
e.WriteTo(out)
|
||||||
|
result := e2.Get(inputKey)
|
||||||
|
expected := inputVal
|
||||||
|
if expected != result {
|
||||||
|
t.Fatalf("%#v\n", result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,6 @@ import (
|
||||||
|
|
||||||
"github.com/dotcloud/docker/api"
|
"github.com/dotcloud/docker/api"
|
||||||
"github.com/dotcloud/docker/api/server"
|
"github.com/dotcloud/docker/api/server"
|
||||||
"github.com/dotcloud/docker/dockerversion"
|
|
||||||
"github.com/dotcloud/docker/engine"
|
"github.com/dotcloud/docker/engine"
|
||||||
"github.com/dotcloud/docker/image"
|
"github.com/dotcloud/docker/image"
|
||||||
"github.com/dotcloud/docker/runconfig"
|
"github.com/dotcloud/docker/runconfig"
|
||||||
|
|
@ -25,83 +24,6 @@ import (
|
||||||
"github.com/dotcloud/docker/vendor/src/code.google.com/p/go/src/pkg/archive/tar"
|
"github.com/dotcloud/docker/vendor/src/code.google.com/p/go/src/pkg/archive/tar"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetVersion(t *testing.T) {
|
|
||||||
eng := NewTestEngine(t)
|
|
||||||
defer mkRuntimeFromEngine(eng, t).Nuke()
|
|
||||||
|
|
||||||
var err error
|
|
||||||
r := httptest.NewRecorder()
|
|
||||||
|
|
||||||
req, err := http.NewRequest("GET", "/version", nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
// FIXME getting the version should require an actual running Server
|
|
||||||
if err := server.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
assertHttpNotError(r, t)
|
|
||||||
|
|
||||||
out := engine.NewOutput()
|
|
||||||
v, err := out.AddEnv()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
if _, err := io.Copy(out, r.Body); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
out.Close()
|
|
||||||
expected := dockerversion.VERSION
|
|
||||||
if result := v.Get("Version"); result != expected {
|
|
||||||
t.Errorf("Expected version %s, %s found", expected, result)
|
|
||||||
}
|
|
||||||
expected = "application/json"
|
|
||||||
if result := r.HeaderMap.Get("Content-Type"); result != expected {
|
|
||||||
t.Errorf("Expected Content-Type %s, %s found", expected, result)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestGetInfo(t *testing.T) {
|
|
||||||
eng := NewTestEngine(t)
|
|
||||||
defer mkRuntimeFromEngine(eng, t).Nuke()
|
|
||||||
|
|
||||||
job := eng.Job("images")
|
|
||||||
initialImages, err := job.Stdout.AddListTable()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
if err := job.Run(); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
req, err := http.NewRequest("GET", "/info", nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
r := httptest.NewRecorder()
|
|
||||||
|
|
||||||
if err := server.ServeRequest(eng, api.APIVERSION, r, req); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
assertHttpNotError(r, t)
|
|
||||||
|
|
||||||
out := engine.NewOutput()
|
|
||||||
i, err := out.AddEnv()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
if _, err := io.Copy(out, r.Body); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
out.Close()
|
|
||||||
if images := i.GetInt("Images"); images != initialImages.Len() {
|
|
||||||
t.Errorf("Expected images: %d, %d found", initialImages.Len(), images)
|
|
||||||
}
|
|
||||||
expected := "application/json"
|
|
||||||
if result := r.HeaderMap.Get("Content-Type"); result != expected {
|
|
||||||
t.Errorf("Expected Content-Type %s, %s found", expected, result)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestGetEvents(t *testing.T) {
|
func TestGetEvents(t *testing.T) {
|
||||||
eng := NewTestEngine(t)
|
eng := NewTestEngine(t)
|
||||||
srv := mkServerFromEngine(eng, t)
|
srv := mkServerFromEngine(eng, t)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue