2018-06-07 23:07:48 -04:00
|
|
|
// +build linux
|
|
|
|
|
|
|
|
package daemon
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/docker/docker/container"
|
|
|
|
"github.com/docker/docker/daemon/exec"
|
2020-02-07 08:39:24 -05:00
|
|
|
"gotest.tools/v3/assert"
|
2018-06-07 23:07:48 -04:00
|
|
|
)
|
|
|
|
|
|
|
|
// 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")
|
|
|
|
}
|