mirror of
https://github.com/moby/moby.git
synced 2026-01-11 10:41:43 +00:00
Add option- and output structs for; - Client.ContainerKill - Client.ContainerPause - Client.ContainerRemove - Client.ContainerResize - Client.ContainerRestart - Client.ContainerStart - Client.ContainerStop - Client.ContainerUnpause Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
140 lines
3.9 KiB
Go
140 lines
3.9 KiB
Go
package container
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/url"
|
|
"testing"
|
|
|
|
cerrdefs "github.com/containerd/errdefs"
|
|
"github.com/moby/moby/api/types/common"
|
|
"github.com/moby/moby/client"
|
|
"github.com/moby/moby/v2/integration/internal/container"
|
|
req "github.com/moby/moby/v2/internal/testutil/request"
|
|
"gotest.tools/v3/assert"
|
|
is "gotest.tools/v3/assert/cmp"
|
|
)
|
|
|
|
func TestResize(t *testing.T) {
|
|
ctx := setupTest(t)
|
|
apiClient := testEnv.APIClient()
|
|
|
|
t.Run("success", func(t *testing.T) {
|
|
cID := container.Run(ctx, t, apiClient, container.WithTty(true))
|
|
defer container.Remove(ctx, t, apiClient, cID, client.ContainerRemoveOptions{Force: true})
|
|
_, err := apiClient.ContainerResize(ctx, cID, client.ContainerResizeOptions{
|
|
Height: 40,
|
|
Width: 40,
|
|
})
|
|
assert.NilError(t, err)
|
|
// TODO(thaJeztah): also check if the resize happened
|
|
//
|
|
// Note: container inspect shows the initial size that was
|
|
// set when creating the container. Actual resize happens in
|
|
// containerd, and currently does not update the container's
|
|
// config after running (but does send a "resize" event).
|
|
})
|
|
|
|
t.Run("invalid size", func(t *testing.T) {
|
|
cID := container.Run(ctx, t, apiClient)
|
|
defer container.Remove(ctx, t, apiClient, cID, client.ContainerRemoveOptions{Force: true})
|
|
|
|
const valueNotSet = "unset"
|
|
|
|
tests := []struct {
|
|
doc, height, width, expErr string
|
|
}{
|
|
{
|
|
doc: "unset height",
|
|
height: valueNotSet,
|
|
width: "100",
|
|
expErr: `invalid resize height "": invalid syntax`,
|
|
},
|
|
{
|
|
doc: "unset width",
|
|
height: "100",
|
|
width: valueNotSet,
|
|
expErr: `invalid resize width "": invalid syntax`,
|
|
},
|
|
{
|
|
doc: "empty height",
|
|
width: "100",
|
|
expErr: `invalid resize height "": invalid syntax`,
|
|
},
|
|
{
|
|
doc: "empty width",
|
|
height: "100",
|
|
expErr: `invalid resize width "": invalid syntax`,
|
|
},
|
|
{
|
|
doc: "non-numeric height",
|
|
height: "not-a-number",
|
|
width: "100",
|
|
expErr: `invalid resize height "not-a-number": invalid syntax`,
|
|
},
|
|
{
|
|
doc: "non-numeric width",
|
|
height: "100",
|
|
width: "not-a-number",
|
|
expErr: `invalid resize width "not-a-number": invalid syntax`,
|
|
},
|
|
{
|
|
doc: "negative height",
|
|
height: "-100",
|
|
width: "100",
|
|
expErr: `invalid resize height "-100": value out of range`,
|
|
},
|
|
{
|
|
doc: "negative width",
|
|
height: "100",
|
|
width: "-100",
|
|
expErr: `invalid resize width "-100": value out of range`,
|
|
},
|
|
{
|
|
doc: "out of range height",
|
|
height: "4294967296", // math.MaxUint32+1
|
|
width: "100",
|
|
expErr: `invalid resize height "4294967296": value out of range`,
|
|
},
|
|
{
|
|
doc: "out of range width",
|
|
height: "100",
|
|
width: "4294967296", // math.MaxUint32+1
|
|
expErr: `invalid resize width "4294967296": value out of range`,
|
|
},
|
|
}
|
|
for _, tc := range tests {
|
|
t.Run(tc.doc, func(t *testing.T) {
|
|
// Manually creating a request here, as the APIClient would invalidate
|
|
// these values before they're sent.
|
|
vals := url.Values{}
|
|
if tc.height != valueNotSet {
|
|
vals.Add("h", tc.height)
|
|
}
|
|
if tc.width != valueNotSet {
|
|
vals.Add("w", tc.width)
|
|
}
|
|
res, _, err := req.Post(ctx, "/containers/"+cID+"/resize?"+vals.Encode())
|
|
assert.NilError(t, err)
|
|
assert.Check(t, is.Equal(http.StatusBadRequest, res.StatusCode))
|
|
|
|
var errorResponse common.ErrorResponse
|
|
err = json.NewDecoder(res.Body).Decode(&errorResponse)
|
|
assert.NilError(t, err)
|
|
assert.Check(t, is.ErrorContains(errorResponse, tc.expErr))
|
|
})
|
|
}
|
|
})
|
|
|
|
t.Run("invalid state", func(t *testing.T) {
|
|
cID := container.Create(ctx, t, apiClient, container.WithCmd("echo"))
|
|
defer container.Remove(ctx, t, apiClient, cID, client.ContainerRemoveOptions{Force: true})
|
|
_, err := apiClient.ContainerResize(ctx, cID, client.ContainerResizeOptions{
|
|
Height: 40,
|
|
Width: 40,
|
|
})
|
|
assert.Check(t, is.ErrorType(err, cerrdefs.IsConflict))
|
|
assert.Check(t, is.ErrorContains(err, "is not running"))
|
|
})
|
|
}
|