github.com/rish1988/moby@v25.0.2+incompatible/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/docker/docker/runconfig" 14 "github.com/docker/docker/testutil" 15 "github.com/docker/docker/testutil/request" 16 "gotest.tools/v3/assert" 17 ) 18 19 type DockerAPISuite struct { 20 ds *DockerSuite 21 } 22 23 func (s *DockerAPISuite) TearDownTest(ctx context.Context, c *testing.T) { 24 s.ds.TearDownTest(ctx, c) 25 } 26 27 func (s *DockerAPISuite) OnTimeout(c *testing.T) { 28 s.ds.OnTimeout(c) 29 } 30 31 func (s *DockerAPISuite) TestAPIOptionsRoute(c *testing.T) { 32 resp, _, err := request.Do(testutil.GetContext(c), "/", request.Method(http.MethodOptions)) 33 assert.NilError(c, err) 34 assert.Equal(c, resp.StatusCode, http.StatusOK) 35 } 36 37 func (s *DockerAPISuite) TestAPIGetEnabledCORS(c *testing.T) { 38 res, body, err := request.Get(testutil.GetContext(c), "/version") 39 assert.NilError(c, err) 40 assert.Equal(c, res.StatusCode, http.StatusOK) 41 body.Close() 42 // TODO: @runcom incomplete tests, why old integration tests had this headers 43 // and here none of the headers below are in the response? 44 // c.Log(res.Header) 45 // assert.Equal(c, res.Header.Get("Access-Control-Allow-Origin"), "*") 46 // assert.Equal(c, res.Header.Get("Access-Control-Allow-Headers"), "Origin, X-Requested-With, Content-Type, Accept, X-Registry-Auth") 47 } 48 49 func (s *DockerAPISuite) TestAPIClientVersionOldNotSupported(c *testing.T) { 50 if testEnv.DaemonInfo.OSType != runtime.GOOS { 51 c.Skip("Daemon platform doesn't match test platform") 52 } 53 54 major, minor, _ := strings.Cut(testEnv.DaemonVersion.MinAPIVersion, ".") 55 vMinInt, err := strconv.Atoi(minor) 56 assert.NilError(c, err) 57 vMinInt-- 58 version := fmt.Sprintf("%s.%d", major, vMinInt) 59 60 resp, body, err := request.Get(testutil.GetContext(c), "/v"+version+"/version") 61 assert.NilError(c, err) 62 defer body.Close() 63 assert.Equal(c, resp.StatusCode, http.StatusBadRequest) 64 expected := fmt.Sprintf("client version %s is too old. Minimum supported API version is %s, please upgrade your client to a newer version", version, testEnv.DaemonVersion.MinAPIVersion) 65 content, err := io.ReadAll(body) 66 assert.NilError(c, err) 67 assert.Equal(c, strings.TrimSpace(string(content)), expected) 68 } 69 70 func (s *DockerAPISuite) TestAPIErrorJSON(c *testing.T) { 71 httpResp, body, err := request.Post(testutil.GetContext(c), "/containers/create", request.JSONBody(struct{}{})) 72 assert.NilError(c, err) 73 assert.Equal(c, httpResp.StatusCode, http.StatusBadRequest) 74 assert.Assert(c, strings.Contains(httpResp.Header.Get("Content-Type"), "application/json")) 75 b, err := request.ReadBody(body) 76 assert.NilError(c, err) 77 assert.Equal(c, getErrorMessage(c, b), runconfig.ErrEmptyConfig.Error()) 78 } 79 80 func (s *DockerAPISuite) TestAPIErrorPlainText(c *testing.T) { 81 // Windows requires API 1.25 or later. This test is validating a behaviour which was present 82 // in v1.23, but changed in 1.24, hence not applicable on Windows. See apiVersionSupportsJSONErrors 83 testRequires(c, DaemonIsLinux) 84 httpResp, body, err := request.Post(testutil.GetContext(c), "/v1.23/containers/create", request.JSONBody(struct{}{})) 85 assert.NilError(c, err) 86 assert.Equal(c, httpResp.StatusCode, http.StatusBadRequest) 87 assert.Assert(c, strings.Contains(httpResp.Header.Get("Content-Type"), "text/plain")) 88 b, err := request.ReadBody(body) 89 assert.NilError(c, err) 90 assert.Equal(c, strings.TrimSpace(string(b)), runconfig.ErrEmptyConfig.Error()) 91 } 92 93 func (s *DockerAPISuite) TestAPIErrorNotFoundJSON(c *testing.T) { 94 // 404 is a different code path to normal errors, so test separately 95 httpResp, body, err := request.Get(testutil.GetContext(c), "/notfound", request.JSON) 96 assert.NilError(c, err) 97 assert.Equal(c, httpResp.StatusCode, http.StatusNotFound) 98 assert.Assert(c, strings.Contains(httpResp.Header.Get("Content-Type"), "application/json")) 99 b, err := request.ReadBody(body) 100 assert.NilError(c, err) 101 assert.Equal(c, getErrorMessage(c, b), "page not found") 102 } 103 104 func (s *DockerAPISuite) TestAPIErrorNotFoundPlainText(c *testing.T) { 105 httpResp, body, err := request.Get(testutil.GetContext(c), "/v1.23/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"), "text/plain")) 109 b, err := request.ReadBody(body) 110 assert.NilError(c, err) 111 assert.Equal(c, strings.TrimSpace(string(b)), "page not found") 112 }