github.com/endocode/docker@v1.4.2-0.20160113120958-46eb4700391e/integration-cli/docker_api_exec_test.go (about) 1 // +build !test_no_exec 2 3 package main 4 5 import ( 6 "bytes" 7 "encoding/json" 8 "fmt" 9 "net/http" 10 "strings" 11 12 "github.com/docker/docker/pkg/integration/checker" 13 "github.com/go-check/check" 14 ) 15 16 // Regression test for #9414 17 func (s *DockerSuite) TestExecApiCreateNoCmd(c *check.C) { 18 testRequires(c, DaemonIsLinux) 19 name := "exec_test" 20 dockerCmd(c, "run", "-d", "-t", "--name", name, "busybox", "/bin/sh") 21 22 status, body, err := sockRequest("POST", fmt.Sprintf("/containers/%s/exec", name), map[string]interface{}{"Cmd": nil}) 23 c.Assert(err, checker.IsNil) 24 c.Assert(status, checker.Equals, http.StatusInternalServerError) 25 26 comment := check.Commentf("Expected message when creating exec command with no Cmd specified") 27 c.Assert(string(body), checker.Contains, "No exec command specified", comment) 28 } 29 30 func (s *DockerSuite) TestExecApiCreateNoValidContentType(c *check.C) { 31 testRequires(c, DaemonIsLinux) 32 name := "exec_test" 33 dockerCmd(c, "run", "-d", "-t", "--name", name, "busybox", "/bin/sh") 34 35 jsonData := bytes.NewBuffer(nil) 36 if err := json.NewEncoder(jsonData).Encode(map[string]interface{}{"Cmd": nil}); err != nil { 37 c.Fatalf("Can not encode data to json %s", err) 38 } 39 40 res, body, err := sockRequestRaw("POST", fmt.Sprintf("/containers/%s/exec", name), jsonData, "text/plain") 41 c.Assert(err, checker.IsNil) 42 c.Assert(res.StatusCode, checker.Equals, http.StatusInternalServerError) 43 44 b, err := readBody(body) 45 c.Assert(err, checker.IsNil) 46 47 comment := check.Commentf("Expected message when creating exec command with invalid Content-Type specified") 48 c.Assert(string(b), checker.Contains, "Content-Type specified", comment) 49 } 50 51 func (s *DockerSuite) TestExecApiCreateContainerPaused(c *check.C) { 52 testRequires(c, DaemonIsLinux) 53 name := "exec_create_test" 54 dockerCmd(c, "run", "-d", "-t", "--name", name, "busybox", "/bin/sh") 55 56 dockerCmd(c, "pause", name) 57 status, body, err := sockRequest("POST", fmt.Sprintf("/containers/%s/exec", name), map[string]interface{}{"Cmd": []string{"true"}}) 58 c.Assert(err, checker.IsNil) 59 c.Assert(status, checker.Equals, http.StatusConflict) 60 61 comment := check.Commentf("Expected message when creating exec command with Container s% is paused", name) 62 c.Assert(string(body), checker.Contains, "Container "+name+" is paused, unpause the container before exec", comment) 63 } 64 65 func (s *DockerSuite) TestExecAPIStart(c *check.C) { 66 testRequires(c, DaemonIsLinux) // Uses pause/unpause but bits may be salvagable to Windows to Windows CI 67 dockerCmd(c, "run", "-d", "--name", "test", "busybox", "top") 68 69 startExec := func(id string, code int) { 70 resp, body, err := sockRequestRaw("POST", fmt.Sprintf("/exec/%s/start", id), strings.NewReader(`{"Detach": true}`), "application/json") 71 c.Assert(err, checker.IsNil) 72 73 b, err := readBody(body) 74 comment := check.Commentf("response body: %s", b) 75 c.Assert(err, checker.IsNil, comment) 76 c.Assert(resp.StatusCode, checker.Equals, code, comment) 77 } 78 79 id := createExec(c, "test") 80 startExec(id, http.StatusOK) 81 82 id = createExec(c, "test") 83 dockerCmd(c, "stop", "test") 84 85 startExec(id, http.StatusNotFound) 86 87 dockerCmd(c, "start", "test") 88 startExec(id, http.StatusNotFound) 89 90 // make sure exec is created before pausing 91 id = createExec(c, "test") 92 dockerCmd(c, "pause", "test") 93 startExec(id, http.StatusConflict) 94 dockerCmd(c, "unpause", "test") 95 startExec(id, http.StatusOK) 96 } 97 98 func (s *DockerSuite) TestExecAPIStartBackwardsCompatible(c *check.C) { 99 dockerCmd(c, "run", "-d", "--name", "test", "busybox", "top") 100 id := createExec(c, "test") 101 102 resp, body, err := sockRequestRaw("POST", fmt.Sprintf("/v1.20/exec/%s/start", id), strings.NewReader(`{"Detach": true}`), "text/plain") 103 c.Assert(err, checker.IsNil) 104 105 b, err := readBody(body) 106 comment := check.Commentf("response body: %s", b) 107 c.Assert(err, checker.IsNil, comment) 108 c.Assert(resp.StatusCode, checker.Equals, http.StatusOK, comment) 109 } 110 111 func createExec(c *check.C, name string) string { 112 _, b, err := sockRequest("POST", fmt.Sprintf("/containers/%s/exec", name), map[string]interface{}{"Cmd": []string{"true"}}) 113 c.Assert(err, checker.IsNil, check.Commentf(string(b))) 114 115 createResp := struct { 116 ID string `json:"Id"` 117 }{} 118 c.Assert(json.Unmarshal(b, &createResp), checker.IsNil, check.Commentf(string(b))) 119 return createResp.ID 120 }