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  }