From 442c38636f2c89bfbae69fb4c82ce071c550e0d1 Mon Sep 17 00:00:00 2001 From: Stavros Panakakis Date: Sun, 6 Oct 2024 19:46:29 +0300 Subject: [PATCH] command: add tests for container kill, commit, and pause This commit adds tests for the commands docker kill, docker commit, and docker pause. Also, it creates the mock methods of the docker client ContainerCommit and ContainerPause so they can be used in the tests. For docker kill, it covers the cases that: - the command runs successfully - the client returns an error For docker commit, it covers the cases that: - the command runs successfully - the client returns an error For docker pause, it covers the cases that: - the command runs successfully - the client returns an error Signed-off-by: Stavros Panakakis --- cli/command/container/client_test.go | 17 +++++++ cli/command/container/commit_test.go | 71 ++++++++++++++++++++++++++ cli/command/container/kill_test.go | 74 ++++++++++++++++++++++++++++ cli/command/container/pause_test.go | 65 ++++++++++++++++++++++++ 4 files changed, 227 insertions(+) create mode 100644 cli/command/container/commit_test.go create mode 100644 cli/command/container/kill_test.go create mode 100644 cli/command/container/pause_test.go diff --git a/cli/command/container/client_test.go b/cli/command/container/client_test.go index a9e0b89f48..a2918a82d7 100644 --- a/cli/command/container/client_test.go +++ b/cli/command/container/client_test.go @@ -42,6 +42,8 @@ type fakeClient struct { containerAttachFunc func(ctx context.Context, containerID string, options container.AttachOptions) (types.HijackedResponse, error) containerDiffFunc func(ctx context.Context, containerID string) ([]container.FilesystemChange, error) containerRenameFunc func(ctx context.Context, oldName, newName string) error + containerCommitFunc func(ctx context.Context, container string, options container.CommitOptions) (types.IDResponse, error) + containerPauseFunc func(ctx context.Context, container string) error Version string } @@ -215,3 +217,18 @@ func (f *fakeClient) ContainerRename(ctx context.Context, oldName, newName strin return nil } + +func (f *fakeClient) ContainerCommit(ctx context.Context, containerID string, options container.CommitOptions) (types.IDResponse, error) { + if f.containerCommitFunc != nil { + return f.containerCommitFunc(ctx, containerID, options) + } + return types.IDResponse{}, nil +} + +func (f *fakeClient) ContainerPause(ctx context.Context, containerID string) error { + if f.containerPauseFunc != nil { + return f.containerPauseFunc(ctx, containerID) + } + + return nil +} diff --git a/cli/command/container/commit_test.go b/cli/command/container/commit_test.go new file mode 100644 index 0000000000..a9127035a2 --- /dev/null +++ b/cli/command/container/commit_test.go @@ -0,0 +1,71 @@ +package container + +import ( + "context" + "io" + "testing" + + "github.com/docker/cli/internal/test" + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" + "github.com/pkg/errors" + "gotest.tools/v3/assert" + is "gotest.tools/v3/assert/cmp" +) + +func TestRunCommit(t *testing.T) { + cli := test.NewFakeCli(&fakeClient{ + containerCommitFunc: func( + ctx context.Context, + container string, + options container.CommitOptions, + ) (types.IDResponse, error) { + assert.Check(t, is.Equal(options.Author, "Author Name ")) + assert.Check(t, is.DeepEqual(options.Changes, []string{"EXPOSE 80"})) + assert.Check(t, is.Equal(options.Comment, "commit message")) + assert.Check(t, is.Equal(options.Pause, false)) + assert.Check(t, is.Equal(container, "container-id")) + + return types.IDResponse{ID: "image-id"}, nil + }, + }) + + cmd := NewCommitCommand(cli) + cmd.SetOut(io.Discard) + cmd.SetArgs( + []string{ + "--author", "Author Name ", + "--change", "EXPOSE 80", + "--message", "commit message", + "--pause=false", + "container-id", + }, + ) + + err := cmd.Execute() + assert.NilError(t, err) + + assert.Assert(t, is.Equal(cli.OutBuffer().String(), "image-id\n")) +} + +func TestRunCommitClientError(t *testing.T) { + clientError := errors.New("client error") + + cli := test.NewFakeCli(&fakeClient{ + containerCommitFunc: func( + ctx context.Context, + container string, + options container.CommitOptions, + ) (types.IDResponse, error) { + return types.IDResponse{}, clientError + }, + }) + + cmd := NewCommitCommand(cli) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + cmd.SetArgs([]string{"container-id"}) + + err := cmd.Execute() + assert.ErrorIs(t, err, clientError) +} diff --git a/cli/command/container/kill_test.go b/cli/command/container/kill_test.go new file mode 100644 index 0000000000..7bd1f10b92 --- /dev/null +++ b/cli/command/container/kill_test.go @@ -0,0 +1,74 @@ +package container + +import ( + "context" + "fmt" + "io" + "strings" + "testing" + + "github.com/docker/cli/internal/test" + "gotest.tools/v3/assert" + is "gotest.tools/v3/assert/cmp" +) + +func TestRunKill(t *testing.T) { + cli := test.NewFakeCli(&fakeClient{ + containerKillFunc: func( + ctx context.Context, + container string, + signal string, + ) error { + assert.Assert(t, is.Equal(signal, "STOP")) + return nil + }, + }) + + cmd := NewKillCommand(cli) + cmd.SetOut(io.Discard) + + cmd.SetArgs([]string{ + "--signal", "STOP", + "container-id-1", + "container-id-2", + }) + err := cmd.Execute() + assert.NilError(t, err) + + containerIDs := strings.SplitN(cli.OutBuffer().String(), "\n", 2) + assert.Assert(t, is.Len(containerIDs, 2)) + + containerID1 := strings.TrimSpace(containerIDs[0]) + containerID2 := strings.TrimSpace(containerIDs[1]) + + assert.Check(t, is.Equal(containerID1, "container-id-1")) + assert.Check(t, is.Equal(containerID2, "container-id-2")) +} + +func TestRunKillClientError(t *testing.T) { + cli := test.NewFakeCli(&fakeClient{ + containerKillFunc: func( + ctx context.Context, + container string, + signal string, + ) error { + return fmt.Errorf("client error for container %s", container) + }, + }) + + cmd := NewKillCommand(cli) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + + cmd.SetArgs([]string{"container-id-1", "container-id-2"}) + err := cmd.Execute() + + errs := strings.SplitN(err.Error(), "\n", 2) + assert.Assert(t, is.Len(errs, 2)) + + errContainerID1 := errs[0] + errContainerID2 := errs[1] + + assert.Assert(t, is.Equal(errContainerID1, "client error for container container-id-1")) + assert.Assert(t, is.Equal(errContainerID2, "client error for container container-id-2")) +} diff --git a/cli/command/container/pause_test.go b/cli/command/container/pause_test.go new file mode 100644 index 0000000000..a359797a94 --- /dev/null +++ b/cli/command/container/pause_test.go @@ -0,0 +1,65 @@ +package container + +import ( + "context" + "fmt" + "io" + "strings" + "testing" + + "github.com/docker/cli/internal/test" + "gotest.tools/v3/assert" + is "gotest.tools/v3/assert/cmp" +) + +func TestRunPause(t *testing.T) { + cli := test.NewFakeCli( + &fakeClient{ + containerPauseFunc: func(ctx context.Context, container string) error { + return nil + }, + }, + ) + + cmd := NewPauseCommand(cli) + cmd.SetOut(io.Discard) + cmd.SetArgs([]string{"container-id-1", "container-id-2"}) + + err := cmd.Execute() + assert.NilError(t, err) + + containerIDs := strings.SplitN(cli.OutBuffer().String(), "\n", 2) + assert.Assert(t, is.Len(containerIDs, 2)) + + containerID1 := strings.TrimSpace(containerIDs[0]) + containerID2 := strings.TrimSpace(containerIDs[1]) + + assert.Check(t, is.Equal(containerID1, "container-id-1")) + assert.Check(t, is.Equal(containerID2, "container-id-2")) +} + +func TestRunPauseClientError(t *testing.T) { + cli := test.NewFakeCli( + &fakeClient{ + containerPauseFunc: func(ctx context.Context, container string) error { + return fmt.Errorf("client error for container %s", container) + }, + }, + ) + + cmd := NewPauseCommand(cli) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + cmd.SetArgs([]string{"container-id-1", "container-id-2"}) + + err := cmd.Execute() + + errs := strings.SplitN(err.Error(), "\n", 2) + assert.Assert(t, is.Len(errs, 2)) + + errContainerID1 := errs[0] + errContainerID2 := errs[1] + + assert.Assert(t, is.Equal(errContainerID1, "client error for container container-id-1")) + assert.Assert(t, is.Equal(errContainerID2, "client error for container container-id-2")) +}