github.com/toplink-cn/moby@v0.0.0-20240305205811-460b4aebdf81/integration-cli/docker_api_test.go (about) 1 package main 2 3 import ( 4 "context" 5 "fmt" 6 "net/http" 7 "runtime" 8 "strconv" 9 "strings" 10 "testing" 11 12 "github.com/docker/docker/runconfig" 13 "github.com/docker/docker/testutil" 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(ctx context.Context, c *testing.T) { 23 s.ds.TearDownTest(ctx, 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(testutil.GetContext(c), "/", 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(testutil.GetContext(c), "/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.DaemonInfo.OSType != runtime.GOOS { 50 c.Skip("Daemon platform doesn't match test platform") 51 } 52 53 major, minor, _ := strings.Cut(testEnv.DaemonVersion.MinAPIVersion, ".") 54 vMinInt, err := strconv.Atoi(minor) 55 assert.NilError(c, err) 56 vMinInt-- 57 version := fmt.Sprintf("%s.%d", major, vMinInt) 58 59 resp, body, err := request.Get(testutil.GetContext(c), "/v"+version+"/version") 60 assert.NilError(c, err) 61 defer body.Close() 62 assert.Equal(c, resp.StatusCode, http.StatusBadRequest) 63 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) 64 b, err := request.ReadBody(body) 65 assert.NilError(c, err) 66 assert.Equal(c, getErrorMessage(c, b), expected) 67 } 68 69 func (s *DockerAPISuite) TestAPIErrorJSON(c *testing.T) { 70 httpResp, body, err := request.Post(testutil.GetContext(c), "/containers/create", request.JSONBody(struct{}{})) 71 assert.NilError(c, err) 72 assert.Equal(c, httpResp.StatusCode, http.StatusBadRequest) 73 assert.Assert(c, strings.Contains(httpResp.Header.Get("Content-Type"), "application/json")) 74 b, err := request.ReadBody(body) 75 assert.NilError(c, err) 76 assert.Equal(c, getErrorMessage(c, b), runconfig.ErrEmptyConfig.Error()) 77 } 78 79 func (s *DockerAPISuite) TestAPIErrorNotFoundJSON(c *testing.T) { 80 // 404 is a different code path to normal errors, so test separately 81 httpResp, body, err := request.Get(testutil.GetContext(c), "/notfound", request.JSON) 82 assert.NilError(c, err) 83 assert.Equal(c, httpResp.StatusCode, http.StatusNotFound) 84 assert.Assert(c, strings.Contains(httpResp.Header.Get("Content-Type"), "application/json")) 85 b, err := request.ReadBody(body) 86 assert.NilError(c, err) 87 assert.Equal(c, getErrorMessage(c, b), "page not found") 88 }