summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Morozov <lk4d4math@gmail.com>2015-04-16 11:40:29 -0700
committerAlexander Morozov <lk4d4math@gmail.com>2015-04-16 11:40:29 -0700
commit27edbd2868c5e44d54c5a51ca220fa4cd568e17a (patch)
tree37f6c7c1b56bfa0242e4623fd178ea49f69ac27d
parentdfa5feab2fd31486f7e7bc532eac213dbaaea45d (diff)
parent308a23021d65282cdf471ef0708ba5998b48c247 (diff)
downloaddocker-27edbd2868c5e44d54c5a51ca220fa4cd568e17a.tar.gz
Merge pull request #12407 from cpuguy83/move_integration_api_tests
Move some integration api tests
-rw-r--r--integration-cli/docker_api_containers_test.go233
-rw-r--r--integration-cli/docker_api_images_test.go31
-rw-r--r--integration-cli/docker_utils.go33
-rw-r--r--integration/api_test.go313
4 files changed, 281 insertions, 329 deletions
diff --git a/integration-cli/docker_api_containers_test.go b/integration-cli/docker_api_containers_test.go
index d48b945724..cabbfc2045 100644
--- a/integration-cli/docker_api_containers_test.go
+++ b/integration-cli/docker_api_containers_test.go
@@ -369,10 +369,15 @@ func TestBuildApiDockerfilePath(t *testing.T) {
t.Fatalf("failed to close tar archive: %v", err)
}
- _, out, err := sockRequestRaw("POST", "/build?dockerfile=../Dockerfile", buffer, "application/x-tar")
+ _, body, err := sockRequestRaw("POST", "/build?dockerfile=../Dockerfile", buffer, "application/x-tar")
if err == nil {
+ out, _ := readBody(body)
t.Fatalf("Build was supposed to fail: %s", out)
}
+ out, err := readBody(body)
+ if err != nil {
+ t.Fatal(err)
+ }
if !strings.Contains(string(out), "must be within the build context") {
t.Fatalf("Didn't complain about leaving build context: %s", out)
@@ -393,10 +398,14 @@ RUN find /tmp/`,
}
defer server.Close()
- _, buf, err := sockRequestRaw("POST", "/build?dockerfile=baz&remote="+server.URL()+"/testD", nil, "application/json")
+ _, body, err := sockRequestRaw("POST", "/build?dockerfile=baz&remote="+server.URL()+"/testD", nil, "application/json")
if err != nil {
t.Fatalf("Build failed: %s", err)
}
+ buf, err := readBody(body)
+ if err != nil {
+ t.Fatal(err)
+ }
// Make sure Dockerfile exists.
// Make sure 'baz' doesn't exist ANYWHERE despite being mentioned in the URL
@@ -419,10 +428,15 @@ RUN echo from dockerfile`,
}
defer git.Close()
- _, buf, err := sockRequestRaw("POST", "/build?remote="+git.RepoURL, nil, "application/json")
+ _, body, err := sockRequestRaw("POST", "/build?remote="+git.RepoURL, nil, "application/json")
if err != nil {
+ buf, _ := readBody(body)
t.Fatalf("Build failed: %s\n%q", err, buf)
}
+ buf, err := readBody(body)
+ if err != nil {
+ t.Fatal(err)
+ }
out := string(buf)
if !strings.Contains(out, "from dockerfile") {
@@ -445,10 +459,15 @@ RUN echo from Dockerfile`,
defer git.Close()
// Make sure it tries to 'dockerfile' query param value
- _, buf, err := sockRequestRaw("POST", "/build?dockerfile=baz&remote="+git.RepoURL, nil, "application/json")
+ _, body, err := sockRequestRaw("POST", "/build?dockerfile=baz&remote="+git.RepoURL, nil, "application/json")
if err != nil {
+ buf, _ := readBody(body)
t.Fatalf("Build failed: %s\n%q", err, buf)
}
+ buf, err := readBody(body)
+ if err != nil {
+ t.Fatal(err)
+ }
out := string(buf)
if !strings.Contains(out, "from baz") {
@@ -472,10 +491,14 @@ RUN echo from dockerfile`,
defer git.Close()
// Make sure it tries to 'dockerfile' query param value
- _, buf, err := sockRequestRaw("POST", "/build?remote="+git.RepoURL, nil, "application/json")
+ _, body, err := sockRequestRaw("POST", "/build?remote="+git.RepoURL, nil, "application/json")
if err != nil {
t.Fatalf("Build failed: %s", err)
}
+ buf, err := readBody(body)
+ if err != nil {
+ t.Fatal(err)
+ }
out := string(buf)
if !strings.Contains(out, "from Dockerfile") {
@@ -503,10 +526,15 @@ func TestBuildApiDockerfileSymlink(t *testing.T) {
t.Fatalf("failed to close tar archive: %v", err)
}
- _, out, err := sockRequestRaw("POST", "/build", buffer, "application/x-tar")
+ _, body, err := sockRequestRaw("POST", "/build", buffer, "application/x-tar")
if err == nil {
+ out, _ := readBody(body)
t.Fatalf("Build was supposed to fail: %s", out)
}
+ out, err := readBody(body)
+ if err != nil {
+ t.Fatal(err)
+ }
// The reason the error is "Cannot locate specified Dockerfile" is because
// in the builder, the symlink is resolved within the context, therefore
@@ -596,3 +624,196 @@ func TestContainerApiPause(t *testing.T) {
logDone("container REST API - check POST containers/pause and unpause")
}
+
+func TestContainerApiTop(t *testing.T) {
+ defer deleteAllContainers()
+ out, _, _ := dockerCmd(t, "run", "-d", "-i", "busybox", "/bin/sh", "-c", "cat")
+ id := strings.TrimSpace(out)
+ if err := waitRun(id); err != nil {
+ t.Fatal(err)
+ }
+
+ type topResp struct {
+ Titles []string
+ Processes [][]string
+ }
+ var top topResp
+ _, b, err := sockRequest("GET", "/containers/"+id+"/top?ps_args=aux", nil)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if err := json.Unmarshal(b, &top); err != nil {
+ t.Fatal(err)
+ }
+
+ if len(top.Titles) != 11 {
+ t.Fatalf("expected 11 titles, found %d: %v", len(top.Titles), top.Titles)
+ }
+
+ if top.Titles[0] != "USER" || top.Titles[10] != "COMMAND" {
+ t.Fatalf("expected `USER` at `Titles[0]` and `COMMAND` at Titles[10]: %v", top.Titles)
+ }
+ if len(top.Processes) != 2 {
+ t.Fatalf("expeted 2 processes, found %d: %v", len(top.Processes), top.Processes)
+ }
+ if top.Processes[0][10] != "/bin/sh -c cat" {
+ t.Fatalf("expected `/bin/sh -c cat`, found: %s", top.Processes[0][10])
+ }
+ if top.Processes[1][10] != "cat" {
+ t.Fatalf("expected `cat`, found: %s", top.Processes[1][10])
+ }
+
+ logDone("containers REST API - GET /containers/<id>/top")
+}
+
+func TestContainerApiCommit(t *testing.T) {
+ out, _, _ := dockerCmd(t, "run", "-d", "busybox", "/bin/sh", "-c", "touch /test")
+ id := strings.TrimSpace(out)
+
+ name := "testcommit"
+ _, b, err := sockRequest("POST", "/commit?repo="+name+"&testtag=tag&container="+id, nil)
+ if err != nil && !strings.Contains(err.Error(), "200 OK: 201") {
+ t.Fatal(err)
+ }
+
+ type resp struct {
+ Id string
+ }
+ var img resp
+ if err := json.Unmarshal(b, &img); err != nil {
+ t.Fatal(err)
+ }
+ defer deleteImages(img.Id)
+
+ out, err = inspectField(img.Id, "Config.Cmd")
+ if out != "[/bin/sh -c touch /test]" {
+ t.Fatalf("got wrong Cmd from commit: %q", out)
+ }
+ // sanity check, make sure the image is what we think it is
+ dockerCmd(t, "run", img.Id, "ls", "/test")
+
+ logDone("containers REST API - POST /commit")
+}
+
+func TestContainerApiCreate(t *testing.T) {
+ defer deleteAllContainers()
+ config := map[string]interface{}{
+ "Image": "busybox",
+ "Cmd": []string{"/bin/sh", "-c", "touch /test && ls /test"},
+ }
+
+ _, b, err := sockRequest("POST", "/containers/create", config)
+ if err != nil && !strings.Contains(err.Error(), "200 OK: 201") {
+ t.Fatal(err)
+ }
+ type createResp struct {
+ Id string
+ }
+ var container createResp
+ if err := json.Unmarshal(b, &container); err != nil {
+ t.Fatal(err)
+ }
+
+ out, _, _ := dockerCmd(t, "start", "-a", container.Id)
+ if strings.TrimSpace(out) != "/test" {
+ t.Fatalf("expected output `/test`, got %q", out)
+ }
+
+ logDone("containers REST API - POST /containers/create")
+}
+
+func TestContainerApiVerifyHeader(t *testing.T) {
+ defer deleteAllContainers()
+ config := map[string]interface{}{
+ "Image": "busybox",
+ }
+
+ create := func(ct string) (int, io.ReadCloser, error) {
+ jsonData := bytes.NewBuffer(nil)
+ if err := json.NewEncoder(jsonData).Encode(config); err != nil {
+ t.Fatal(err)
+ }
+ return sockRequestRaw("POST", "/containers/create", jsonData, ct)
+ }
+
+ // Try with no content-type
+ _, body, err := create("")
+ if err == nil {
+ b, _ := readBody(body)
+ t.Fatalf("expected error when content-type is not set: %q", string(b))
+ }
+ body.Close()
+ // Try with wrong content-type
+ _, body, err = create("application/xml")
+ if err == nil {
+ b, _ := readBody(body)
+ t.Fatalf("expected error when content-type is not set: %q", string(b))
+ }
+ body.Close()
+
+ // now application/json
+ _, body, err = create("application/json")
+ if err != nil && !strings.Contains(err.Error(), "200 OK: 201") {
+ b, _ := readBody(body)
+ t.Fatalf("%v - %q", err, string(b))
+ }
+ body.Close()
+
+ logDone("containers REST API - verify create header")
+}
+
+// Issue 7941 - test to make sure a "null" in JSON is just ignored.
+// W/o this fix a null in JSON would be parsed into a string var as "null"
+func TestContainerApiPostCreateNull(t *testing.T) {
+ config := `{
+ "Hostname":"",
+ "Domainname":"",
+ "Memory":0,
+ "MemorySwap":0,
+ "CpuShares":0,
+ "Cpuset":null,
+ "AttachStdin":true,
+ "AttachStdout":true,
+ "AttachStderr":true,
+ "PortSpecs":null,
+ "ExposedPorts":{},
+ "Tty":true,
+ "OpenStdin":true,
+ "StdinOnce":true,
+ "Env":[],
+ "Cmd":"ls",
+ "Image":"busybox",
+ "Volumes":{},
+ "WorkingDir":"",
+ "Entrypoint":null,
+ "NetworkDisabled":false,
+ "OnBuild":null}`
+
+ _, body, err := sockRequestRaw("POST", "/containers/create", strings.NewReader(config), "application/json")
+ if err != nil && !strings.Contains(err.Error(), "200 OK: 201") {
+ b, _ := readBody(body)
+ t.Fatal(err, string(b))
+ }
+
+ b, err := readBody(body)
+ if err != nil {
+ t.Fatal(err)
+ }
+ type createResp struct {
+ Id string
+ }
+ var container createResp
+ if err := json.Unmarshal(b, &container); err != nil {
+ t.Fatal(err)
+ }
+
+ out, err := inspectField(container.Id, "HostConfig.CpusetCpus")
+ if err != nil {
+ t.Fatal(err, out)
+ }
+ if out != "" {
+ t.Fatalf("expected empty string, got %q", out)
+ }
+
+ logDone("containers REST API - Create Null")
+}
diff --git a/integration-cli/docker_api_images_test.go b/integration-cli/docker_api_images_test.go
index ee403a1880..083d63204f 100644
--- a/integration-cli/docker_api_images_test.go
+++ b/integration-cli/docker_api_images_test.go
@@ -3,6 +3,7 @@ package main
import (
"encoding/json"
"net/url"
+ "strings"
"testing"
"github.com/docker/docker/api/types"
@@ -67,3 +68,33 @@ func TestApiImagesFilter(t *testing.T) {
logDone("images - filter param is applied")
}
+
+func TestApiImagesSaveAndLoad(t *testing.T) {
+ out, err := buildImage("saveandload", "FROM hello-world\nENV FOO bar", false)
+ if err != nil {
+ t.Fatal(err)
+ }
+ id := strings.TrimSpace(out)
+ defer deleteImages("saveandload")
+
+ _, body, err := sockRequestRaw("GET", "/images/"+id+"/get", nil, "")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer body.Close()
+
+ dockerCmd(t, "rmi", id)
+
+ _, loadBody, err := sockRequestRaw("POST", "/images/load", body, "application/x-tar")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer loadBody.Close()
+
+ out, _, _ = dockerCmd(t, "inspect", "--format='{{ .Id }}'", id)
+ if strings.TrimSpace(out) != id {
+ t.Fatal("load did not work properly")
+ }
+
+ logDone("images API - save and load")
+}
diff --git a/integration-cli/docker_utils.go b/integration-cli/docker_utils.go
index 4984b578bc..367e518094 100644
--- a/integration-cli/docker_utils.go
+++ b/integration-cli/docker_utils.go
@@ -22,6 +22,7 @@ import (
"time"
"github.com/docker/docker/api"
+ "github.com/docker/docker/pkg/ioutils"
"github.com/docker/docker/pkg/stringutils"
)
@@ -304,41 +305,53 @@ func sockRequest(method, endpoint string, data interface{}) (int, []byte, error)
return -1, nil, err
}
- return sockRequestRaw(method, endpoint, jsonData, "application/json")
+ status, body, err := sockRequestRaw(method, endpoint, jsonData, "application/json")
+ if err != nil {
+ b, _ := ioutil.ReadAll(body)
+ return status, b, err
+ }
+ var b []byte
+ b, err = readBody(body)
+ return status, b, err
}
-func sockRequestRaw(method, endpoint string, data io.Reader, ct string) (int, []byte, error) {
+func sockRequestRaw(method, endpoint string, data io.Reader, ct string) (int, io.ReadCloser, error) {
c, err := sockConn(time.Duration(10 * time.Second))
if err != nil {
return -1, nil, fmt.Errorf("could not dial docker daemon: %v", err)
}
client := httputil.NewClientConn(c, nil)
- defer client.Close()
req, err := http.NewRequest(method, endpoint, data)
if err != nil {
+ client.Close()
return -1, nil, fmt.Errorf("could not create new request: %v", err)
}
- if ct == "" {
- ct = "application/json"
+ if ct != "" {
+ req.Header.Set("Content-Type", ct)
}
- req.Header.Set("Content-Type", ct)
resp, err := client.Do(req)
if err != nil {
+ client.Close()
return -1, nil, fmt.Errorf("could not perform request: %v", err)
}
- defer resp.Body.Close()
+ body := ioutils.NewReadCloserWrapper(resp.Body, func() error {
+ defer client.Close()
+ return resp.Body.Close()
+ })
if resp.StatusCode != http.StatusOK {
- body, _ := ioutil.ReadAll(resp.Body)
return resp.StatusCode, body, fmt.Errorf("received status != 200 OK: %s", resp.Status)
}
- b, err := ioutil.ReadAll(resp.Body)
+ return resp.StatusCode, body, err
+}
- return resp.StatusCode, b, err
+func readBody(b io.ReadCloser) ([]byte, error) {
+ defer b.Close()
+ return ioutil.ReadAll(b)
}
func deleteContainer(container string) error {
diff --git a/integration/api_test.go b/integration/api_test.go
index 3a795f94f9..4b09e49174 100644
--- a/integration/api_test.go
+++ b/integration/api_test.go
@@ -4,335 +4,22 @@ import (
"bufio"
"bytes"
"encoding/json"
- "fmt"
"io"
"io/ioutil"
"net"
"net/http"
"net/http/httptest"
- "strings"
"testing"
"time"
"github.com/docker/docker/api"
"github.com/docker/docker/api/server"
"github.com/docker/docker/api/types"
- "github.com/docker/docker/builder"
"github.com/docker/docker/engine"
"github.com/docker/docker/runconfig"
"github.com/docker/docker/vendor/src/code.google.com/p/go/src/pkg/archive/tar"
)
-func TestSaveImageAndThenLoad(t *testing.T) {
- eng := NewTestEngine(t)
- defer mkDaemonFromEngine(eng, t).Nuke()
-
- // save image
- r := httptest.NewRecorder()
- req, err := http.NewRequest("GET", "/images/"+unitTestImageID+"/get", nil)
- if err != nil {
- t.Fatal(err)
- }
- server.ServeRequest(eng, api.APIVERSION, r, req)
- if r.Code != http.StatusOK {
- t.Fatalf("%d OK expected, received %d\n", http.StatusOK, r.Code)
- }
- tarball := r.Body
-
- // delete the image
- r = httptest.NewRecorder()
- req, err = http.NewRequest("DELETE", "/images/"+unitTestImageID, nil)
- if err != nil {
- t.Fatal(err)
- }
- server.ServeRequest(eng, api.APIVERSION, r, req)
- if r.Code != http.StatusOK {
- t.Fatalf("%d OK expected, received %d\n", http.StatusOK, r.Code)
- }
-
- // make sure there is no image
- r = httptest.NewRecorder()
- req, err = http.NewRequest("GET", "/images/"+unitTestImageID+"/get", nil)
- if err != nil {
- t.Fatal(err)
- }
- server.ServeRequest(eng, api.APIVERSION, r, req)
- if r.Code != http.StatusNotFound {
- t.Fatalf("%d NotFound expected, received %d\n", http.StatusNotFound, r.Code)
- }
-
- // load the image
- r = httptest.NewRecorder()
- req, err = http.NewRequest("POST", "/images/load", tarball)
- if err != nil {
- t.Fatal(err)
- }
- server.ServeRequest(eng, api.APIVERSION, r, req)
- if r.Code != http.StatusOK {
- t.Fatalf("%d OK expected, received %d\n", http.StatusOK, r.Code)
- }
-
- // finally make sure the image is there
- r = httptest.NewRecorder()
- req, err = http.NewRequest("GET", "/images/"+unitTestImageID+"/get", nil)
- if err != nil {
- t.Fatal(err)
- }
- server.ServeRequest(eng, api.APIVERSION, r, req)
- if r.Code != http.StatusOK {
- t.Fatalf("%d OK expected, received %d\n", http.StatusOK, r.Code)
- }
-}
-
-func TestGetContainersTop(t *testing.T) {
- eng := NewTestEngine(t)
- defer mkDaemonFromEngine(eng, t).Nuke()
-
- containerID := createTestContainer(eng,
- &runconfig.Config{
- Image: unitTestImageID,
- Cmd: runconfig.NewCommand("/bin/sh", "-c", "cat"),
- OpenStdin: true,
- },
- t,
- )
- defer func() {
- // Make sure the process dies before destroying daemon
- containerKill(eng, containerID, t)
- containerWait(eng, containerID, t)
- }()
-
- startContainer(eng, containerID, t)
-
- setTimeout(t, "Waiting for the container to be started timed out", 10*time.Second, func() {
- for {
- if containerRunning(eng, containerID, t) {
- break
- }
- time.Sleep(10 * time.Millisecond)
- }
- })
-
- if !containerRunning(eng, containerID, t) {
- t.Fatalf("Container should be running")
- }
-
- // Make sure sh spawn up cat
- setTimeout(t, "read/write assertion timed out", 2*time.Second, func() {
- in, out := containerAttach(eng, containerID, t)
- if err := assertPipe("hello\n", "hello", out, in, 150); err != nil {
- t.Fatal(err)
- }
- })
-
- r := httptest.NewRecorder()
- req, err := http.NewRequest("GET", "/containers/"+containerID+"/top?ps_args=aux", nil)
- if err != nil {
- t.Fatal(err)
- }
- server.ServeRequest(eng, api.APIVERSION, r, req)
- assertHttpNotError(r, t)
- var procs engine.Env
- if err := procs.Decode(r.Body); err != nil {
- t.Fatal(err)
- }
-
- if len(procs.GetList("Titles")) != 11 {
- t.Fatalf("Expected 11 titles, found %d.", len(procs.GetList("Titles")))
- }
- if procs.GetList("Titles")[0] != "USER" || procs.GetList("Titles")[10] != "COMMAND" {
- t.Fatalf("Expected Titles[0] to be USER and Titles[10] to be COMMAND, found %s and %s.", procs.GetList("Titles")[0], procs.GetList("Titles")[10])
- }
- processes := [][]string{}
- if err := procs.GetJson("Processes", &processes); err != nil {
- t.Fatal(err)
- }
- if len(processes) != 2 {
- t.Fatalf("Expected 2 processes, found %d.", len(processes))
- }
- if processes[0][10] != "/bin/sh -c cat" {
- t.Fatalf("Expected `/bin/sh -c cat`, found %s.", processes[0][10])
- }
- if processes[1][10] != "/bin/sh -c cat" {
- t.Fatalf("Expected `/bin/sh -c cat`, found %s.", processes[1][10])
- }
-}
-
-func TestPostCommit(t *testing.T) {
- eng := NewTestEngine(t)
- b := &builder.BuilderJob{Engine: eng}
- b.Install()
- defer mkDaemonFromEngine(eng, t).Nuke()
-
- // Create a container and remove a file
- containerID := createTestContainer(eng,
- &runconfig.Config{
- Image: unitTestImageID,
- Cmd: runconfig.NewCommand("touch", "/test"),
- },
- t,
- )
-
- containerRun(eng, containerID, t)
-
- req, err := http.NewRequest("POST", "/commit?repo=testrepo&testtag=tag&container="+containerID, bytes.NewReader([]byte{}))
- if err != nil {
- t.Fatal(err)
- }
-
- r := httptest.NewRecorder()
- server.ServeRequest(eng, api.APIVERSION, r, req)
- assertHttpNotError(r, t)
- if r.Code != http.StatusCreated {
- t.Fatalf("%d Created expected, received %d\n", http.StatusCreated, r.Code)
- }
-
- var env engine.Env
- if err := env.Decode(r.Body); err != nil {
- t.Fatal(err)
- }
- if err := eng.Job("image_inspect", env.Get("Id")).Run(); err != nil {
- t.Fatalf("The image has not been committed")
- }
-}
-
-func TestPostContainersCreate(t *testing.T) {
- eng := NewTestEngine(t)
- defer mkDaemonFromEngine(eng, t).Nuke()
-
- configJSON, err := json.Marshal(&runconfig.Config{
- Image: unitTestImageID,
- Cmd: runconfig.NewCommand("touch", "/test"),
- })
- if err != nil {
- t.Fatal(err)
- }
-
- req, err := http.NewRequest("POST", "/containers/create", bytes.NewReader(configJSON))
- if err != nil {
- t.Fatal(err)
- }
-
- req.Header.Set("Content-Type", "application/json")
-
- r := httptest.NewRecorder()
- server.ServeRequest(eng, api.APIVERSION, r, req)
- assertHttpNotError(r, t)
- if r.Code != http.StatusCreated {
- t.Fatalf("%d Created expected, received %d\n", http.StatusCreated, r.Code)
- }
-
- var apiRun engine.Env
- if err := apiRun.Decode(r.Body); err != nil {
- t.Fatal(err)
- }
- containerID := apiRun.Get("Id")
-
- containerAssertExists(eng, containerID, t)
- containerRun(eng, containerID, t)
-
- if !containerFileExists(eng, containerID, "test", t) {
- t.Fatal("Test file was not created")
- }
-}
-
-func TestPostJsonVerify(t *testing.T) {
- eng := NewTestEngine(t)
- defer mkDaemonFromEngine(eng, t).Nuke()
-
- configJSON, err := json.Marshal(&runconfig.Config{
- Image: unitTestImageID,
- Cmd: runconfig.NewCommand("touch", "/test"),
- })
- if err != nil {
- t.Fatal(err)
- }
-
- req, err := http.NewRequest("POST", "/containers/create", bytes.NewReader(configJSON))
- if err != nil {
- t.Fatal(err)
- }
-
- r := httptest.NewRecorder()
-
- server.ServeRequest(eng, api.APIVERSION, r, req)
-
- // Don't add Content-Type header
- // req.Header.Set("Content-Type", "application/json")
-
- server.ServeRequest(eng, api.APIVERSION, r, req)
- if r.Code != http.StatusInternalServerError || !strings.Contains(((*r.Body).String()), "application/json") {
- t.Fatal("Create should have failed due to no Content-Type header - got:", r)
- }
-
- // Now add header but with wrong type and retest
- req.Header.Set("Content-Type", "application/xml")
-
- server.ServeRequest(eng, api.APIVERSION, r, req)
- if r.Code != http.StatusInternalServerError || !strings.Contains(((*r.Body).String()), "application/json") {
- t.Fatal("Create should have failed due to wrong Content-Type header - got:", r)
- }
-}
-
-// Issue 7941 - test to make sure a "null" in JSON is just ignored.
-// W/o this fix a null in JSON would be parsed into a string var as "null"
-func TestPostCreateNull(t *testing.T) {
- eng := NewTestEngine(t)
- daemon := mkDaemonFromEngine(eng, t)
- defer daemon.Nuke()
-
- configStr := fmt.Sprintf(`{
- "Hostname":"",
- "Domainname":"",
- "Memory":0,
- "MemorySwap":0,
- "CpuShares":0,
- "Cpuset":null,
- "AttachStdin":true,
- "AttachStdout":true,
- "AttachStderr":true,
- "PortSpecs":null,
- "ExposedPorts":{},
- "Tty":true,
- "OpenStdin":true,
- "StdinOnce":true,
- "Env":[],
- "Cmd":"ls",
- "Image":"%s",
- "Volumes":{},
- "WorkingDir":"",
- "Entrypoint":null,
- "NetworkDisabled":false,
- "OnBuild":null}`, unitTestImageID)
-
- req, err := http.NewRequest("POST", "/containers/create", strings.NewReader(configStr))
- if err != nil {
- t.Fatal(err)
- }
-
- req.Header.Set("Content-Type", "application/json")
-
- r := httptest.NewRecorder()
- server.ServeRequest(eng, api.APIVERSION, r, req)
- assertHttpNotError(r, t)
- if r.Code != http.StatusCreated {
- t.Fatalf("%d Created expected, received %d\n", http.StatusCreated, r.Code)
- }
-
- var apiRun engine.Env
- if err := apiRun.Decode(r.Body); err != nil {
- t.Fatal(err)
- }
- containerID := apiRun.Get("Id")
-
- containerAssertExists(eng, containerID, t)
-
- c, _ := daemon.Get(containerID)
- if c.HostConfig().CpusetCpus != "" {
- t.Fatalf("Cpuset should have been empty - instead its:" + c.HostConfig().CpusetCpus)
- }
-}
-
func TestPostContainersKill(t *testing.T) {
eng := NewTestEngine(t)
defer mkDaemonFromEngine(eng, t).Nuke()