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

Signed-off-by: Daniel Nephin <dnephin@docker.com>
  • Loading branch information
dnephin committed Jun 21, 2017
1 parent 1742ab8 commit d3f89d7
Show file tree
Hide file tree
Showing 6 changed files with 283 additions and 89 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 d3f89d7

Please sign in to comment.