| package container |
| |
| import ( |
| "strings" |
| "testing" |
| "time" |
| |
| "github.com/docker/cli/e2e/internal/fixtures" |
| "gotest.tools/v3/icmd" |
| "gotest.tools/v3/poll" |
| ) |
| |
| func TestKillContainer(t *testing.T) { |
| result := icmd.RunCommand("docker", "run", "-d", fixtures.AlpineImage, "top") |
| result.Assert(t, icmd.Success) |
| |
| containerID := strings.TrimSpace(result.Stdout()) |
| |
| // Kill with SIGTERM should kill the process |
| result = icmd.RunCmd(icmd.Command("docker", "kill", "-s", "SIGTERM", containerID)) |
| |
| result.Assert(t, icmd.Success) |
| poll.WaitOn(t, containerStatus(t, containerID, "exited"), poll.WithDelay(100*time.Millisecond), poll.WithTimeout(5*time.Second)) |
| |
| // Kill on a stop container should return an error |
| result = icmd.RunCmd(icmd.Command("docker", "kill", containerID)) |
| result.Assert(t, icmd.Expected{ |
| ExitCode: 1, |
| Err: "is not running", |
| }) |
| } |
| |
| func containerStatus(t *testing.T, containerID, status string) func(poll.LogT) poll.Result { |
| t.Helper() |
| return func(poll.LogT) poll.Result { |
| result := icmd.RunCommand("docker", "inspect", "-f", "{{ .State.Status }}", containerID) |
| result.Assert(t, icmd.Success) |
| actual := strings.TrimSpace(result.Stdout()) |
| if actual == status { |
| return poll.Success() |
| } |
| return poll.Continue("expected status %s != %s", status, actual) |
| } |
| } |