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