Browse code

[test-integration] Migrate some more tests to `cli` package

Add some required command operators to the `cli` package, and update
some tests to use this package, in order to remove a few functions
from `docker_utils_test.go`

Signed-off-by: Vincent Demeester <vincent@sbr.pm>

Vincent Demeester authored on 2017/03/28 00:12:48
Showing 15 changed files
... ...
@@ -2,12 +2,15 @@ package cli
2 2
 
3 3
 import (
4 4
 	"fmt"
5
+	"io"
6
+	"strings"
5 7
 	"sync"
6 8
 	"time"
7 9
 
8 10
 	"github.com/docker/docker/integration-cli/daemon"
9 11
 	"github.com/docker/docker/integration-cli/environment"
10 12
 	icmd "github.com/docker/docker/pkg/testutil/cmd"
13
+	"github.com/pkg/errors"
11 14
 )
12 15
 
13 16
 var (
... ...
@@ -40,8 +43,8 @@ type testingT interface {
40 40
 }
41 41
 
42 42
 // DockerCmd executes the specified docker command and expect a success
43
-func DockerCmd(t testingT, command string, args ...string) *icmd.Result {
44
-	return Docker(Cmd(command, args...)).Assert(t, icmd.Success)
43
+func DockerCmd(t testingT, args ...string) *icmd.Result {
44
+	return Docker(Args(args...)).Assert(t, icmd.Success)
45 45
 }
46 46
 
47 47
 // BuildCmd executes the specified docker build command and expect a success
... ...
@@ -63,9 +66,32 @@ func Docker(cmd icmd.Cmd, cmdOperators ...CmdOperator) *icmd.Result {
63 63
 		}
64 64
 	}
65 65
 	appendDocker(&cmd)
66
+	if err := validateArgs(cmd.Command...); err != nil {
67
+		return &icmd.Result{
68
+			Error: err,
69
+		}
70
+	}
66 71
 	return icmd.RunCmd(cmd)
67 72
 }
68 73
 
74
+// validateArgs is a checker to ensure tests are not running commands which are
75
+// not supported on platforms. Specifically on Windows this is 'busybox top'.
76
+func validateArgs(args ...string) error {
77
+	if testEnv.DaemonPlatform() != "windows" {
78
+		return nil
79
+	}
80
+	foundBusybox := -1
81
+	for key, value := range args {
82
+		if strings.ToLower(value) == "busybox" {
83
+			foundBusybox = key
84
+		}
85
+		if (foundBusybox != -1) && (key == foundBusybox+1) && (strings.ToLower(value) == "top") {
86
+			return errors.New("cannot use 'busybox top' in tests on Windows. Use runSleepingContainer()")
87
+		}
88
+	}
89
+	return nil
90
+}
91
+
69 92
 // Build executes the specified docker build command
