Skip to content

Commit

Permalink
Add tests for exec and cleanup existing tests.
Browse files Browse the repository at this point in the history
Improve test coverage
Reduce cyclo to 16

Signed-off-by: Daniel Nephin <dnephin@docker.com>
  • Loading branch information
dnephin committed Jul 5, 2017
1 parent 2b7ab35 commit 5a57da9
Show file tree
Hide file tree
Showing 11 changed files with 295 additions and 93 deletions.
136 changes: 136 additions & 0 deletions cli/command/container/client_test.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
package container

import (
"io"
"time"

"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/filters"
"github.com/docker/docker/api/types/network"
"github.com/docker/docker/client"
"golang.org/x/net/context"
)

type fakeClient struct {
client.Client
containerInspectFunc func(string) (types.ContainerJSON, error)
execInspectFunc func(ctx context.Context, execID string) (types.ContainerExecInspect, error)
}

func (cli *fakeClient) ContainerInspect(_ context.Context, containerID string) (types.ContainerJSON, error) {
Expand All @@ -17,3 +24,132 @@ func (cli *fakeClient) ContainerInspect(_ context.Context, containerID string) (
}
return types.ContainerJSON{}, nil
}

func (cli *fakeClient) ContainerAttach(ctx context.Context, container string, options types.ContainerAttachOptions) (types.HijackedResponse, error) {
return types.HijackedResponse{}, nil
}

func (cli *fakeClient) ContainerCommit(ctx context.Context, container string, options types.ContainerCommitOptions) (types.IDResponse, error) {
return types.IDResponse{}, nil
}

func (cli *fakeClient) ContainerCreate(
ctx context.Context,
config *container.Config,
hostConfig *container.HostConfig,
networkingConfig *network.NetworkingConfig,
containerName string,
) (container.ContainerCreateCreatedBody, error) {
return container.ContainerCreateCreatedBody{}, nil
}

func (cli *fakeClient) ContainerDiff(ctx context.Context, container string) ([]container.ContainerChangeResponseItem, error) {
return nil, nil
}

func (cli *fakeClient) ContainerExecAttach(ctx context.Context, execID string, config types.ExecConfig) (types.HijackedResponse, error) {
return types.HijackedResponse{}, nil
}

func (cli *fakeClient) ContainerExecCreate(ctx context.Context, container string, config types.ExecConfig) (types.IDResponse, error) {
return types.IDResponse{}, nil
}

func (cli *fakeClient) ContainerExecInspect(ctx context.Context, execID string) (types.ContainerExecInspect, error) {
if cli.execInspectFunc != nil {
return cli.execInspectFunc(ctx, execID)
}
return types.ContainerExecInspect{}, nil
}

func (cli *fakeClient) ContainerExecResize(ctx context.Context, execID string, options types.ResizeOptions) error {
return nil
}

func (cli *fakeClient) ContainerExecStart(ctx context.Context, execID string, config types.ExecStartCheck) error {
return nil
}

func (cli *fakeClient) ContainerExport(ctx context.Context, container string) (io.ReadCloser, error) {
return nil, nil
}

func (cli *fakeClient) ContainerInspectWithRaw(ctx context.Context, container string, getSize bool) (types.ContainerJSON, []byte, error) {
return types.ContainerJSON{}, nil, nil
}

func (cli *fakeClient) ContainerKill(ctx context.Context, container, signal string) error {
return nil
}

func (cli *fakeClient) ContainerList(ctx context.Context, options types.ContainerListOptions) ([]types.Container, error) {
return nil, nil
}

func (cli *fakeClient) ContainerLogs(ctx context.Context, container string, options types.ContainerLogsOptions) (io.ReadCloser, error) {
return nil, nil
}

func (cli *fakeClient) ContainerPause(ctx context.Context, container string) error {
return nil
}

func (cli *fakeClient) ContainerRemove(ctx context.Context, container string, options types.ContainerRemoveOptions) error {
return nil
}

func (cli *fakeClient) ContainerRename(ctx context.Context, container, newContainerName string) error {
return nil
}

func (cli *fakeClient) ContainerResize(ctx context.Context, container string, options types.ResizeOptions) error {
return nil
}

func (cli *fakeClient) ContainerRestart(ctx context.Context, container string, timeout *time.Duration) error {
return nil
}

func (cli *fakeClient) ContainerStatPath(ctx context.Context, container, path string) (types.ContainerPathStat, error) {
return types.ContainerPathStat{}, nil
}

func (cli *fakeClient) ContainerStats(ctx context.Context, container string, stream bool) (types.ContainerStats, error) {
return types.ContainerStats{}, nil
}

func (cli *fakeClient) ContainerStart(ctx context.Context, container string, options types.ContainerStartOptions) error {
return nil
}

func (cli *fakeClient) ContainerStop(ctx context.Context, container string, timeout *time.Duration) error {
return nil
}

func (cli *fakeClient) ContainerTop(ctx context.Context, containerID string, arguments []string) (container.ContainerTopOKBody, error) {
return container.ContainerTopOKBody{}, nil
}

func (cli *fakeClient) ContainerUnpause(ctx context.Context, container string) error {
return nil
}

func (cli *fakeClient) ContainerUpdate(ctx context.Context, containerID string, updateConfig container.UpdateConfig) (container.ContainerUpdateOKBody, error) {
return container.ContainerUpdateOKBody{}, nil
}

func (cli *fakeClient) ContainerWait(ctx context.Context, container string, condition container.WaitCondition) (<-chan container.ContainerWaitOKBody, <-chan error) {
return nil, nil
}

func (cli *fakeClient) CopyFromContainer(ctx context.Context, container, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) {
return nil, types.ContainerPathStat{}, nil
}

func (cli *fakeClient) CopyToContainer(ctx context.Context, container, path string, content io.Reader, options types.CopyToContainerOptions) error {
return nil
}

func (cli *fakeClient) ContainersPrune(ctx context.Context, pruneFilters filters.Args) (types.ContainersPruneReport, error) {
return types.ContainersPruneReport{}, nil
}
24 changes: 11 additions & 13 deletions cli/command/container/exec.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/Sirupsen/logrus"
"github.com/docker/cli/cli"
"github.com/docker/cli/cli/command"
"github.com/docker/cli/cli/config/configfile"
"github.com/docker/cli/opts"
"github.com/docker/docker/api/types"
apiclient "github.com/docker/docker/client"
Expand Down Expand Up @@ -63,19 +64,11 @@ func NewExecCommand(dockerCli command.Cli) *cobra.Command {
}

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

if options.detachKeys != "" {
dockerCli.ConfigFile().DetachKeys = options.detachKeys
}

// Send client escape keys
execConfig.DetachKeys = dockerCli.ConfigFile().DetachKeys

ctx := context.Background()
client := dockerCli.Client()

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

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

return execConfig, nil
if opts.detachKeys != "" {
execConfig.DetachKeys = opts.detachKeys
} else {
execConfig.DetachKeys = configFile.DetachKeys
}
return execConfig
}
Loading

0 comments on commit 5a57da9

Please sign in to comment.