github.com/flavio/docker@v0.1.3-0.20170117145210-f63d1a6eec47/integration-cli/docker_api_test.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "net/http" 7 "net/http/httptest" 8 "runtime" 9 "strconv" 10 "strings" 11 12 "github.com/docker/docker/api" 13 "github.com/docker/docker/integration-cli/checker" 14 "github.com/docker/docker/integration-cli/request" 15 "github.com/docker/docker/pkg/testutil" 16 icmd "github.com/docker/docker/pkg/testutil/cmd" 17 "github.com/go-check/check" 18 ) 19 20 func (s *DockerSuite) TestAPIOptionsRoute(c *check.C) { 21 resp, _, err := request.Do(daemonHost(), "/", request.Method(http.MethodOptions)) 22 c.Assert(err, checker.IsNil) 23 c.Assert(resp.StatusCode, checker.Equals, http.StatusOK) 24 } 25 26 func (s *DockerSuite) TestAPIGetEnabledCORS(c *check.C) { 27 res, body, err := request.SockRequestRaw("GET", "/version", nil, "", daemonHost()) 28 c.Assert(err, checker.IsNil) 29 c.Assert(res.StatusCode, checker.Equals, http.StatusOK) 30 body.Close() 31 // TODO: @runcom incomplete tests, why old integration tests had this headers 32 // and here none of the headers below are in the response? 33 //c.Log(res.Header) 34 //c.Assert(res.Header.Get("Access-Control-Allow-Origin"), check.Equals, "*") 35 //c.Assert(res.Header.Get("Access-Control-Allow-Headers"), check.Equals, "Origin, X-Requested-With, Content-Type, Accept, X-Registry-Auth") 36 } 37 38 func (s *DockerSuite) TestAPIClientVersionOldNotSupported(c *check.C) { 39 if testEnv.DaemonPlatform() != runtime.GOOS { 40 c.Skip("Daemon platform doesn't match test platform") 41 } 42 if api.MinVersion == api.DefaultVersion { 43 c.Skip("API MinVersion==DefaultVersion") 44 } 45 v := strings.Split(api.MinVersion, ".") 46 vMinInt, err := strconv.Atoi(v[1]) 47 c.Assert(err, checker.IsNil) 48 vMinInt-- 49 v[1] = strconv.Itoa(vMinInt) 50 version := strings.Join(v, ".") 51 52 resp, body, err := request.Get(daemonHost(), "/v"+version+"/version") 53 c.Assert(err, checker.IsNil) 54 defer body.Close() 55 c.Assert(resp.StatusCode, checker.Equals, http.StatusBadRequest) 56 expected := fmt.Sprintf("client version %s is too old. Minimum supported API version is %s, please upgrade your client to a newer version", version, api.MinVersion) 57 content, err := ioutil.ReadAll(body) 58 c.Assert(err, checker.IsNil) 59 c.Assert(strings.TrimSpace(string(content)), checker.Contains, expected) 60 } 61 62 func (s *DockerSuite) TestAPIDockerAPIVersion(c *check.C) { 63 var svrVersion string 64 65 server := httptest.NewServer(http.HandlerFunc( 66 func(w http.ResponseWriter, r *http.Request) { 67 w.Header().Set("API-Version", api.DefaultVersion) 68 url := r.URL.Path 69 svrVersion = url 70 })) 71 defer server.Close() 72 73 // Test using the env var first 74 result := icmd.RunCmd(icmd.Cmd{ 75 Command: binaryWithArgs("-H="+server.URL[7:], "version"), 76 Env: appendBaseEnv(false, "DOCKER_API_VERSION=xxx"), 77 }) 78 c.Assert(result, icmd.Matches, icmd.Expected{Out: "API version: xxx", ExitCode: 1}) 79 c.Assert(svrVersion, check.Equals, "/vxxx/version", check.Commentf("%s", result.Compare(icmd.Success))) 80 } 81 82 func (s *DockerSuite) TestAPIErrorJSON(c *check.C) { 83 httpResp, body, err := request.Post(daemonHost(), "/containers/create", request.JSONBody(struct{}{})) 84 c.Assert(err, checker.IsNil) 85 c.Assert(httpResp.StatusCode, checker.Equals, http.StatusInternalServerError) 86 c.Assert(httpResp.Header.Get("Content-Type"), checker.Equals, "application/json") 87 b, err := testutil.ReadBody(body) 88 c.Assert(err, checker.IsNil) 89 c.Assert(getErrorMessage(c, b), checker.Equals, "Config cannot be empty in order to create a container") 90 } 91 92 func (s *DockerSuite) TestAPIErrorPlainText(c *check.C) { 93 // Windows requires API 1.25 or later. This test is validating a behaviour which was present 94 // in v1.23, but changed in 1.24, hence not applicable on Windows. See apiVersionSupportsJSONErrors 95 testRequires(c, DaemonIsLinux) 96 httpResp, body, err := request.Post(daemonHost(), "/v1.23/containers/create", request.JSONBody(struct{}{})) 97 c.Assert(err, checker.IsNil) 98 c.Assert(httpResp.StatusCode, checker.Equals, http.StatusInternalServerError) 99 c.Assert(httpResp.Header.Get("Content-Type"), checker.Contains, "text/plain") 100 b, err := testutil.ReadBody(body) 101 c.Assert(err, checker.IsNil) 102 c.Assert(strings.TrimSpace(string(b)), checker.Equals, "Config cannot be empty in order to create a container") 103 } 104 105 func (s *DockerSuite) TestAPIErrorNotFoundJSON(c *check.C) { 106 // 404 is a different code path to normal errors, so test separately 107 httpResp, body, err := request.Get(daemonHost(), "/notfound", request.JSON) 108 c.Assert(err, checker.IsNil) 109 c.Assert(httpResp.StatusCode, checker.Equals, http.StatusNotFound) 110 c.Assert(httpResp.Header.Get("Content-Type"), checker.Equals, "application/json") 111 b, err := testutil.ReadBody(body) 112 c.Assert(err, checker.IsNil) 113 c.Assert(getErrorMessage(c, b), checker.Equals, "page not found") 114 } 115 116 func (s *DockerSuite) TestAPIErrorNotFoundPlainText(c *check.C) { 117 httpResp, body, err := request.Get(daemonHost(), "/v1.23/notfound", request.JSON) 118 c.Assert(err, checker.IsNil) 119 c.Assert(httpResp.StatusCode, checker.Equals, http.StatusNotFound) 120 c.Assert(httpResp.Header.Get("Content-Type"), checker.Contains, "text/plain") 121 b, err := testutil.ReadBody(body) 122 c.Assert(err, checker.IsNil) 123 c.Assert(strings.TrimSpace(string(b)), checker.Equals, "page not found") 124 }