70 93
 func Build(name string) icmd.Cmd {
71 94
 	return icmd.Command("build", "-t", name)
... ...
@@ -91,9 +117,16 @@ func appendDocker(cmd *icmd.Cmd) {
91 91
 	cmd.Command = append([]string{testEnv.DockerBinary()}, cmd.Command...)
92 92
 }
93 93
 
94
-// Cmd build an icmd.Cmd struct from the specified command and arguments
95
-func Cmd(command string, args ...string) icmd.Cmd {
96
-	return icmd.Command(command, args...)
94
+// Args build an icmd.Cmd struct from the specified arguments
95
+func Args(args ...string) icmd.Cmd {
96
+	switch len(args) {
97
+	case 0:
98
+		return icmd.Cmd{}
99
+	case 1:
100
+		return icmd.Command(args[0])
101
+	default:
102
+		return icmd.Command(args[0], args[1:]...)
103
+	}
97 104
 }
98 105
 
99 106
 // Daemon points to the specified daemon
... ...
@@ -127,3 +160,19 @@ func WithFlags(flags ...string) func(*icmd.Cmd) func() {
127 127
 		return nil
128 128
 	}
129 129
 }
130
+
131
+// InDir sets the folder in which the command should be executed
132
+func InDir(path string) func(*icmd.Cmd) func() {
133
+	return func(cmd *icmd.Cmd) func() {
134
+		cmd.Dir = path
135
+		return nil
136
+	}
137
+}
138
+
139
+// WithStdout sets the standard output writer of the command
140
+func WithStdout(writer io.Writer) func(*icmd.Cmd) func() {
141
+	return func(cmd *icmd.Cmd) func() {
142
+		cmd.Stdout = writer
143
+		return nil
144
+	}
145
+}
... ...
@@ -11,6 +11,7 @@ import (
11 11
 
12 12
 	"github.com/docker/docker/api"
13 13
 	"github.com/docker/docker/integration-cli/checker"
14
+	"github.com/docker/docker/integration-cli/cli"
14 15
 	"github.com/docker/docker/integration-cli/request"
15 16
 	"github.com/docker/docker/pkg/testutil"
16 17
 	icmd "github.com/docker/docker/pkg/testutil/cmd"
... ...
@@ -71,10 +72,7 @@ func (s *DockerSuite) TestAPIDockerAPIVersion(c *check.C) {
71 71
 	defer server.Close()
72 72
 
73 73
 	// Test using the env var first
74
-	result := icmd.RunCmd(icmd.Cmd{
75
-		Command: binaryWithArgs("-H="+server.URL[7:], "version"),
76
-		Env:     appendBaseEnv(false, "DOCKER_API_VERSION=xxx"),
77
-	})
74
+	result := cli.Docker(cli.Args("-H="+server.URL[7:], "version"), cli.WithEnvironmentVariables("DOCKER_API_VERSION=xxx"))
78 75
 	c.Assert(result, icmd.Matches, icmd.Expected{Out: "API version:  xxx", ExitCode: 1})
79 76
 	c.Assert(svrVersion, check.Equals, "/vxxx/version", check.Commentf("%s", result.Compare(icmd.Success)))
80 77
 }
... ...
@@ -3565,37 +3565,21 @@ func (s *DockerSuite) TestBuildRenamedDockerfile(c *check.C) {
3565 3565
 		})
3566 3566
 	defer ctx.Close()
3567 3567
 
3568
-	out, _, err := dockerCmdInDir(c, ctx.Dir, "build", "-t", "test1", ".")
3569
-	if err != nil {
3570
-		c.Fatalf("Failed to build: %s\n%s", out, err)
3571
-	}
3572
-	if !strings.Contains(out, "from Dockerfile") {
3573
-		c.Fatalf("test1 should have used Dockerfile, output:%s", out)
3574
-	}
3568
+	cli.Docker(cli.Args("build", "-t", "test1", "."), cli.InDir(ctx.Dir)).Assert(c, icmd.Expected{
3569
+		Out: "from Dockerfile",
3570
+	})
3575 3571
 
3576
-	out, _, err = dockerCmdInDir(c, ctx.Dir, "build", "-f", filepath.Join("files", "Dockerfile"), "-t", "test2", ".")
3577
-	if err != nil {
3578
-		c.Fatal(err)
3579
-	}
3580
-	if !strings.Contains(out, "from files/Dockerfile") {
3581
-		c.Fatalf("test2 should have used files/Dockerfile, output:%s", out)
3582
-	}
3572
+	cli.Docker(cli.Args("build", "-f", filepath.Join("files", "Dockerfile"), "-t", "test2", "."), cli.InDir(ctx.Dir)).Assert(c, icmd.Expected{
3573
+		Out: "from files/Dockerfile",
3574
+	})
3583 3575
 
3584
-	out, _, err = dockerCmdInDir(c, ctx.Dir, "build", fmt.Sprintf("--file=%s", filepath.Join("files", "dFile")), "-t", "test3", ".")
3585
-	if err != nil {
3586
-		c.Fatal(err)
3587
-	}
3588
-	if !strings.Contains(out, "from files/dFile") {
3589
-		c.Fatalf("test3 should have used files/dFile, output:%s", out)
3590
-	}
3576
+	cli.Docker(cli.Args("build", fmt.Sprintf("--file=%s", filepath.Join("files", "dFile")), "-t", "test3", "."), cli.InDir(ctx.Dir)).Assert(c, icmd.Expected{
3577
+		Out: "from files/dFile",
3578
+	})
3591 3579
 
3592
-	out, _, err = dockerCmdInDir(c, ctx.Dir, "build", "--file=dFile", "-t", "test4", ".")
3593
-	if err != nil {
3594
-		c.Fatal(err)
3595
-	}
3596
-	if !strings.Contains(out, "from dFile") {
3597
-		c.Fatalf("test4 should have used dFile, output:%s", out)
3598
-	}
3580
+	cli.Docker(cli.Args("build", "--file=dFile", "-t", "test4", "."), cli.InDir(ctx.Dir)).Assert(c, icmd.Expected{
3581
+		Out: "from dFile",
3582
+	})
3599 3583
 
3600 3584
 	dirWithNoDockerfile, err := ioutil.TempDir(os.TempDir(), "test5")
3601 3585
 	c.Assert(err, check.IsNil)
... ...
@@ -3603,54 +3587,32 @@ func (s *DockerSuite) TestBuildRenamedDockerfile(c *check.C) {
3603 3603
 	if _, err = os.Create(nonDockerfileFile); err != nil {
3604 3604
 		c.Fatal(err)
3605 3605
 	}
3606
-	out, _, err = dockerCmdInDir(c, ctx.Dir, "build", fmt.Sprintf("--file=%s", nonDockerfileFile), "-t", "test5", ".")
3607
-
3608
-	if err == nil {
3609
-		c.Fatalf("test5 was supposed to fail to find passwd")
3610
-	}
3611
-
3612
-	if expected := fmt.Sprintf("The Dockerfile (%s) must be within the build context (.)", nonDockerfileFile); !strings.Contains(out, expected) {
3613
-		c.Fatalf("wrong error message:%v\nexpected to contain=%v", out, expected)
3614
-	}
3606
+	cli.Docker(cli.Args("build", fmt.Sprintf("--file=%s", nonDockerfileFile), "-t", "test5", "."), cli.InDir(ctx.Dir)).Assert(c, icmd.Expected{
3607
+		ExitCode: 1,
3608
+		Err:      fmt.Sprintf("The Dockerfile (%s) must be within the build context (.)", nonDockerfileFile),
3609
+	})
3615 3610
 
3616
-	out, _, err = dockerCmdInDir(c, filepath.Join(ctx.Dir, "files"), "build", "-f", filepath.Join("..", "Dockerfile"), "-t", "test6", "..")
3617
-	if err != nil {
3618
-		c.Fatalf("test6 failed: %s", err)
3619
-	}
3620
-	if !strings.Contains(out, "from Dockerfile") {
3621
-		c.Fatalf("test6 should have used root Dockerfile, output:%s", out)
3622
-	}
3611
+	cli.Docker(cli.Args("build", "-f", filepath.Join("..", "Dockerfile"), "-t", "test6", ".."), cli.InDir(filepath.Join(ctx.Dir, "files"))).Assert(c, icmd.Expected{
3612
+		Out: "from Dockerfile",
3613
+	})
3623 3614
 
3624
-	out, _, err = dockerCmdInDir(c, filepath.Join(ctx.Dir, "files"), "build", "-f", filepath.Join(ctx.Dir, "files", "Dockerfile"), "-t", "test7", "..")
3625
-	if err != nil {
3626
-		c.Fatalf("test7 failed: %s", err)
3627
-	}
3628
-	if !strings.Contains(out, "from files/Dockerfile") {
3629
-		c.Fatalf("test7 should have used files Dockerfile, output:%s", out)
3630
-	}
3615
+	cli.Docker(cli.Args("build", "-f", filepath.Join(ctx.Dir, "files", "Dockerfile"), "-t", "test7", ".."), cli.InDir(filepath.Join(ctx.Dir, "files"))).Assert(c, icmd.Expected{
3616
+		Out: "from files/Dockerfile",
3617
+	})
3631 3618
 
3632
-	out, _, err = dockerCmdInDir(c, filepath.Join(ctx.Dir, "files"), "build", "-f", filepath.Join("..", "Dockerfile"), "-t", "test8", ".")
3633
-	if err == nil || !strings.Contains(out, "must be within the build context") {
3634
-		c.Fatalf("test8 should have failed with Dockerfile out of context: %s", err)
3635
-	}
3619
+	cli.Docker(cli.Args("build", "-f", filepath.Join("..", "Dockerfile"), "-t", "test8", "."), cli.InDir(filepath.Join(ctx.Dir, "files"))).Assert(c, icmd.Expected{
3620
+		ExitCode: 1,
3621
+		Err:      "must be within the build context",
3622
+	})
3636 3623
 
3637 3624
 	tmpDir := os.TempDir()
3638
-	out, _, err = dockerCmdInDir(c, tmpDir, "build", "-t", "test9", ctx.Dir)
3639
-	if err != nil {
3640
-		c.Fatalf("test9 - failed: %s", err)
3641
-	}
3642
-	if !strings.Contains(out, "from Dockerfile") {
3643
-		c.Fatalf("test9 should have used root Dockerfile, output:%s", out)
3644
-	}
3645
-
3646
-	out, _, err = dockerCmdInDir(c, filepath.Join(ctx.Dir, "files"), "build", "-f", "dFile2", "-t", "test10", ".")
3647
-	if err != nil {
3648
-		c.Fatalf("test10 should have worked: %s", err)
3649
-	}
3650
-	if !strings.Contains(out, "from files/dFile2") {
3651
-		c.Fatalf("test10 should have used files/dFile2, output:%s", out)
3652
-	}
3625
+	cli.Docker(cli.Args("build", "-t", "test9", ctx.Dir), cli.InDir(tmpDir)).Assert(c, icmd.Expected{
3626
+		Out: "from Dockerfile",
3627
+	})
3653 3628
 
3629
+	cli.Docker(cli.Args("build", "-f", "dFile2", "-t", "test10", "."), cli.InDir(filepath.Join(ctx.Dir, "files"))).Assert(c, icmd.Expected{
3630
+		Out: "from files/dFile2",
3631
+	})
3654 3632
 }
3655 3633
 
3656 3634
 func (s *DockerSuite) TestBuildFromMixedcaseDockerfile(c *check.C) {
... ...
@@ -15,6 +15,7 @@ import (
15 15
 	"time"
16 16
 
17 17
 	"github.com/docker/docker/integration-cli/checker"
18
+	"github.com/docker/docker/integration-cli/cli"
18 19
 	"github.com/docker/docker/pkg/testutil"
19 20
 	icmd "github.com/docker/docker/pkg/testutil/cmd"
20 21
 	"github.com/docker/go-units"
... ...
@@ -29,12 +30,12 @@ func (s *DockerSuite) TestBuildResourceConstraintsAreUsed(c *check.C) {
29 29
 	FROM hello-world:frozen
30 30
 	RUN ["/hello"]
31 31
 	`, map[string]string{})
32
-	_, _, err := dockerCmdInDir(c, ctx.Dir, "build", "--no-cache", "--rm=false", "--memory=64m", "--memory-swap=-1", "--cpuset-cpus=0", "--cpuset-mems=0", "--cpu-shares=100", "--cpu-quota=8000", "--ulimit", "nofile=42", "-t", name, ".")
33
-	if err != nil {
34
-		c.Fatal(err)
35
-	}
32
+	cli.Docker(
33
+		cli.Args("build", "--no-cache", "--rm=false", "--memory=64m", "--memory-swap=-1", "--cpuset-cpus=0", "--cpuset-mems=0", "--cpu-shares=100", "--cpu-quota=8000", "--ulimit", "nofile=42", "-t", name, "."),
34
+		cli.InDir(ctx.Dir),
35
+	).Assert(c, icmd.Success)
36 36
 
37
-	out, _ := dockerCmd(c, "ps", "-lq")
37
+	out := cli.DockerCmd(c, "ps", "-lq").Combined()
38 38
 	cID := strings.TrimSpace(out)
39 39
 
40 40
 	type hostConfig struct {
... ...
@@ -50,7 +51,7 @@ func (s *DockerSuite) TestBuildResourceConstraintsAreUsed(c *check.C) {
50 50
 	cfg := inspectFieldJSON(c, cID, "HostConfig")
51 51
 
52 52
 	var c1 hostConfig
53
-	err = json.Unmarshal([]byte(cfg), &c1)
53
+	err := json.Unmarshal([]byte(cfg), &c1)
54 54
 	c.Assert(err, checker.IsNil, check.Commentf(cfg))
55 55
 
56 56
 	c.Assert(c1.Memory, checker.Equals, int64(64*1024*1024), check.Commentf("resource constraints not set properly for Memory"))
... ...
@@ -63,7 +64,7 @@ func (s *DockerSuite) TestBuildResourceConstraintsAreUsed(c *check.C) {
63 63
 	c.Assert(c1.Ulimits[0].Hard, checker.Equals, int64(42), check.Commentf("resource constraints not set properly for Ulimits"))
64 64
 
65 65
 	// Make sure constraints aren't saved to image
66
-	dockerCmd(c, "run", "--name=test", name)
66
+	cli.DockerCmd(c, "run", "--name=test", name)
67 67
 
68 68
 	cfg = inspectFieldJSON(c, "test", "HostConfig")
69 69
 
... ...
@@ -49,19 +49,19 @@ func (s *DockerDaemonSuite) TestDaemonRestartWithRunningContainersPorts(c *check
49 49
 	s.d.StartWithBusybox(c)
50 50
 
51 51
 	cli.Docker(
52
-		cli.Cmd("run", "-d", "--name", "top1", "-p", "1234:80", "--restart", "always", "busybox:latest", "top"),
52
+		cli.Args("run", "-d", "--name", "top1", "-p", "1234:80", "--restart", "always", "busybox:latest", "top"),
53 53
 		cli.Daemon(s.d),
54 54
 	).Assert(c, icmd.Success)
55 55
 
56 56
 	cli.Docker(
57
-		cli.Cmd("run", "-d", "--name", "top2", "-p", "80", "busybox:latest", "top"),
57
+		cli.Args("run", "-d", "--name", "top2", "-p", "80", "busybox:latest", "top"),
58 58
 		cli.Daemon(s.d),
59 59
 	).Assert(c, icmd.Success)
60 60
 
61 61
 	testRun := func(m map[string]bool, prefix string) {
62 62
 		var format string
63 63
 		for cont, shouldRun := range m {
64
-			out := cli.Docker(cli.Cmd("ps"), cli.Daemon(s.d)).Assert(c, icmd.Success).Combined()
64
+			out := cli.Docker(cli.Args("ps"), cli.Daemon(s.d)).Assert(c, icmd.Success).Combined()
65 65
 			if shouldRun {
66 66
 				format = "%scontainer %q is not running"
67 67
 			} else {
... ...
@@ -7,6 +7,7 @@ import (
7 7
 	"unicode"
8 8
 
9 9
 	"github.com/docker/docker/integration-cli/checker"
10
+	"github.com/docker/docker/integration-cli/cli"
10 11
 	"github.com/docker/docker/pkg/homedir"
11 12
 	icmd "github.com/docker/docker/pkg/testutil/cmd"
12 13
 	"github.com/go-check/check"
... ...
@@ -149,29 +150,29 @@ func (s *DockerSuite) TestHelpExitCodesHelpOutput(c *check.C) {
149 149
 	// various good and bad cases are what we expect
150 150
 
151 151
 	// docker : stdout=all, stderr=empty, rc=0
152
-	out, _ := dockerCmd(c)
152
+	out := cli.DockerCmd(c).Combined()
153 153
 	// Be really pick
154 154
 	c.Assert(out, checker.Not(checker.HasSuffix), "\n\n", check.Commentf("Should not have a blank line at the end of 'docker'\n"))
155 155
 
156 156
 	// docker help: stdout=all, stderr=empty, rc=0
157
-	out, _ = dockerCmd(c, "help")
157
+	out = cli.DockerCmd(c, "help").Combined()
158 158
 	// Be really pick
159 159
 	c.Assert(out, checker.Not(checker.HasSuffix), "\n\n", check.Commentf("Should not have a blank line at the end of 'docker help'\n"))
160 160
 
161 161
 	// docker --help: stdout=all, stderr=empty, rc=0
162
-	out, _ = dockerCmd(c, "--help")
162
+	out = cli.DockerCmd(c, "--help").Combined()
163 163
 	// Be really pick
164 164
 	c.Assert(out, checker.Not(checker.HasSuffix), "\n\n", check.Commentf("Should not have a blank line at the end of 'docker --help'\n"))
165 165
 
166 166
 	// docker inspect busybox: stdout=all, stderr=empty, rc=0
167 167
 	// Just making sure stderr is empty on valid cmd
168
-	out, _ = dockerCmd(c, "inspect", "busybox")
168
+	out = cli.DockerCmd(c, "inspect", "busybox").Combined()
169 169
 	// Be really pick
170 170
 	c.Assert(out, checker.Not(checker.HasSuffix), "\n\n", check.Commentf("Should not have a blank line at the end of 'docker inspect busyBox'\n"))
171 171
 
172 172
 	// docker rm: stdout=empty, stderr=all, rc!=0
173 173
 	// testing the min arg error msg
174
-	icmd.RunCommand(dockerBinary, "rm").Assert(c, icmd.Expected{
174
+	cli.Docker(cli.Args("rm")).Assert(c, icmd.Expected{
175 175
 		ExitCode: 1,
176 176
 		Error:    "exit status 1",
177 177
 		Out:      "",
... ...
@@ -182,8 +183,7 @@ func (s *DockerSuite) TestHelpExitCodesHelpOutput(c *check.C) {
182 182
 
183 183
 	// docker rm NoSuchContainer: stdout=empty, stderr=all, rc=0
184 184
 	// testing to make sure no blank line on error
185
-	result := icmd.RunCommand(dockerBinary, "rm", "NoSuchContainer")
186
-	result.Assert(c, icmd.Expected{
185
+	result := cli.Docker(cli.Args("rm", "NoSuchContainer")).Assert(c, icmd.Expected{
187 186
 		ExitCode: 1,
188 187
 		Error:    "exit status 1",
189 188
 		Out:      "",
... ...
@@ -193,7 +193,7 @@ func (s *DockerSuite) TestHelpExitCodesHelpOutput(c *check.C) {
193 193
 	c.Assert(result.Stderr(), checker.Not(checker.HasSuffix), "\n\n", check.Commentf("Should not have a blank line at the end of 'docker rm'\n"))
194 194
 
195 195
 	// docker BadCmd: stdout=empty, stderr=all, rc=0
196
-	icmd.RunCommand(dockerBinary, "BadCmd").Assert(c, icmd.Expected{
196
+	cli.Docker(cli.Args("BadCmd")).Assert(c, icmd.Expected{
197 197
 		ExitCode: 1,
198 198
 		Error:    "exit status 1",
199 199
 		Out:      "",
... ...
@@ -10,6 +10,7 @@ import (
10 10
 	"strings"
11 11
 
12 12
 	"github.com/docker/docker/integration-cli/checker"
13
+	"github.com/docker/docker/integration-cli/cli"
13 14
 	"github.com/docker/docker/pkg/testutil"
14 15
 	icmd "github.com/docker/docker/pkg/testutil/cmd"
15 16
 	"github.com/go-check/check"
... ...
@@ -126,22 +127,17 @@ func (s *DockerSuite) TestImportFileNonExistentFile(c *check.C) {
126 126
 
127 127
 func (s *DockerSuite) TestImportWithQuotedChanges(c *check.C) {
128 128
 	testRequires(c, DaemonIsLinux)
129
-	dockerCmd(c, "run", "--name", "test-import", "busybox", "true")
129
+	cli.DockerCmd(c, "run", "--name", "test-import", "busybox", "true")
130 130
 
131 131
 	temporaryFile, err := ioutil.TempFile("", "exportImportTest")
132 132
 	c.Assert(err, checker.IsNil, check.Commentf("failed to create temporary file"))
133 133
 	defer os.Remove(temporaryFile.Name())
134 134
 
135
-	result := icmd.RunCmd(icmd.Cmd{
136
-		Command: binaryWithArgs("export", "test-import"),
137
-		Stdout:  bufio.NewWriter(temporaryFile),
138
-	})
139
-	c.Assert(result, icmd.Matches, icmd.Success)
135
+	cli.Docker(cli.Args("export", "test-import"), cli.WithStdout(bufio.NewWriter(temporaryFile))).Assert(c, icmd.Success)
140 136
 
141
-	result = dockerCmdWithResult("import", "-c", `ENTRYPOINT ["/bin/sh", "-c"]`, temporaryFile.Name())
142
-	c.Assert(result, icmd.Matches, icmd.Success)
137
+	result := cli.DockerCmd(c, "import", "-c", `ENTRYPOINT ["/bin/sh", "-c"]`, temporaryFile.Name())
143 138
 	image := strings.TrimSpace(result.Stdout())
144 139
 
145
-	result = dockerCmdWithResult("run", "--rm", image, "true")
140
+	result = cli.DockerCmd(c, "run", "--rm", image, "true")
146 141
 	c.Assert(result, icmd.Matches, icmd.Expected{Out: icmd.None})
147 142
 }
... ...
@@ -9,6 +9,7 @@ import (
9 9
 	"time"
10 10
 
11 11
 	"github.com/docker/docker/integration-cli/checker"
12
+	"github.com/docker/docker/integration-cli/cli"
12 13
 	"github.com/docker/docker/pkg/jsonlog"
13 14
 	"github.com/docker/docker/pkg/testutil"
14 15
 	icmd "github.com/docker/docker/pkg/testutil/cmd"
... ...
@@ -65,18 +66,13 @@ func (s *DockerSuite) TestLogsTimestamps(c *check.C) {
65 65
 
66 66
 func (s *DockerSuite) TestLogsSeparateStderr(c *check.C) {
67 67
 	msg := "stderr_log"
68
-	out, _ := dockerCmd(c, "run", "-d", "busybox", "sh", "-c", fmt.Sprintf("echo %s 1>&2", msg))
69
-
68
+	out := cli.DockerCmd(c, "run", "-d", "busybox", "sh", "-c", fmt.Sprintf("echo %s 1>&2", msg)).Combined()
70 69
 	id := strings.TrimSpace(out)
71
-	dockerCmd(c, "wait", id)
72
-
73
-	stdout, stderr, _ := dockerCmdWithStdoutStderr(c, "logs", id)
74
-
75
-	c.Assert(stdout, checker.Equals, "")
76
-
77
-	stderr = strings.TrimSpace(stderr)
78
-
79
-	c.Assert(stderr, checker.Equals, msg)
70
+	cli.DockerCmd(c, "wait", id)
71
+	cli.DockerCmd(c, "logs", id).Assert(c, icmd.Expected{
72
+		Out: "",
73
+		Err: msg,
74
+	})
80 75
 }
81 76
 
82 77
 func (s *DockerSuite) TestLogsStderrInStdout(c *check.C) {
... ...
@@ -84,46 +80,44 @@ func (s *DockerSuite) TestLogsStderrInStdout(c *check.C) {
84 84
 	// a bunch of ANSI escape sequences before the "stderr_log" message.
85 85
 	testRequires(c, DaemonIsLinux)
86 86
 	msg := "stderr_log"
87
-	out, _ := dockerCmd(c, "run", "-d", "-t", "busybox", "sh", "-c", fmt.Sprintf("echo %s 1>&2", msg))
88
-
87
+	out := cli.DockerCmd(c, "run", "-d", "-t", "busybox", "sh", "-c", fmt.Sprintf("echo %s 1>&2", msg)).Combined()
89 88
 	id := strings.TrimSpace(out)
90
-	dockerCmd(c, "wait", id)
89
+	cli.DockerCmd(c, "wait", id)
91 90
 
92
-	stdout, stderr, _ := dockerCmdWithStdoutStderr(c, "logs", id)
93
-	c.Assert(stderr, checker.Equals, "")
94
-
95
-	stdout = strings.TrimSpace(stdout)
96
-	c.Assert(stdout, checker.Equals, msg)
91
+	cli.DockerCmd(c, "logs", id).Assert(c, icmd.Expected{
92
+		Out: msg,
93
+		Err: "",
94
+	})
97 95
 }
98 96
 
99 97
 func (s *DockerSuite) TestLogsTail(c *check.C) {
100 98
 	testLen := 100
101
-	out, _ := dockerCmd(c, "run", "-d", "busybox", "sh", "-c", fmt.Sprintf("for i in $(seq 1 %d); do echo =; done;", testLen))
99
+	out := cli.DockerCmd(c, "run", "-d", "busybox", "sh", "-c", fmt.Sprintf("for i in $(seq 1 %d); do echo =; done;", testLen)).Combined()
102 100
 
103 101
 	id := strings.TrimSpace(out)
104
-	dockerCmd(c, "wait", id)
102
+	cli.DockerCmd(c, "wait", id)
105 103
 
106
-	out, _ = dockerCmd(c, "logs", "--tail", "0", id)
104
+	out = cli.DockerCmd(c, "logs", "--tail", "0", id).Combined()
107 105
 	lines := strings.Split(out, "\n")
108 106
 	c.Assert(lines, checker.HasLen, 1)
109 107
 
110
-	out, _ = dockerCmd(c, "logs", "--tail", "5", id)
108
+	out = cli.DockerCmd(c, "logs", "--tail", "5", id).Combined()
111 109
 	lines = strings.Split(out, "\n")
112 110
 	c.Assert(lines, checker.HasLen, 6)
113 111
 
114
-	out, _ = dockerCmd(c, "logs", "--tail", "99", id)
112
+	out = cli.DockerCmd(c, "logs", "--tail", "99", id).Combined()
115 113
 	lines = strings.Split(out, "\n")
116 114
 	c.Assert(lines, checker.HasLen, 100)
117 115
 
118
-	out, _ = dockerCmd(c, "logs", "--tail", "all", id)
116
+	out = cli.DockerCmd(c, "logs", "--tail", "all", id).Combined()
119 117
 	lines = strings.Split(out, "\n")
120 118
 	c.Assert(lines, checker.HasLen, testLen+1)
121 119
 
122
-	out, _ = dockerCmd(c, "logs", "--tail", "-1", id)
120
+	out = cli.DockerCmd(c, "logs", "--tail", "-1", id).Combined()
123 121
 	lines = strings.Split(out, "\n")
124 122
 	c.Assert(lines, checker.HasLen, testLen+1)
125 123
 
126
-	out, _, _ = dockerCmdWithStdoutStderr(c, "logs", "--tail", "random", id)
124
+	out = cli.DockerCmd(c, "logs", "--tail", "random", id).Combined()
127 125
 	lines = strings.Split(out, "\n")
128 126
 	c.Assert(lines, checker.HasLen, testLen+1)
129 127
 }
... ...
@@ -11,6 +11,7 @@ import (
11 11
 	"time"
12 12
 
13 13
 	"github.com/docker/docker/integration-cli/checker"
14
+	"github.com/docker/docker/integration-cli/cli"
14 15
 	"github.com/docker/docker/integration-cli/cli/build"
15 16
 	"github.com/docker/docker/pkg/stringid"
16 17
 	icmd "github.com/docker/docker/pkg/testutil/cmd"
... ...
@@ -185,26 +186,26 @@ func (s *DockerSuite) TestPsListContainersSize(c *check.C) {
185 185
 
186 186
 func (s *DockerSuite) TestPsListContainersFilterStatus(c *check.C) {
187 187
 	// start exited container
188
-	out, _ := dockerCmd(c, "run", "-d", "busybox")
188
+	out := cli.DockerCmd(c, "run", "-d", "busybox").Combined()
189 189
 	firstID := strings.TrimSpace(out)
190 190
 
191 191
 	// make sure the exited container is not running
192
-	dockerCmd(c, "wait", firstID)
192
+	cli.DockerCmd(c, "wait", firstID)
193 193
 
194 194
 	// start running container
195
-	out, _ = dockerCmd(c, "run", "-itd", "busybox")
195
+	out = cli.DockerCmd(c, "run", "-itd", "busybox").Combined()
196 196
 	secondID := strings.TrimSpace(out)
197 197
 
198 198
 	// filter containers by exited
199
-	out, _ = dockerCmd(c, "ps", "--no-trunc", "-q", "--filter=status=exited")
199
+	out = cli.DockerCmd(c, "ps", "--no-trunc", "-q", "--filter=status=exited").Combined()
200 200
 	containerOut := strings.TrimSpace(out)
201 201
 	c.Assert(containerOut, checker.Equals, firstID)
202 202
 
203
-	out, _ = dockerCmd(c, "ps", "-a", "--no-trunc", "-q", "--filter=status=running")
203
+	out = cli.DockerCmd(c, "ps", "-a", "--no-trunc", "-q", "--filter=status=running").Combined()
204 204
 	containerOut = strings.TrimSpace(out)
205 205
 	c.Assert(containerOut, checker.Equals, secondID)
206 206
 
207
-	result := dockerCmdWithTimeout(time.Second*60, "ps", "-a", "-q", "--filter=status=rubbish")
207
+	result := cli.Docker(cli.Args("ps", "-a", "-q", "--filter=status=rubbish"), cli.WithTimeout(time.Second*60))
208 208
 	c.Assert(result, icmd.Matches, icmd.Expected{
209 209
 		ExitCode: 1,
210 210
 		Err:      "Unrecognised filter value for status",
... ...
@@ -213,13 +214,13 @@ func (s *DockerSuite) TestPsListContainersFilterStatus(c *check.C) {
213 213
 	// Windows doesn't support pausing of containers
214 214
 	if testEnv.DaemonPlatform() != "windows" {
215 215
 		// pause running container
216
-		out, _ = dockerCmd(c, "run", "-itd", "busybox")
216
+		out = cli.DockerCmd(c, "run", "-itd", "busybox").Combined()
217 217
 		pausedID := strings.TrimSpace(out)
218
-		dockerCmd(c, "pause", pausedID)
218
+		cli.DockerCmd(c, "pause", pausedID)
219 219
 		// make sure the container is unpaused to let the daemon stop it properly
220
-		defer func() { dockerCmd(c, "unpause", pausedID) }()
220
+		defer func() { cli.DockerCmd(c, "unpause", pausedID) }()
221 221
 
222
-		out, _ = dockerCmd(c, "ps", "--no-trunc", "-q", "--filter=status=paused")
222
+		out = cli.DockerCmd(c, "ps", "--no-trunc", "-q", "--filter=status=paused").Combined()
223 223
 		containerOut = strings.TrimSpace(out)
224 224
 		c.Assert(containerOut, checker.Equals, pausedID)
225 225
 	}
... ...
@@ -22,6 +22,7 @@ import (
22 22
 	"time"
23 23
 
24 24
 	"github.com/docker/docker/integration-cli/checker"
25
+	"github.com/docker/docker/integration-cli/cli"
25 26
 	"github.com/docker/docker/integration-cli/cli/build"
26 27
 	"github.com/docker/docker/pkg/mount"
27 28
 	"github.com/docker/docker/pkg/stringid"
... ...
@@ -1285,19 +1286,19 @@ func (s *DockerSuite) TestRunDNSOptions(c *check.C) {
1285 1285
 	// Not applicable on Windows as Windows does not support --dns*, or
1286 1286
 	// the Unix-specific functionality of resolv.conf.
1287 1287
 	testRequires(c, DaemonIsLinux)
1288
-	out, stderr, _ := dockerCmdWithStdoutStderr(c, "run", "--dns=127.0.0.1", "--dns-search=mydomain", "--dns-opt=ndots:9", "busybox", "cat", "/etc/resolv.conf")
1288
+	result := cli.DockerCmd(c, "run", "--dns=127.0.0.1", "--dns-search=mydomain", "--dns-opt=ndots:9", "busybox", "cat", "/etc/resolv.conf")
1289 1289
 
1290 1290
 	// The client will get a warning on stderr when setting DNS to a localhost address; verify this:
1291
-	if !strings.Contains(stderr, "Localhost DNS setting") {
1292
-		c.Fatalf("Expected warning on stderr about localhost resolver, but got %q", stderr)
1291
+	if !strings.Contains(result.Stderr(), "Localhost DNS setting") {
1292
+		c.Fatalf("Expected warning on stderr about localhost resolver, but got %q", result.Stderr())
1293 1293
 	}
1294 1294
 
1295
-	actual := strings.Replace(strings.Trim(out, "\r\n"), "\n", " ", -1)
1295
+	actual := strings.Replace(strings.Trim(result.Stdout(), "\r\n"), "\n", " ", -1)
1296 1296
 	if actual != "search mydomain nameserver 127.0.0.1 options ndots:9" {
1297 1297
 		c.Fatalf("expected 'search mydomain nameserver 127.0.0.1 options ndots:9', but says: %q", actual)
1298 1298
 	}
1299 1299
 
1300
-	out, _ = dockerCmd(c, "run", "--dns=1.1.1.1", "--dns-search=.", "--dns-opt=ndots:3", "busybox", "cat", "/etc/resolv.conf")
1300
+	out := cli.DockerCmd(c, "run", "--dns=1.1.1.1", "--dns-search=.", "--dns-opt=ndots:3", "busybox", "cat", "/etc/resolv.conf").Combined()
1301 1301
 
1302 1302
 	actual = strings.Replace(strings.Trim(strings.Trim(out, "\r\n"), " "), "\n", " ", -1)
1303 1303
 	if actual != "nameserver 1.1.1.1 options ndots:3" {
... ...
@@ -1307,7 +1308,7 @@ func (s *DockerSuite) TestRunDNSOptions(c *check.C) {
1307 1307
 
1308 1308
 func (s *DockerSuite) TestRunDNSRepeatOptions(c *check.C) {
1309 1309
 	testRequires(c, DaemonIsLinux)
1310
-	out, _, _ := dockerCmdWithStdoutStderr(c, "run", "--dns=1.1.1.1", "--dns=2.2.2.2", "--dns-search=mydomain", "--dns-search=mydomain2", "--dns-opt=ndots:9", "--dns-opt=timeout:3", "busybox", "cat", "/etc/resolv.conf")
1310
+	out := cli.DockerCmd(c, "run", "--dns=1.1.1.1", "--dns=2.2.2.2", "--dns-search=mydomain", "--dns-search=mydomain2", "--dns-opt=ndots:9", "--dns-opt=timeout:3", "busybox", "cat", "/etc/resolv.conf").Stdout()
1311 1311
 
1312 1312
 	actual := strings.Replace(strings.Trim(out, "\r\n"), "\n", " ", -1)
1313 1313
 	if actual != "search mydomain mydomain2 nameserver 1.1.1.1 nameserver 2.2.2.2 options ndots:9 timeout:3" {
... ...
@@ -4093,26 +4094,30 @@ func (s *DockerSuite) TestRunDNSInHostMode(c *check.C) {
4093 4093
 
4094 4094
 	expectedOutput := "nameserver 127.0.0.1"
4095 4095
 	expectedWarning := "Localhost DNS setting"
4096
-	out, stderr, _ := dockerCmdWithStdoutStderr(c, "run", "--dns=127.0.0.1", "--net=host", "busybox", "cat", "/etc/resolv.conf")
4097
-	c.Assert(out, checker.Contains, expectedOutput, check.Commentf("Expected '%s', but got %q", expectedOutput, out))
4098
-	c.Assert(stderr, checker.Contains, expectedWarning, check.Commentf("Expected warning on stderr about localhost resolver, but got %q", stderr))
4096
+	cli.DockerCmd(c, "run", "--dns=127.0.0.1", "--net=host", "busybox", "cat", "/etc/resolv.conf").Assert(c, icmd.Expected{
4097
+		Out: expectedOutput,
4098
+		Err: expectedWarning,
4099
+	})
4099 4100
 
4100 4101
 	expectedOutput = "nameserver 1.2.3.4"
4101
-	out, _ = dockerCmd(c, "run", "--dns=1.2.3.4", "--net=host", "busybox", "cat", "/etc/resolv.conf")
4102
-	c.Assert(out, checker.Contains, expectedOutput, check.Commentf("Expected '%s', but got %q", expectedOutput, out))
4102
+	cli.DockerCmd(c, "run", "--dns=1.2.3.4", "--net=host", "busybox", "cat", "/etc/resolv.conf").Assert(c, icmd.Expected{
4103
+		Out: expectedOutput,
4104
+	})
4103 4105
 
4104 4106
 	expectedOutput = "search example.com"
4105
-	out, _ = dockerCmd(c, "run", "--dns-search=example.com", "--net=host", "busybox", "cat", "/etc/resolv.conf")
4106
-	c.Assert(out, checker.Contains, expectedOutput, check.Commentf("Expected '%s', but got %q", expectedOutput, out))
4107
+	cli.DockerCmd(c, "run", "--dns-search=example.com", "--net=host", "busybox", "cat", "/etc/resolv.conf").Assert(c, icmd.Expected{
4108
+		Out: expectedOutput,
4109
+	})
4107 4110
 
4108 4111
 	expectedOutput = "options timeout:3"
4109
-	out, _ = dockerCmd(c, "run", "--dns-opt=timeout:3", "--net=host", "busybox", "cat", "/etc/resolv.conf")
4110
-	c.Assert(out, checker.Contains, expectedOutput, check.Commentf("Expected '%s', but got %q", expectedOutput, out))
4112
+	cli.DockerCmd(c, "run", "--dns-opt=timeout:3", "--net=host", "busybox", "cat", "/etc/resolv.conf").Assert(c, icmd.Expected{
4113
+		Out: expectedOutput,
4114
+	})
4111 4115
 
4112 4116
 	expectedOutput1 := "nameserver 1.2.3.4"
4113 4117
 	expectedOutput2 := "search example.com"
4114 4118
 	expectedOutput3 := "options timeout:3"
4115
-	out, _ = dockerCmd(c, "run", "--dns=1.2.3.4", "--dns-search=example.com", "--dns-opt=timeout:3", "--net=host", "busybox", "cat", "/etc/resolv.conf")
4119
+	out := cli.DockerCmd(c, "run", "--dns=1.2.3.4", "--dns-search=example.com", "--dns-opt=timeout:3", "--net=host", "busybox", "cat", "/etc/resolv.conf").Combined()
4116 4120
 	c.Assert(out, checker.Contains, expectedOutput1, check.Commentf("Expected '%s', but got %q", expectedOutput1, out))
4117 4121
 	c.Assert(out, checker.Contains, expectedOutput2, check.Commentf("Expected '%s', but got %q", expectedOutput2, out))
4118 4122
 	c.Assert(out, checker.Contains, expectedOutput3, check.Commentf("Expected '%s', but got %q", expectedOutput3, out))
... ...
@@ -4139,25 +4144,24 @@ func (s *DockerSuite) TestRunRmAndWait(c *check.C) {
4139 4139
 // Test that auto-remove is performed by the daemon (API 1.25 and above)
4140 4140
 func (s *DockerSuite) TestRunRm(c *check.C) {
4141 4141
 	name := "miss-me-when-im-gone"
4142
-	dockerCmd(c, "run", "--name="+name, "--rm", "busybox")
4142
+	cli.DockerCmd(c, "run", "--name="+name, "--rm", "busybox")
4143 4143
 
4144
-	_, err := inspectFieldWithError(name, "name")
4145
-	c.Assert(err, checker.Not(check.IsNil))
4146
-	c.Assert(err.Error(), checker.Contains, "No such object: "+name)
4144
+	cli.Docker(cli.Inspect(name), cli.Format(".name")).Assert(c, icmd.Expected{
4145
+		ExitCode: 1,
4146
+		Err:      "No such object: " + name,
4147
+	})
4147 4148
 }
4148 4149
 
4149 4150
 // Test that auto-remove is performed by the client on API versions that do not support daemon-side api-remove (API < 1.25)
4150 4151
 func (s *DockerSuite) TestRunRmPre125Api(c *check.C) {
4151 4152
 	name := "miss-me-when-im-gone"
4152
-	result := icmd.RunCmd(icmd.Cmd{
4153
-		Command: binaryWithArgs("run", "--name="+name, "--rm", "busybox"),
4154
-		Env:     appendBaseEnv(false, "DOCKER_API_VERSION=1.24"),
4155
-	})
4156
-	c.Assert(result, icmd.Matches, icmd.Success)
4153
+	envs := appendBaseEnv(false, "DOCKER_API_VERSION=1.24")
4154
+	cli.Docker(cli.Args("run", "--name="+name, "--rm", "busybox"), cli.WithEnvironmentVariables(envs...)).Assert(c, icmd.Success)
4157 4155
 
4158
-	_, err := inspectFieldWithError(name, "name")
4159
-	c.Assert(err, checker.Not(check.IsNil))
4160
-	c.Assert(err.Error(), checker.Contains, "No such object: "+name)
4156
+	cli.Docker(cli.Inspect(name), cli.Format(".name")).Assert(c, icmd.Expected{
4157
+		ExitCode: 1,
4158
+		Err:      "No such object: " + name,
4159
+	})
4161 4160
 }
4162 4161
 
4163 4162
 // Test case for #23498
... ...
@@ -17,6 +17,7 @@ import (
17 17
 	"time"
18 18
 
19 19
 	"github.com/docker/docker/integration-cli/checker"
20
+	"github.com/docker/docker/integration-cli/cli"
20 21
 	"github.com/docker/docker/integration-cli/cli/build"
21 22
 	"github.com/docker/docker/pkg/homedir"
22 23
 	"github.com/docker/docker/pkg/mount"
... ...
@@ -495,11 +496,13 @@ func (s *DockerSuite) TestRunWithKernelMemory(c *check.C) {
495 495
 	testRequires(c, kernelMemorySupport)
496 496
 
497 497
 	file := "/sys/fs/cgroup/memory/memory.kmem.limit_in_bytes"
498
-	stdout, _, _ := dockerCmdWithStdoutStderr(c, "run", "--kernel-memory", "50M", "--name", "test1", "busybox", "cat", file)
499
-	c.Assert(strings.TrimSpace(stdout), checker.Equals, "52428800")
498
+	cli.DockerCmd(c, "run", "--kernel-memory", "50M", "--name", "test1", "busybox", "cat", file).Assert(c, icmd.Expected{
499
+		Out: "52428800",
500
+	})
500 501
 
501
-	out := inspectField(c, "test1", "HostConfig.KernelMemory")
502
-	c.Assert(out, check.Equals, "52428800")
502
+	cli.InspectCmd(c, "test1", cli.Format(".HostConfig.KernelMemory")).Assert(c, icmd.Expected{
503
+		Out: "52428800",
504
+	})
503 505
 }
504 506
 
505 507
 func (s *DockerSuite) TestRunWithInvalidKernelMemory(c *check.C) {
... ...
@@ -531,8 +534,9 @@ func (s *DockerSuite) TestRunWithCPUShares(c *check.C) {
531 531
 func (s *DockerSuite) TestRunEchoStdoutWithCPUSharesAndMemoryLimit(c *check.C) {
532 532
 	testRequires(c, cpuShare)
533 533
 	testRequires(c, memoryLimitSupport)
534
-	out, _, _ := dockerCmdWithStdoutStderr(c, "run", "--cpu-shares", "1000", "-m", "32m", "busybox", "echo", "test")
535
-	c.Assert(out, checker.Equals, "test\n", check.Commentf("container should've printed 'test'"))
534
+	cli.DockerCmd(c, "run", "--cpu-shares", "1000", "-m", "32m", "busybox", "echo", "test").Assert(c, icmd.Expected{
535
+		Out: "test\n",
536
+	})
536 537
 }
537 538
 
538 539
 func (s *DockerSuite) TestRunWithCpusetCpus(c *check.C) {
... ...
@@ -629,11 +633,12 @@ func (s *DockerSuite) TestRunWithMemoryLimit(c *check.C) {
629 629
 	testRequires(c, memoryLimitSupport)
630 630
 
631 631
 	file := "/sys/fs/cgroup/memory/memory.limit_in_bytes"
632
-	stdout, _, _ := dockerCmdWithStdoutStderr(c, "run", "-m", "32M", "--name", "test", "busybox", "cat", file)
633
-	c.Assert(strings.TrimSpace(stdout), checker.Equals, "33554432")
634
-
635
-	out := inspectField(c, "test", "HostConfig.Memory")
636
-	c.Assert(out, check.Equals, "33554432")
632
+	cli.DockerCmd(c, "run", "-m", "32M", "--name", "test", "busybox", "cat", file).Assert(c, icmd.Expected{
633
+		Out: "33554432",
634
+	})
635
+	cli.InspectCmd(c, "test", cli.Format(".HostConfig.Memory")).Assert(c, icmd.Expected{
636
+		Out: "33554432",
637
+	})
637 638
 }
638 639
 
639 640
 // TestRunWithoutMemoryswapLimit sets memory limit and disables swap
... ...
@@ -6,6 +6,7 @@ import (
6 6
 	"time"
7 7
 
8 8
 	"github.com/docker/docker/integration-cli/checker"
9
+	"github.com/docker/docker/integration-cli/cli"
9 10
 	icmd "github.com/docker/docker/pkg/testutil/cmd"
10 11
 	"github.com/go-check/check"
11 12
 )
... ...
@@ -42,18 +43,15 @@ func (s *DockerSuite) TestStartAttachReturnsOnError(c *check.C) {
42 42
 // gh#8555: Exit code should be passed through when using start -a
43 43
 func (s *DockerSuite) TestStartAttachCorrectExitCode(c *check.C) {
44 44
 	testRequires(c, DaemonIsLinux)
45
-	out, _, _ := dockerCmdWithStdoutStderr(c, "run", "-d", "busybox", "sh", "-c", "sleep 2; exit 1")
45
+	out := cli.DockerCmd(c, "run", "-d", "busybox", "sh", "-c", "sleep 2; exit 1").Stdout()
46 46
 	out = strings.TrimSpace(out)
47 47
 
48 48
 	// make sure the container has exited before trying the "start -a"
49
-	dockerCmd(c, "wait", out)
50
-
51
-	startOut, exitCode, err := dockerCmdWithError("start", "-a", out)
52
-	// start command should fail
53
-	c.Assert(err, checker.NotNil, check.Commentf("startOut: %s", startOut))
54
-	// start -a did not respond with proper exit code
55
-	c.Assert(exitCode, checker.Equals, 1, check.Commentf("startOut: %s", startOut))
49
+	cli.DockerCmd(c, "wait", out)
56 50
 
51
+	cli.Docker(cli.Args("start", "-a", out)).Assert(c, icmd.Expected{
52
+		ExitCode: 1,
53
+	})
57 54
 }
58 55
 
59 56
 func (s *DockerSuite) TestStartAttachSilent(c *check.C) {
... ...
@@ -58,7 +58,7 @@ func (s *DockerSwarmSuite) TestSwarmInit(c *check.C) {
58 58
 		return sw.Spec
59 59
 	}
60 60
 
61
-	cli.Docker(cli.Cmd("swarm", "init", "--cert-expiry", "30h", "--dispatcher-heartbeat", "11s"),
61
+	cli.Docker(cli.Args("swarm", "init", "--cert-expiry", "30h", "--dispatcher-heartbeat", "11s"),
62 62
 		cli.Daemon(d.Daemon)).Assert(c, icmd.Success)
63 63
 
64 64
 	spec := getSpec()
... ...
@@ -67,7 +67,7 @@ func (s *DockerSwarmSuite) TestSwarmInit(c *check.C) {
67 67
 
68 68
 	c.Assert(d.Leave(true), checker.IsNil)
69 69
 	time.Sleep(500 * time.Millisecond) // https://github.com/docker/swarmkit/issues/1421
70
-	cli.Docker(cli.Cmd("swarm", "init"), cli.Daemon(d.Daemon)).Assert(c, icmd.Success)
70
+	cli.Docker(cli.Args("swarm", "init"), cli.Daemon(d.Daemon)).Assert(c, icmd.Success)
71 71
 
72 72
 	spec = getSpec()
73 73
 	c.Assert(spec.CAConfig.NodeCertExpiry, checker.Equals, 90*24*time.Hour)
... ...
@@ -77,12 +77,12 @@ func (s *DockerSwarmSuite) TestSwarmInit(c *check.C) {
77 77
 func (s *DockerSwarmSuite) TestSwarmInitIPv6(c *check.C) {
78 78
 	testRequires(c, IPv6)
79 79
 	d1 := s.AddDaemon(c, false, false)
80
-	cli.Docker(cli.Cmd("swarm", "init", "--listen-add", "::1"), cli.Daemon(d1.Daemon)).Assert(c, icmd.Success)
80
+	cli.Docker(cli.Args("swarm", "init", "--listen-add", "::1"), cli.Daemon(d1.Daemon)).Assert(c, icmd.Success)
81 81
 
82 82
 	d2 := s.AddDaemon(c, false, false)
83
-	cli.Docker(cli.Cmd("swarm", "join", "::1"), cli.Daemon(d2.Daemon)).Assert(c, icmd.Success)
83
+	cli.Docker(cli.Args("swarm", "join", "::1"), cli.Daemon(d2.Daemon)).Assert(c, icmd.Success)
84 84
 
85
-	out := cli.Docker(cli.Cmd("info"), cli.Daemon(d2.Daemon)).Assert(c, icmd.Success).Combined()
85
+	out := cli.Docker(cli.Args("info"), cli.Daemon(d2.Daemon)).Assert(c, icmd.Success).Combined()
86 86
 	c.Assert(out, checker.Contains, "Swarm: active")
87 87
 }
88 88
 
... ...
@@ -7,6 +7,7 @@ import (
7 7
 	"time"
8 8
 
9 9
 	"github.com/docker/docker/integration-cli/checker"
10
+	"github.com/docker/docker/integration-cli/cli"
10 11
 	"github.com/docker/docker/pkg/parsers/kernel"
11 12
 	icmd "github.com/docker/docker/pkg/testutil/cmd"
12 13
 	"github.com/go-check/check"
... ...
@@ -368,24 +369,23 @@ func (s *DockerSuite) TestDockerNetworkMacVlanBridgeNilParent(c *check.C) {
368 368
 func (s *DockerSuite) TestDockerNetworkMacVlanBridgeInternalMode(c *check.C) {
369 369
 	// macvlan bridge mode --internal containers can communicate inside the network but not externally
370 370
 	testRequires(c, DaemonIsLinux, macvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon)
371
-	dockerCmd(c, "network", "create", "--driver=macvlan", "--internal", "dm-internal")
371
+	cli.DockerCmd(c, "network", "create", "--driver=macvlan", "--internal", "dm-internal")
372 372
 	assertNwIsAvailable(c, "dm-internal")
373 373
 	nr := getNetworkResource(c, "dm-internal")
374 374
 	c.Assert(nr.Internal, checker.True)
375 375
 
376 376
 	// start two containers on the same subnet
377
-	dockerCmd(c, "run", "-d", "--net=dm-internal", "--name=first", "busybox", "top")
377
+	cli.DockerCmd(c, "run", "-d", "--net=dm-internal", "--name=first", "busybox", "top")
378 378
 	c.Assert(waitRun("first"), check.IsNil)
379
-	dockerCmd(c, "run", "-d", "--net=dm-internal", "--name=second", "busybox", "top")
379
+	cli.DockerCmd(c, "run", "-d", "--net=dm-internal", "--name=second", "busybox", "top")
380 380
 	c.Assert(waitRun("second"), check.IsNil)
381 381
 
382 382
 	// access outside of the network should fail
383
-	result := dockerCmdWithTimeout(time.Second, "exec", "first", "ping", "-c", "1", "-w", "1", "8.8.8.8")
383
+	result := cli.Docker(cli.Args("exec", "first", "ping", "-c", "1", "-w", "1", "8.8.8.8"), cli.WithTimeout(time.Second))
384 384
 	c.Assert(result, icmd.Matches, icmd.Expected{Timeout: true})
385 385
 
386 386
 	// intra-network communications should succeed
387
-	_, _, err := dockerCmdWithError("exec", "second", "ping", "-c", "1", "first")
388
-	c.Assert(err, check.IsNil)
387
+	cli.DockerCmd(c, "exec", "second", "ping", "-c", "1", "first")
389 388
 }
390 389
 
391 390
 func (s *DockerSuite) TestDockerNetworkIpvlanL2NilParent(c *check.C) {
... ...
@@ -408,23 +408,22 @@ func (s *DockerSuite) TestDockerNetworkIpvlanL2NilParent(c *check.C) {
408 408
 func (s *DockerSuite) TestDockerNetworkIpvlanL2InternalMode(c *check.C) {
409 409
 	// ipvlan l2 mode --internal containers can communicate inside the network but not externally
410 410
 	testRequires(c, DaemonIsLinux, ipvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon)
411
-	dockerCmd(c, "network", "create", "--driver=ipvlan", "--internal", "di-internal")
411
+	cli.DockerCmd(c, "network", "create", "--driver=ipvlan", "--internal", "di-internal")
412 412
 	assertNwIsAvailable(c, "di-internal")
413 413
 	nr := getNetworkResource(c, "di-internal")
414 414
 	c.Assert(nr.Internal, checker.True)
415 415
 
416 416
 	// start two containers on the same subnet
417
-	dockerCmd(c, "run", "-d", "--net=di-internal", "--name=first", "busybox", "top")
417
+	cli.DockerCmd(c, "run", "-d", "--net=di-internal", "--name=first", "busybox", "top")
418 418
 	c.Assert(waitRun("first"), check.IsNil)
419
-	dockerCmd(c, "run", "-d", "--net=di-internal", "--name=second", "busybox", "top")
419
+	cli.DockerCmd(c, "run", "-d", "--net=di-internal", "--name=second", "busybox", "top")
420 420
 	c.Assert(waitRun("second"), check.IsNil)
421 421
 
422 422
 	// access outside of the network should fail
423
-	result := dockerCmdWithTimeout(time.Second, "exec", "first", "ping", "-c", "1", "-w", "1", "8.8.8.8")
423
+	result := cli.Docker(cli.Args("exec", "first", "ping", "-c", "1", "-w", "1", "8.8.8.8"), cli.WithTimeout(time.Second))
424 424
 	c.Assert(result, icmd.Matches, icmd.Expected{Timeout: true})
425 425
 	// intra-network communications should succeed
426
-	_, _, err := dockerCmdWithError("exec", "second", "ping", "-c", "1", "first")
427
-	c.Assert(err, check.IsNil)
426
+	cli.DockerCmd(c, "exec", "second", "ping", "-c", "1", "first")
428 427
 }
429 428
 
430 429
 func (s *DockerSuite) TestDockerNetworkIpvlanL3NilParent(c *check.C) {
... ...
@@ -448,24 +447,23 @@ func (s *DockerSuite) TestDockerNetworkIpvlanL3NilParent(c *check.C) {
448 448
 func (s *DockerSuite) TestDockerNetworkIpvlanL3InternalMode(c *check.C) {
449 449
 	// ipvlan l3 mode --internal containers can communicate inside the network but not externally
450 450
 	testRequires(c, DaemonIsLinux, ipvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon)
451
-	dockerCmd(c, "network", "create", "--driver=ipvlan", "--subnet=172.28.230.0/24",
451
+	cli.DockerCmd(c, "network", "create", "--driver=ipvlan", "--subnet=172.28.230.0/24",
452 452
 		"--subnet=172.28.220.0/24", "-o", "ipvlan_mode=l3", "--internal", "di-internal-l3")
453 453
 	assertNwIsAvailable(c, "di-internal-l3")
454 454
 	nr := getNetworkResource(c, "di-internal-l3")
455 455
 	c.Assert(nr.Internal, checker.True)
456 456
 
457 457
 	// start two containers on separate subnets
458
-	dockerCmd(c, "run", "-d", "--ip=172.28.220.10", "--net=di-internal-l3", "--name=first", "busybox", "top")
458
+	cli.DockerCmd(c, "run", "-d", "--ip=172.28.220.10", "--net=di-internal-l3", "--name=first", "busybox", "top")
459 459
 	c.Assert(waitRun("first"), check.IsNil)
460
-	dockerCmd(c, "run", "-d", "--ip=172.28.230.10", "--net=di-internal-l3", "--name=second", "busybox", "top")
460
+	cli.DockerCmd(c, "run", "-d", "--ip=172.28.230.10", "--net=di-internal-l3", "--name=second", "busybox", "top")
461 461
 	c.Assert(waitRun("second"), check.IsNil)
462 462
 
463 463
 	// access outside of the network should fail
464
-	result := dockerCmdWithTimeout(time.Second, "exec", "first", "ping", "-c", "1", "-w", "1", "8.8.8.8")
464
+	result := cli.Docker(cli.Args("exec", "first", "ping", "-c", "1", "-w", "1", "8.8.8.8"), cli.WithTimeout(time.Second))
465 465
 	c.Assert(result, icmd.Matches, icmd.Expected{Timeout: true})
466 466
 	// intra-network communications should succeed
467
-	_, _, err := dockerCmdWithError("exec", "second", "ping", "-c", "1", "first")
468
-	c.Assert(err, check.IsNil)
467
+	cli.DockerCmd(c, "exec", "second", "ping", "-c", "1", "first")
469 468
 }
470 469
 
471 470
 func (s *DockerSuite) TestDockerNetworkMacVlanExistingParent(c *check.C) {
... ...
@@ -79,77 +79,24 @@ func deleteImages(images ...string) error {
79 79
 	return icmd.RunCmd(icmd.Cmd{Command: append(args, images...)}).Error
80 80
 }
81 81
 
82
+// Deprecated: use cli.Docker or cli.DockerCmd
82 83
 func dockerCmdWithError(args ...string) (string, int, error) {
83
-	if err := validateArgs(args...); err != nil {
84
-		return "", 0, err
85
-	}
86
-	result := icmd.RunCommand(dockerBinary, args...)
84
+	result := cli.Docker(cli.Args(args...))
87 85
 	if result.Error != nil {
88 86
 		return result.Combined(), result.ExitCode, result.Compare(icmd.Success)
89 87
 	}
90 88
 	return result.Combined(), result.ExitCode, result.Error
91 89
 }
92 90
 
93
-func dockerCmdWithStdoutStderr(c *check.C, args ...string) (string, string, int) {
94
-	if err := validateArgs(args...); err != nil {
95
-		c.Fatalf(err.Error())
96
-	}
97
-
98
-	result := icmd.RunCommand(dockerBinary, args...)
99
-	c.Assert(result, icmd.Matches, icmd.Success)
100
-	return result.Stdout(), result.Stderr(), result.ExitCode
101
-}
102
-
91
+// Deprecated: use cli.Docker or cli.DockerCmd
103 92
 func dockerCmd(c *check.C, args ...string) (string, int) {
104
-	if err := validateArgs(args...); err != nil {
105
-		c.Fatalf(err.Error())
106
-	}
107
-	result := icmd.RunCommand(dockerBinary, args...)
108
-	c.Assert(result, icmd.Matches, icmd.Success)
93
+	result := cli.DockerCmd(c, args...)
109 94
 	return result.Combined(), result.ExitCode
110 95
 }
111 96
 
97
+// Deprecated: use cli.Docker or cli.DockerCmd
112 98
 func dockerCmdWithResult(args ...string) *icmd.Result {
113
-	return icmd.RunCommand(dockerBinary, args...)
114
-}
115
-
116
-func binaryWithArgs(args ...string) []string {
117
-	return append([]string{dockerBinary}, args...)
118
-}
119
-
120
-// execute a docker command with a timeout
121
-func dockerCmdWithTimeout(timeout time.Duration, args ...string) *icmd.Result {
122
-	if err := validateArgs(args...); err != nil {
123
-		return &icmd.Result{Error: err}
124
-	}
125
-	return icmd.RunCmd(icmd.Cmd{Command: binaryWithArgs(args...), Timeout: timeout})
126
-}
127
-
128
-// execute a docker command in a directory
129
-func dockerCmdInDir(c *check.C, path string, args ...string) (string, int, error) {
130
-	if err := validateArgs(args...); err != nil {
131
-		c.Fatalf(err.Error())
132
-	}
133
-	result := icmd.RunCmd(icmd.Cmd{Command: binaryWithArgs(args...), Dir: path})
134
-	return result.Combined(), result.ExitCode, result.Error
135
-}
136
-
137
-// validateArgs is a checker to ensure tests are not running commands which are
138
-// not supported on platforms. Specifically on Windows this is 'busybox top'.
139
-func validateArgs(args ...string) error {
140
-	if testEnv.DaemonPlatform() != "windows" {
141
-		return nil
142
-	}
143
-	foundBusybox := -1
144
-	for key, value := range args {
145
-		if strings.ToLower(value) == "busybox" {
146
-			foundBusybox = key
147
-		}
148
-		if (foundBusybox != -1) && (key == foundBusybox+1) && (strings.ToLower(value) == "top") {
149
-			return errors.New("cannot use 'busybox top' in tests on Windows. Use runSleepingContainer()")
150
-		}
151
-	}
152
-	return nil
99
+	return cli.Docker(cli.Args(args...))
153 100
 }
154 101
 
155 102
 func findContainerIP(c *check.C, id string, network string) string {
... ...
@@ -391,6 +338,7 @@ func inspectFieldAndUnmarshall(c *check.C, name, field string, output interface{
391 391
 	}
392 392
 }
393 393
 
394
+// Deprecated: use cli.Inspect
394 395
 func inspectFilter(name, filter string) (string, error) {
395 396
 	format := fmt.Sprintf("{{%s}}", filter)
396 397
 	result := icmd.RunCommand(dockerBinary, "inspect", "-f", format, name)
... ...
@@ -400,10 +348,12 @@ func inspectFilter(name, filter string) (string, error) {
400 400
 	return strings.TrimSpace(result.Combined()), nil
401 401
 }
402 402
 
403
+// Deprecated: use cli.Inspect
403 404
 func inspectFieldWithError(name, field string) (string, error) {
404 405
 	return inspectFilter(name, fmt.Sprintf(".%s", field))
405 406
 }
406 407
 
408
+// Deprecated: use cli.Inspect
407 409
 func inspectField(c *check.C, name, field string) string {
408 410
 	out, err := inspectFilter(name, fmt.Sprintf(".%s", field))
409 411
 	if c != nil {
... ...
@@ -412,6 +362,7 @@ func inspectField(c *check.C, name, field string) string {
412 412
 	return out
413 413
 }
414 414
 
415
+// Deprecated: use cli.Inspect
415 416
 func inspectFieldJSON(c *check.C, name, field string) string {
416 417
 	out, err := inspectFilter(name, fmt.Sprintf("json .%s", field))
417 418
 	if c != nil {
... ...
@@ -420,6 +371,7 @@ func inspectFieldJSON(c *check.C, name, field string) string {
420 420
 	return out
421 421
 }
422 422
 
423
+// Deprecated: use cli.Inspect
423 424
 func inspectFieldMap(c *check.C, name, path, field string) string {
424 425
 	out, err := inspectFilter(name, fmt.Sprintf("index .%s %q", path, field))
425 426
 	if c != nil {
... ...
@@ -428,6 +380,7 @@ func inspectFieldMap(c *check.C, name, path, field string) string {
428 428
 	return out
429 429
 }
430 430
 
431
+// Deprecated: use cli.Inspect
431 432
 func inspectMountSourceField(name, destination string) (string, error) {
432 433
 	m, err := inspectMountPoint(name, destination)
433 434
 	if err != nil {
... ...
@@ -436,6 +389,7 @@ func inspectMountSourceField(name, destination string) (string, error) {
436 436
 	return m.Source, nil
437 437
 }
438 438
 
439
+// Deprecated: use cli.Inspect
439 440
 func inspectMountPoint(name, destination string) (types.MountPoint, error) {
440 441
 	out, err := inspectFilter(name, "json .Mounts")
441 442
 	if err != nil {
... ...
@@ -447,6 +401,7 @@ func inspectMountPoint(name, destination string) (types.MountPoint, error) {
447 447
 
448 448
 var errMountNotFound = errors.New("mount point not found")
449 449
 
450
+// Deprecated: use cli.Inspect
450 451
 func inspectMountPointJSON(j, destination string) (types.MountPoint, error) {
451 452
 	var mp []types.MountPoint
452 453
 	if err := json.Unmarshal([]byte(j), &mp); err != nil {
... ...
@@ -468,6 +423,7 @@ func inspectMountPointJSON(j, destination string) (types.MountPoint, error) {
468 468
 	return *m, nil
469 469
 }
470 470
 
471
+// Deprecated: use cli.Inspect
471 472
 func inspectImage(c *check.C, name, filter string) string {
472 473
 	args := []string{"inspect", "--type", "image"}
473 474
 	if filter != "" {