Skip to content

Commit 442c386

Browse files
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 <stavrospanakakis@gmail.com>
1 parent 7908982 commit 442c386

4 files changed

Lines changed: 227 additions & 0 deletions

File tree

cli/command/container/client_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ type fakeClient struct {
4242
containerAttachFunc func(ctx context.Context, containerID string, options container.AttachOptions) (types.HijackedResponse, error)
4343
containerDiffFunc func(ctx context.Context, containerID string) ([]container.FilesystemChange, error)
4444
containerRenameFunc func(ctx context.Context, oldName, newName string) error
45+
containerCommitFunc func(ctx context.Context, container string, options container.CommitOptions) (types.IDResponse, error)
46+
containerPauseFunc func(ctx context.Context, container string) error
4547
Version string
4648
}
4749

@@ -215,3 +217,18 @@ func (f *fakeClient) ContainerRename(ctx context.Context, oldName, newName strin
215217

216218
return nil
217219
}
220+
221+
func (f *fakeClient) ContainerCommit(ctx context.Context, containerID string, options container.CommitOptions) (types.IDResponse, error) {
222+
if f.containerCommitFunc != nil {
223+
return f.containerCommitFunc(ctx, containerID, options)
224+
}
225+
return types.IDResponse{}, nil
226+
}
227+
228+
func (f *fakeClient) ContainerPause(ctx context.Context, containerID string) error {
229+
if f.containerPauseFunc != nil {
230+
return f.containerPauseFunc(ctx, containerID)
231+
}
232+
233+
return nil
234+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package container
2+
3+
import (
4+
"context"
5+
"io"
6+
"testing"
7+
8+
"github.com/docker/cli/internal/test"
9+
"github.com/docker/docker/api/types"
10+
"github.com/docker/docker/api/types/container"
11+
"github.com/pkg/errors"
12+
"gotest.tools/v3/assert"
13+
is "gotest.tools/v3/assert/cmp"
14+
)
15+
16+
func TestRunCommit(t *testing.T) {
17+
cli := test.NewFakeCli(&fakeClient{
18+
containerCommitFunc: func(
19+
ctx context.Context,
20+
container string,
21+
options container.CommitOptions,
22+
) (types.IDResponse, error) {
23+
assert.Check(t, is.Equal(options.Author, "Author Name <author@name.com>"))
24+
assert.Check(t, is.DeepEqual(options.Changes, []string{"EXPOSE 80"}))
25+
assert.Check(t, is.Equal(options.Comment, "commit message"))
26+
assert.Check(t, is.Equal(options.Pause, false))
27+
assert.Check(t, is.Equal(container, "container-id"))
28+
29+
return types.IDResponse{ID: "image-id"}, nil
30+
},
31+
})
32+
33+
cmd := NewCommitCommand(cli)
34+
cmd.SetOut(io.Discard)
35+
cmd.SetArgs(
36+
[]string{
37+
"--author", "Author Name <author@name.com>",
38+
"--change", "EXPOSE 80",
39+
"--message", "commit message",
40+
"--pause=false",
41+
"container-id",
42+
},
43+
)
44+
45+
err := cmd.Execute()
46+
assert.NilError(t, err)
47+
48+
assert.Assert(t, is.Equal(cli.OutBuffer().String(), "image-id\n"))
49+
}
50+
51+
func TestRunCommitClientError(t *testing.T) {
52+
clientError := errors.New("client error")
53+
54+
cli := test.NewFakeCli(&fakeClient{
55+
containerCommitFunc: func(
56+
ctx context.Context,
57+
container string,
58+
options container.CommitOptions,
59+
) (types.IDResponse, error) {
60+
return types.IDResponse{}, clientError
61+
},
62+
})
63+
64+
cmd := NewCommitCommand(cli)
65+
cmd.SetOut(io.Discard)
66+
cmd.SetErr(io.Discard)
67+
cmd.SetArgs([]string{"container-id"})
68+
69+
err := cmd.Execute()
70+
assert.ErrorIs(t, err, clientError)
71+
}

cli/command/container/kill_test.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package container
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"io"
7+
"strings"
8+
"testing"
9+
10+
"github.com/docker/cli/internal/test"
11+
"gotest.tools/v3/assert"
12+
is "gotest.tools/v3/assert/cmp"
13+
)
14+
15+
func TestRunKill(t *testing.T) {
16+
cli := test.NewFakeCli(&fakeClient{
17+
containerKillFunc: func(
18+
ctx context.Context,
19+
container string,
20+
signal string,
21+
) error {
22+
assert.Assert(t, is.Equal(signal, "STOP"))
23+
return nil
24+
},
25+
})
26+
27+
cmd := NewKillCommand(cli)
28+
cmd.SetOut(io.Discard)
29+
30+
cmd.SetArgs([]string{
31+
"--signal", "STOP",
32+
"container-id-1",
33+
"container-id-2",
34+
})
35+
err := cmd.Execute()
36+
assert.NilError(t, err)
37+
38+
containerIDs := strings.SplitN(cli.OutBuffer().String(), "\n", 2)
39+
assert.Assert(t, is.Len(containerIDs, 2))
40+
41+
containerID1 := strings.TrimSpace(containerIDs[0])
42+
containerID2 := strings.TrimSpace(containerIDs[1])
43+
44+
assert.Check(t, is.Equal(containerID1, "container-id-1"))
45+
assert.Check(t, is.Equal(containerID2, "container-id-2"))
46+
}
47+
48+
func TestRunKillClientError(t *testing.T) {
49+
cli := test.NewFakeCli(&fakeClient{
50+
containerKillFunc: func(
51+
ctx context.Context,
52+
container string,
53+
signal string,
54+
) error {
55+
return fmt.Errorf("client error for container %s", container)
56+
},
57+
})
58+
59+
cmd := NewKillCommand(cli)
60+
cmd.SetOut(io.Discard)
61+
cmd.SetErr(io.Discard)
62+
63+
cmd.SetArgs([]string{"container-id-1", "container-id-2"})
64+
err := cmd.Execute()
65+
66+
errs := strings.SplitN(err.Error(), "\n", 2)
67+
assert.Assert(t, is.Len(errs, 2))
68+
69+
errContainerID1 := errs[0]
70+
errContainerID2 := errs[1]
71+
72+
assert.Assert(t, is.Equal(errContainerID1, "client error for container container-id-1"))
73+
assert.Assert(t, is.Equal(errContainerID2, "client error for container container-id-2"))
74+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package container
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"io"
7+
"strings"
8+
"testing"
9+
10+
"github.com/docker/cli/internal/test"
11+
"gotest.tools/v3/assert"
12+
is "gotest.tools/v3/assert/cmp"
13+
)
14+
15+
func TestRunPause(t *testing.T) {
16+
cli := test.NewFakeCli(
17+
&fakeClient{
18+
containerPauseFunc: func(ctx context.Context, container string) error {
19+
return nil
20+
},
21+
},
22+
)
23+
24+
cmd := NewPauseCommand(cli)
25+
cmd.SetOut(io.Discard)
26+
cmd.SetArgs([]string{"container-id-1", "container-id-2"})
27+
28+
err := cmd.Execute()
29+
assert.NilError(t, err)
30+
31+
containerIDs := strings.SplitN(cli.OutBuffer().String(), "\n", 2)
32+
assert.Assert(t, is.Len(containerIDs, 2))
33+
34+
containerID1 := strings.TrimSpace(containerIDs[0])
35+
containerID2 := strings.TrimSpace(containerIDs[1])
36+
37+
assert.Check(t, is.Equal(containerID1, "container-id-1"))
38+
assert.Check(t, is.Equal(containerID2, "container-id-2"))
39+
}
40+
41+
func TestRunPauseClientError(t *testing.T) {
42+
cli := test.NewFakeCli(
43+
&fakeClient{
44+
containerPauseFunc: func(ctx context.Context, container string) error {
45+
return fmt.Errorf("client error for container %s", container)
46+
},
47+
},
48+
)
49+
50+
cmd := NewPauseCommand(cli)
51+
cmd.SetOut(io.Discard)
52+
cmd.SetErr(io.Discard)
53+
cmd.SetArgs([]string{"container-id-1", "container-id-2"})
54+
55+
err := cmd.Execute()
56+
57+
errs := strings.SplitN(err.Error(), "\n", 2)
58+
assert.Assert(t, is.Len(errs, 2))
59+
60+
errContainerID1 := errs[0]
61+
errContainerID2 := errs[1]
62+
63+
assert.Assert(t, is.Equal(errContainerID1, "client error for container container-id-1"))
64+
assert.Assert(t, is.Equal(errContainerID2, "client error for container container-id-2"))
65+
}

0 commit comments

Comments
 (0)