github.com/adityamillind98/moby@v23.0.0-rc.4+incompatible/integration-cli/docker_api_test.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io" 6 "net/http" 7 "runtime" 8 "strconv" 9 "strings" 10 "testing" 11 12 "github.com/docker/docker/api" 13 "github.com/docker/docker/api/types/versions" 14 "github.com/docker/docker/testutil/request" 15 "gotest.tools/v3/assert" 16 ) 17 18 type DockerAPISuite struct { 19 ds *DockerSuite 20 } 21 22 func (s *DockerAPISuite) TearDownTest(c *testing.T) { 23 s.ds.TearDownTest(c) 24 } 25 26 func (s *DockerAPISuite) OnTimeout(c *testing.T) { 27 s.ds.OnTimeout(c) 28 } 29 30 func (s *DockerAPISuite) TestAPIOptionsRoute(c *testing.T) { 31 resp, _, err := request.Do("/", request.Method(http.MethodOptions)) 32 assert.NilError(c, err) 33 assert.Equal(c, resp.StatusCode, http.StatusOK) 34 } 35 36 func (s *DockerAPISuite) TestAPIGetEnabledCORS(c *testing.T) { 37 res, body, err := request.Get("/version") 38 assert.NilError(c, err) 39 assert.Equal(c, res.StatusCode, http.StatusOK) 40 body.Close() 41 // TODO: @runcom incomplete tests, why old integration tests had this headers 42 // and here none of the headers below are in the response? 43 //c.Log(res.Header) 44 //assert.Equal(c, res.Header.Get("Access-Control-Allow-Origin"), "*") 45 //assert.Equal(c, res.Header.Get("Access-Control-Allow-Headers"), "Origin, X-Requested-With, Content-Type, Accept, X-Registry-Auth") 46 } 47 48 func (s *DockerAPISuite) TestAPIClientVersionOldNotSupported(c *testing.T) { 49 if testEnv.OSType != runtime.GOOS { 50 c.Skip("Daemon platform doesn't match test platform") 51 } 52 if api.MinVersion == api.DefaultVersion { 53 c.Skip("API MinVersion==DefaultVersion") 54 } 55 v := strings.Split(api.MinVersion, ".") 56 vMinInt, err := strconv.Atoi(v[1]) 57 assert.NilError(c, err) 58 vMinInt-- 59 v[1] = strconv.Itoa(vMinInt) 60 version := strings.Join(v, ".") 61 62 resp, body, err := request.Get("/v" + version + "/version") 63 assert.NilError(c, err) 64 defer body.Close() 65 assert.Equal(c, resp.StatusCode, http.StatusBadRequest) 66 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) 67 content, err := io.ReadAll(body) 68 assert.NilError(c, err) 69 assert.Equal(c, strings.TrimSpace(string(content)), expected) 70 } 71 72 func (s *DockerAPISuite) TestAPIErrorJSON(c *testing.T) { 73 httpResp, body, err := request.Post("/containers/create", request.JSONBody(struct{}{})) 74 assert.NilError(c, err) 75 if versions.LessThan(testEnv.DaemonAPIVersion(), "1.32") { 76 assert.Equal(c, httpResp.StatusCode, http.StatusInternalServerError) 77 } else { 78 assert.Equal(c, httpResp.StatusCode, http.StatusBadRequest) 79 } 80 assert.Assert(c, strings.Contains(httpResp.Header.Get("Content-Type"), "application/json")) 81 b, err := request.ReadBody(body) 82 assert.NilError(c, err) 83 assert.Equal(c, getErrorMessage(c, b), "Config cannot be empty in order to create a container") 84 } 85 86 func (s *DockerAPISuite) TestAPIErrorPlainText(c *testing.T) { 87 // Windows requires API 1.25 or later. This test is validating a behaviour which was present 88 // in v1.23, but changed in 1.24, hence not applicable on Windows. See apiVersionSupportsJSONErrors 89 testRequires(c, DaemonIsLinux) 90 httpResp, body, err := request.Post("/v1.23/containers/create", request.JSONBody(struct{}{})) 91 assert.NilError(c, err) 92 if versions.LessThan(testEnv.DaemonAPIVersion(), "1.32") { 93 assert.Equal(c, httpResp.StatusCode, http.StatusInternalServerError) 94 } else { 95 assert.Equal(c, httpResp.StatusCode, http.StatusBadRequest) 96 } 97 assert.Assert(c, strings.Contains(httpResp.Header.Get("Content-Type"), "text/plain")) 98 b, err := request.ReadBody(body) 99 assert.NilError(c, err) 100 assert.Equal(c, strings.TrimSpace(string(b)), "Config cannot be empty in order to create a container") 101 } 102 103 func (s *DockerAPISuite) TestAPIErrorNotFoundJSON(c *testing.T) { 104 // 404 is a different code path to normal errors, so test separately 105 httpResp, body, err := request.Get("/notfound", request.JSON) 106 assert.NilError(c, err) 107 assert.Equal(c, httpResp.StatusCode, http.StatusNotFound) 108 assert.Assert(c, strings.Contains(httpResp.Header.Get("Content-Type"), "application/json")) 109 b, err := request.ReadBody(body) 110 assert.NilError(c, err) 111 assert.Equal(c, getErrorMessage(c, b), "page not found") 112 } 113 114 func (s *DockerAPISuite) TestAPIErrorNotFoundPlainText(c *testing.T) { 115 httpResp, body, err := request.Get("/v1.23/notfound", request.JSON) 116 assert.NilError(c, err) 117 assert.Equal(c, httpResp.StatusCode, http.StatusNotFound) 118 assert.Assert(c, strings.Contains(httpResp.Header.Get("Content-Type"), "text/plain")) 119 b, err := request.ReadBody(body) 120 assert.NilError(c, err) 121 assert.Equal(c, strings.TrimSpace(string(b)), "page not found") 122 }