// +build linux package daemon import ( "context" "testing" "github.com/docker/docker/container" "github.com/docker/docker/daemon/exec" "gotest.tools/v3/assert" ) // This test simply verify that when a wrong ID used, a specific error should be returned for exec resize. func TestExecResizeNoSuchExec(t *testing.T) { n := "TestExecResize" d := &Daemon{ execCommands: exec.NewStore(), } c := &container.Container{ ExecCommands: exec.NewStore(), } ec := &exec.Config{ ID: n, } d.registerExecCommand(c, ec) err := d.ContainerExecResize("nil", 24, 8) assert.ErrorContains(t, err, "No such exec instance") } type execResizeMockContainerdClient struct { MockContainerdClient ProcessID string ContainerID string Width int Height int } func (c *execResizeMockContainerdClient) ResizeTerminal(ctx context.Context, containerID, processID string, width, height int) error { c.ProcessID = processID c.ContainerID = containerID c.Width = width c.Height = height return nil } // This test is to make sure that when exec context is ready, resize should call ResizeTerminal via containerd client. func TestExecResize(t *testing.T) { n := "TestExecResize" width := 24 height := 8 ec := &exec.Config{ ID: n, ContainerID: n, Started: make(chan struct{}), } close(ec.Started) mc := &execResizeMockContainerdClient{} d := &Daemon{ execCommands: exec.NewStore(), containerd: mc, containers: container.NewMemoryStore(), } c := &container.Container{ ExecCommands: exec.NewStore(), State: &container.State{Running: true}, } d.containers.Add(n, c) d.registerExecCommand(c, ec) err := d.ContainerExecResize(n, height, width) assert.NilError(t, err) assert.Equal(t, mc.Width, width) assert.Equal(t, mc.Height, height) assert.Equal(t, mc.ProcessID, n) assert.Equal(t, mc.ContainerID, n) } // This test is to make sure that when exec context is not ready, a timeout error should happen. // TODO: the expect running time for this test is 10s, which would be too long for unit test. func TestExecResizeTimeout(t *testing.T) { n := "TestExecResize" width := 24 height := 8 ec := &exec.Config{ ID: n, ContainerID: n, Started: make(chan struct{}), } mc := &execResizeMockContainerdClient{} d := &Daemon{ execCommands: exec.NewStore(), containerd: mc, containers: container.NewMemoryStore(), } c := &container.Container{ ExecCommands: exec.NewStore(), State: &container.State{Running: true}, } d.containers.Add(n, c) d.registerExecCommand(c, ec) err := d.ContainerExecResize(n, height, width) assert.ErrorContains(t, err, "timeout waiting for exec session ready") }