| //go:build linux | |
| package daemon | |
| import ( | |
| "context" | |
| "testing" | |
| "github.com/docker/docker/container" | |
| "github.com/docker/docker/libcontainerd/types" | |
| "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: container.NewExecStore(), | |
| } | |
| c := &container.Container{ | |
| ExecCommands: container.NewExecStore(), | |
| } | |
| ec := &container.ExecConfig{ | |
| ID: n, | |
| Container: c, | |
| } | |
| d.registerExecCommand(c, ec) | |
| err := d.ContainerExecResize("nil", 24, 8) | |
| assert.ErrorContains(t, err, "No such exec instance") | |
| } | |
| type execResizeMockProcess struct { | |
| types.Process | |
| Width, Height int | |
| } | |
| func (p *execResizeMockProcess) Resize(ctx context.Context, width, height uint32) error { | |
| p.Width = int(width) | |
| p.Height = int(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 | |
| mp := &execResizeMockProcess{} | |
| d := &Daemon{ | |
| execCommands: container.NewExecStore(), | |
| containers: container.NewMemoryStore(), | |
| } | |
| c := &container.Container{ | |
| ID: n, | |
| ExecCommands: container.NewExecStore(), | |
| State: &container.State{Running: true}, | |
| } | |
| ec := &container.ExecConfig{ | |
| ID: n, | |
| Container: c, | |
| Process: mp, | |
| Started: make(chan struct{}), | |
| } | |
| close(ec.Started) | |
| d.containers.Add(n, c) | |
| d.registerExecCommand(c, ec) | |
| err := d.ContainerExecResize(n, height, width) | |
| assert.NilError(t, err) | |
| assert.Equal(t, mp.Width, width) | |
| assert.Equal(t, mp.Height, height) | |
| } | |
| // 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 | |
| mp := &execResizeMockProcess{} | |
| d := &Daemon{ | |
| execCommands: container.NewExecStore(), | |
| containers: container.NewMemoryStore(), | |
| } | |
| c := &container.Container{ | |
| ID: n, | |
| ExecCommands: container.NewExecStore(), | |
| State: &container.State{Running: true}, | |
| } | |
| ec := &container.ExecConfig{ | |
| ID: n, | |
| Container: c, | |
| Process: mp, | |
| Started: make(chan struct{}), | |
| } | |
| 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") | |
| } |