Merge pull request #51228 from thaJeztah/move_some_integration_cli_tests

integration-cli: move some tests to integration
This commit is contained in:
Sebastiaan van Stijn
2025-10-21 12:48:12 +02:00
committed by GitHub
3 changed files with 76 additions and 130 deletions

View File

@@ -644,105 +644,6 @@ func (s *DockerAPISuite) TestContainerAPIVerifyHeader(c *testing.T) {
_ = body.Close()
}
// Issue 14230. daemon should return 500 for invalid port syntax
func (s *DockerAPISuite) TestContainerAPIInvalidPortSyntax(c *testing.T) {
config := `{
"Image": "busybox",
"HostConfig": {
"NetworkMode": "default",
"PortBindings": {
"19039;1230": [
{}
]
}
}
}`
res, body, err := request.Post(testutil.GetContext(c), "/containers/create", request.RawString(config), request.JSON)
assert.NilError(c, err)
assert.Equal(c, res.StatusCode, http.StatusBadRequest)
b, err := request.ReadBody(body)
assert.NilError(c, err)
assert.Assert(c, is.Contains(string(b[:]), "invalid port"))
}
func (s *DockerAPISuite) TestContainerAPIRestartPolicyInvalidPolicyName(c *testing.T) {
config := `{
"Image": "busybox",
"HostConfig": {
"RestartPolicy": {
"Name": "something",
"MaximumRetryCount": 0
}
}
}`
res, body, err := request.Post(testutil.GetContext(c), "/containers/create", request.RawString(config), request.JSON)
assert.NilError(c, err)
assert.Equal(c, res.StatusCode, http.StatusBadRequest)
b, err := request.ReadBody(body)
assert.NilError(c, err)
assert.Assert(c, is.Contains(string(b[:]), "invalid restart policy"))
}
func (s *DockerAPISuite) TestContainerAPIRestartPolicyRetryMismatch(c *testing.T) {
config := `{
"Image": "busybox",
"HostConfig": {
"RestartPolicy": {
"Name": "always",
"MaximumRetryCount": 2
}
}
}`
res, body, err := request.Post(testutil.GetContext(c), "/containers/create", request.RawString(config), request.JSON)
assert.NilError(c, err)
assert.Equal(c, res.StatusCode, http.StatusBadRequest)
b, err := request.ReadBody(body)
assert.NilError(c, err)
assert.Assert(c, is.Contains(string(b[:]), "invalid restart policy: maximum retry count can only be used with 'on-failure'"))
}
func (s *DockerAPISuite) TestContainerAPIRestartPolicyNegativeRetryCount(c *testing.T) {
config := `{
"Image": "busybox",
"HostConfig": {
"RestartPolicy": {
"Name": "on-failure",
"MaximumRetryCount": -2
}
}
}`
res, body, err := request.Post(testutil.GetContext(c), "/containers/create", request.RawString(config), request.JSON)
assert.NilError(c, err)
assert.Equal(c, res.StatusCode, http.StatusBadRequest)
b, err := request.ReadBody(body)
assert.NilError(c, err)
assert.Assert(c, is.Contains(string(b[:]), "maximum retry count cannot be negative"))
}
func (s *DockerAPISuite) TestContainerAPIRestartPolicyDefaultRetryCount(c *testing.T) {
config := `{
"Image": "busybox",
"HostConfig": {
"RestartPolicy": {
"Name": "on-failure",
"MaximumRetryCount": 0
}
}
}`
res, _, err := request.Post(testutil.GetContext(c), "/containers/create", request.RawString(config), request.JSON)
assert.NilError(c, err)
assert.Equal(c, res.StatusCode, http.StatusCreated)
}
// Issue 7941 - test to make sure a "null" in JSON is just ignored.
// W/o this fix a null in JSON would be parsed into a string var as "null"
func (s *DockerAPISuite) TestContainerAPIPostCreateNull(c *testing.T) {
@@ -789,26 +690,6 @@ func (s *DockerAPISuite) TestContainerAPIPostCreateNull(c *testing.T) {
assert.Equal(c, outMemorySwap, "0")
}
func (s *DockerAPISuite) TestCreateWithTooLowMemoryLimit(c *testing.T) {
// TODO Windows: Port once memory is supported
testRequires(c, DaemonIsLinux)
config := `{
"Image": "busybox",
"HostConfig": {
"CpuShares": 100,
"Memory": 524287
}
}`
res, body, err := request.Post(testutil.GetContext(c), "/containers/create", request.RawString(config), request.JSON)
assert.NilError(c, err)
b, err2 := request.ReadBody(body)
assert.NilError(c, err2)
assert.Equal(c, res.StatusCode, http.StatusBadRequest)
assert.Assert(c, is.Contains(string(b), "Minimum memory limit allowed is 6MB"))
}
func (s *DockerAPISuite) TestContainerAPIKill(c *testing.T) {
const name = "test-api-kill"
runSleepingContainer(c, "-i", "--name", name)

View File

@@ -8,7 +8,6 @@ import (
"github.com/moby/moby/v2/internal/testutil"
"github.com/moby/moby/v2/internal/testutil/request"
"gotest.tools/v3/assert"
is "gotest.tools/v3/assert/cmp"
)
type DockerAPISuite struct {
@@ -40,13 +39,3 @@ func (s *DockerAPISuite) TestAPIGetEnabledCORS(c *testing.T) {
// assert.Equal(c, res.Header.Get("Access-Control-Allow-Origin"), "*")
// assert.Equal(c, res.Header.Get("Access-Control-Allow-Headers"), "Origin, X-Requested-With, Content-Type, Accept, X-Registry-Auth")
}
func (s *DockerAPISuite) TestAPIErrorJSON(c *testing.T) {
httpResp, body, err := request.Post(testutil.GetContext(c), "/containers/create", request.JSONBody(struct{}{}))
assert.NilError(c, err)
assert.Equal(c, httpResp.StatusCode, http.StatusBadRequest)
assert.Assert(c, is.Contains(httpResp.Header.Get("Content-Type"), "application/json"))
b, err := request.ReadBody(body)
assert.NilError(c, err)
assert.Check(c, is.Contains(getErrorMessage(c, b), "config cannot be empty"))
}

View File

@@ -4,6 +4,7 @@ import (
"bufio"
"context"
"fmt"
"net/http"
"strconv"
"strings"
"testing"
@@ -11,6 +12,7 @@ import (
containerd "github.com/containerd/containerd/v2/client"
cerrdefs "github.com/containerd/errdefs"
"github.com/moby/moby/api/types/common"
"github.com/moby/moby/api/types/container"
"github.com/moby/moby/api/types/network"
"github.com/moby/moby/api/types/versions"
@@ -20,6 +22,7 @@ import (
testContainer "github.com/moby/moby/v2/integration/internal/container"
net "github.com/moby/moby/v2/integration/internal/network"
"github.com/moby/moby/v2/internal/testutil"
"github.com/moby/moby/v2/internal/testutil/request"
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
"gotest.tools/v3/assert"
is "gotest.tools/v3/assert/cmp"
@@ -658,6 +661,79 @@ func TestCreateInvalidHostConfig(t *testing.T) {
}
}
func TestCreateValidation(t *testing.T) {
tests := []struct {
name string
body string
skipOn string
expStatus int
expError string
}{
{
name: "empty body",
body: ``,
expStatus: http.StatusBadRequest,
expError: `invalid JSON: EOF`, // TODO(thaJeztah): this could use a nicer error message.
},
{
name: "empty config",
body: `{}`,
expStatus: http.StatusBadRequest,
expError: `config cannot be empty in order to create a container`,
},
{
name: "invalid port syntax", // issue https://github.com/moby/moby/issues/14230 for invalid port syntax
body: `{"Image": "busybox", "HostConfig": {"NetworkMode": "default", "PortBindings": {"19039;1230": [{}]}}}`,
expStatus: http.StatusBadRequest,
expError: `invalid JSON: invalid port '19039;1230': invalid syntax`,
},
{
name: "invalid memory-limit: value too low",
body: `{"Image": "busybox", "HostConfig": {"CpuShares": 100, "Memory": 524287}}`,
skipOn: "windows", // TODO Windows: Port once memory is supported
expStatus: http.StatusBadRequest,
expError: `Minimum memory limit allowed is 6MB`,
},
{
name: "invalid restart policy name",
body: `{"Image": "busybox", "HostConfig": {"RestartPolicy": {"Name": "something", "MaximumRetryCount": 0}}}`,
expStatus: http.StatusBadRequest,
expError: `invalid restart policy: unknown policy 'something'`,
},
{
name: "invalid restart policy: retry not allowed",
body: `{"Image": "busybox", "HostConfig": {"RestartPolicy": {"Name": "always", "MaximumRetryCount": 2}}}`,
expStatus: http.StatusBadRequest,
expError: `invalid restart policy: maximum retry count can only be used with 'on-failure'`,
},
{
name: "invalid restart policy: retry negative",
body: `{"Image": "busybox", "HostConfig": {"RestartPolicy": {"Name": "on-failure", "MaximumRetryCount": -2}}}`,
expStatus: http.StatusBadRequest,
expError: `invalid restart policy: maximum retry count cannot be negative`,
},
{
name: "restart policy: default retry count",
body: `{"Image": "busybox", "HostConfig": {"RestartPolicy": {"Name": "on-failure", "MaximumRetryCount": 0}}}`,
expStatus: http.StatusCreated,
},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
skip.If(t, testEnv.DaemonInfo.OSType == tc.skipOn)
res, _, err := request.Post(testutil.GetContext(t), "/containers/create", request.RawString(tc.body), request.JSON)
assert.NilError(t, err)
assert.Equal(t, res.StatusCode, tc.expStatus)
if tc.expError != "" {
var respErr common.ErrorResponse
assert.NilError(t, request.ReadJSONResponse(res, &respErr))
assert.ErrorContains(t, respErr, tc.expError)
}
})
}
}
func TestCreateWithMultipleEndpointSettings(t *testing.T) {
ctx := setupTest(t)