Skip to content

Commit 5a57da9

Browse files
committed
Add tests for exec and cleanup existing tests.
Improve test coverage Reduce cyclo to 16 Signed-off-by: Daniel Nephin <dnephin@docker.com>
1 parent 2b7ab35 commit 5a57da9

File tree

11 files changed

+295
-93
lines changed

11 files changed

+295
-93
lines changed

cli/command/container/client_test.go

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
package container
22

33
import (
4+
"io"
5+
"time"
6+
47
"github.com/docker/docker/api/types"
8+
"github.com/docker/docker/api/types/container"
9+
"github.com/docker/docker/api/types/filters"
10+
"github.com/docker/docker/api/types/network"
511
"github.com/docker/docker/client"
612
"golang.org/x/net/context"
713
)
814

915
type fakeClient struct {
1016
client.Client
1117
containerInspectFunc func(string) (types.ContainerJSON, error)
18+
execInspectFunc func(ctx context.Context, execID string) (types.ContainerExecInspect, error)
1219
}
1320

1421
func (cli *fakeClient) ContainerInspect(_ context.Context, containerID string) (types.ContainerJSON, error) {
@@ -17,3 +24,132 @@ func (cli *fakeClient) ContainerInspect(_ context.Context, containerID string) (
1724
}
1825
return types.ContainerJSON{}, nil
1926
}
27+
28+
func (cli *fakeClient) ContainerAttach(ctx context.Context, container string, options types.ContainerAttachOptions) (types.HijackedResponse, error) {
29+
return types.HijackedResponse{}, nil
30+
}
31+
32+
func (cli *fakeClient) ContainerCommit(ctx context.Context, container string, options types.ContainerCommitOptions) (types.IDResponse, error) {
33+
return types.IDResponse{}, nil
34+
}
35+
36+
func (cli *fakeClient) ContainerCreate(
37+
ctx context.Context,
38+
config *container.Config,
39+
hostConfig *container.HostConfig,
40+
networkingConfig *network.NetworkingConfig,
41+
containerName string,
42+
) (container.ContainerCreateCreatedBody, error) {
43+
return container.ContainerCreateCreatedBody{}, nil
44+
}
45+
46+
func (cli *fakeClient) ContainerDiff(ctx context.Context, container string) ([]container.ContainerChangeResponseItem, error) {
47+
return nil, nil
48+
}
49+
50+
func (cli *fakeClient) ContainerExecAttach(ctx context.Context, execID string, config types.ExecConfig) (types.HijackedResponse, error) {
51+
return types.HijackedResponse{}, nil
52+
}
53+
54+
func (cli *fakeClient) ContainerExecCreate(ctx context.Context, container string, config types.ExecConfig) (types.IDResponse, error) {
55+
return types.IDResponse{}, nil
56+
}
57+
58+
func (cli *fakeClient) ContainerExecInspect(ctx context.Context, execID string) (types.ContainerExecInspect, error) {
59+
if cli.execInspectFunc != nil {
60+
return cli.execInspectFunc(ctx, execID)
61+
}
62+
return types.ContainerExecInspect{}, nil
63+
}
64+
65+
func (cli *fakeClient) ContainerExecResize(ctx context.Context, execID string, options types.ResizeOptions) error {
66+
return nil
67+
}
68+
69+
func (cli *fakeClient) ContainerExecStart(ctx context.Context, execID string, config types.ExecStartCheck) error {
70+
return nil
71+
}
72+
73+
func (cli *fakeClient) ContainerExport(ctx context.Context, container string) (io.ReadCloser, error) {
74+
return nil, nil
75+
}
76+
77+
func (cli *fakeClient) ContainerInspectWithRaw(ctx context.Context, container string, getSize bool) (types.ContainerJSON, []byte, error) {
78+
return types.ContainerJSON{}, nil, nil
79+
}
80+
81+
func (cli *fakeClient) ContainerKill(ctx context.Context, container, signal string) error {
82+
return nil
83+
}
84+
85+
func (cli *fakeClient) ContainerList(ctx context.Context, options types.ContainerListOptions) ([]types.Container, error) {
86+
return nil, nil
87+
}
88+
89+
func (cli *fakeClient) ContainerLogs(ctx context.Context, container string, options types.ContainerLogsOptions) (io.ReadCloser, error) {
90+
return nil, nil
91+
}
92+
93+
func (cli *fakeClient) ContainerPause(ctx context.Context, container string) error {
94+
return nil
95+
}
96+
97+
func (cli *fakeClient) ContainerRemove(ctx context.Context, container string, options types.ContainerRemoveOptions) error {
98+
return nil
99+
}
100+
101+
func (cli *fakeClient) ContainerRename(ctx context.Context, container, newContainerName string) error {
102+
return nil
103+
}
104+
105+
func (cli *fakeClient) ContainerResize(ctx context.Context, container string, options types.ResizeOptions) error {
106+
return nil
107+
}
108+
109+
func (cli *fakeClient) ContainerRestart(ctx context.Context, container string, timeout *time.Duration) error {
110+
return nil
111+
}
112+
113+
func (cli *fakeClient) ContainerStatPath(ctx context.Context, container, path string) (types.ContainerPathStat, error) {
114+
return types.ContainerPathStat{}, nil
115+
}
116+
117+
func (cli *fakeClient) ContainerStats(ctx context.Context, container string, stream bool) (types.ContainerStats, error) {
118+
return types.ContainerStats{}, nil
119+
}
120+
121+
func (cli *fakeClient) ContainerStart(ctx context.Context, container string, options types.ContainerStartOptions) error {
122+
return nil
123+
}
124+
125+
func (cli *fakeClient) ContainerStop(ctx context.Context, container string, timeout *time.Duration) error {
126+
return nil
127+
}
128+
129+
func (cli *fakeClient) ContainerTop(ctx context.Context, containerID string, arguments []string) (container.ContainerTopOKBody, error) {
130+
return container.ContainerTopOKBody{}, nil
131+
}
132+
133+
func (cli *fakeClient) ContainerUnpause(ctx context.Context, container string) error {
134+
return nil
135+
}
136+
137+
func (cli *fakeClient) ContainerUpdate(ctx context.Context, containerID string, updateConfig container.UpdateConfig) (container.ContainerUpdateOKBody, error) {
138+
return container.ContainerUpdateOKBody{}, nil
139+
}
140+
141+
func (cli *fakeClient) ContainerWait(ctx context.Context, container string, condition container.WaitCondition) (<-chan container.ContainerWaitOKBody, <-chan error) {
142+
return nil, nil
143+
}
144+
145+
func (cli *fakeClient) CopyFromContainer(ctx context.Context, container, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) {
146+
return nil, types.ContainerPathStat{}, nil
147+
}
148+
149+
func (cli *fakeClient) CopyToContainer(ctx context.Context, container, path string, content io.Reader, options types.CopyToContainerOptions) error {
150+
return nil
151+
}
152+
153+
func (cli *fakeClient) ContainersPrune(ctx context.Context, pruneFilters filters.Args) (types.ContainersPruneReport, error) {
154+
return types.ContainersPruneReport{}, nil
155+
}

cli/command/container/exec.go

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"github.com/Sirupsen/logrus"
88
"github.com/docker/cli/cli"
99
"github.com/docker/cli/cli/command"
10+
"github.com/docker/cli/cli/config/configfile"
1011
"github.com/docker/cli/opts"
1112
"github.com/docker/docker/api/types"
1213
apiclient "github.com/docker/docker/client"
@@ -63,19 +64,11 @@ func NewExecCommand(dockerCli command.Cli) *cobra.Command {
6364
}
6465

6566
func runExec(dockerCli command.Cli, options *execOptions, container string, execCmd []string) error {
66-
execConfig, err := parseExec(options, execCmd)
67-
// just in case the ParseExec does not exit
68-
if container == "" || err != nil {
69-
return cli.StatusError{StatusCode: 1}
67+
execConfig := parseExec(options, dockerCli.ConfigFile(), execCmd)
68+
if container == "" {
69+
return cli.StatusError{StatusCode: 1, Status: "No container id or name"}
7070
}
7171

72-
if options.detachKeys != "" {
73-
dockerCli.ConfigFile().DetachKeys = options.detachKeys
74-
}
75-
76-
// Send client escape keys
77-
execConfig.DetachKeys = dockerCli.ConfigFile().DetachKeys
78-
7972
ctx := context.Background()
8073
client := dockerCli.Client()
8174

@@ -187,7 +180,7 @@ func getExecExitStatus(ctx context.Context, client apiclient.ContainerAPIClient,
187180

188181
// parseExec parses the specified args for the specified command and generates
189182
// an ExecConfig from it.
190-
func parseExec(opts *execOptions, execCmd []string) (*types.ExecConfig, error) {
183+
func parseExec(opts *execOptions, configFile *configfile.ConfigFile, execCmd []string) *types.ExecConfig {
191184
execConfig := &types.ExecConfig{
192185
User: opts.user,
193186
Privileged: opts.privileged,
@@ -209,5 +202,10 @@ func parseExec(opts *execOptions, execCmd []string) (*types.ExecConfig, error) {
209202
execConfig.Env = opts.env.GetAll()
210203
}
211204

212-
return execConfig, nil
205+
if opts.detachKeys != "" {
206+
execConfig.DetachKeys = opts.detachKeys
207+
} else {
208+
execConfig.DetachKeys = configFile.DetachKeys
209+
}
210+
return execConfig
213211
}

0 commit comments

Comments
 (0)