Browse code

Remove most of the runCommandWithOutput from integration tests

There is 5 calls left, that use StdinPipe that is not yet supported by
icmd.

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

Vincent Demeester authored on 2017/01/17 00:39:12
Showing 15 changed files
... ...
@@ -586,14 +586,14 @@ func (d *Daemon) GetBaseDeviceSize(c *check.C) int64 {
586 586
 // Cmd executes a docker CLI command against this daemon.
587 587
 // Example: d.Cmd("version") will run docker -H unix://path/to/unix.sock version
588 588
 func (d *Daemon) Cmd(args ...string) (string, error) {
589
-	b, err := d.Command(args...).CombinedOutput()
590
-	return string(b), err
589
+	result := icmd.RunCmd(d.Command(args...))
590
+	return result.Combined(), result.Error
591 591
 }
592 592
 
593 593
 // Command creates a docker CLI command against this daemon, to be executed later.
594 594
 // Example: d.Command("version") creates a command to run "docker -H unix://path/to/unix.sock version"
595
-func (d *Daemon) Command(args ...string) *exec.Cmd {
596
-	return exec.Command(d.dockerBinary, d.PrependHostArg(args)...)
595
+func (d *Daemon) Command(args ...string) icmd.Cmd {
596
+	return icmd.Command(d.dockerBinary, d.PrependHostArg(args)...)
597 597
 }
598 598
 
599 599
 // PrependHostArg prepend the specified arguments by the daemon host flags
... ...
@@ -31,9 +31,7 @@ import (
31 31
 )
32 32
 
33 33
 func (s *DockerSuite) TestContainerAPIGetAll(c *check.C) {
34
-	startCount, err := getContainerCount()
35
-	c.Assert(err, checker.IsNil, check.Commentf("Cannot query container count"))
36
-
34
+	startCount := getContainerCount(c)
37 35
 	name := "getall"
38 36
 	dockerCmd(c, "run", "--name", name, "busybox", "true")
39 37
 
... ...
@@ -354,8 +352,7 @@ func (s *DockerSuite) TestContainerAPIPause(c *check.C) {
354 354
 	c.Assert(err, checker.IsNil)
355 355
 	c.Assert(status, checker.Equals, http.StatusNoContent)
356 356
 
357
-	pausedContainers, err := getPausedContainers()
358
-	c.Assert(err, checker.IsNil, check.Commentf("error thrown while checking if containers were paused"))
357
+	pausedContainers := getPausedContainers(c)
359 358
 
360 359
 	if len(pausedContainers) != 1 || stringid.TruncateID(ContainerID) != pausedContainers[0] {
361 360
 		c.Fatalf("there should be one paused container and not %d", len(pausedContainers))
... ...
@@ -365,8 +362,7 @@ func (s *DockerSuite) TestContainerAPIPause(c *check.C) {
365 365
 	c.Assert(err, checker.IsNil)
366 366
 	c.Assert(status, checker.Equals, http.StatusNoContent)
367 367
 
368
-	pausedContainers, err = getPausedContainers()
369
-	c.Assert(err, checker.IsNil, check.Commentf("error thrown while checking if containers were paused"))
368
+	pausedContainers = getPausedContainers(c)
370 369
 	c.Assert(pausedContainers, checker.HasLen, 0, check.Commentf("There should be no paused container."))
371 370
 }
372 371
 
... ...
@@ -7,7 +7,6 @@ import (
7 7
 	"fmt"
8 8
 	"io/ioutil"
9 9
 	"os"
10
-	"os/exec"
11 10
 	"path/filepath"
12 11
 	"reflect"
13 12
 	"regexp"
... ...
@@ -1149,10 +1148,7 @@ func (s *DockerSuite) TestBuildWithInaccessibleFilesInContext(c *check.C) {
1149 1149
 }
1150 1150
 
1151 1151
 func (s *DockerSuite) TestBuildForceRm(c *check.C) {
1152
-	containerCountBefore, err := getContainerCount()
1153
-	if err != nil {
1154
-		c.Fatalf("failed to get the container count: %s", err)
1155
-	}
1152
+	containerCountBefore := getContainerCount(c)
1156 1153
 	name := "testbuildforcerm"
1157 1154
 
1158 1155
 	buildImage(name, withBuildFlags("--force-rm"), withBuildContext(c,
... ...
@@ -1162,11 +1158,7 @@ func (s *DockerSuite) TestBuildForceRm(c *check.C) {
1162 1162
 		ExitCode: 1,
1163 1163
 	})
1164 1164
 
1165
-	containerCountAfter, err := getContainerCount()
1166
-	if err != nil {
1167
-		c.Fatalf("failed to get the container count: %s", err)
1168
-	}
1169
-
1165
+	containerCountAfter := getContainerCount(c)
1170 1166
 	if containerCountBefore != containerCountAfter {
1171 1167
 		c.Fatalf("--force-rm shouldn't have left containers behind")
1172 1168
 	}
... ...
@@ -1196,19 +1188,12 @@ func (s *DockerSuite) TestBuildRm(c *check.C) {
1196 1196
 	}
1197 1197
 
1198 1198
 	for _, tc := range testCases {
1199
-		containerCountBefore, err := getContainerCount()
1200
-		if err != nil {
1201
-			c.Fatalf("failed to get the container count: %s", err)
1202
-		}
1199
+		containerCountBefore := getContainerCount(c)
1203 1200
 
1204 1201
 		buildImageSuccessfully(c, name, withBuildFlags(tc.buildflags...), withDockerfile(`FROM busybox
1205 1202
 	RUN echo hello world`))
1206 1203
 
1207
-		containerCountAfter, err := getContainerCount()
1208
-		if err != nil {
1209
-			c.Fatalf("failed to get the container count: %s", err)
1210
-		}
1211
-
1204
+		containerCountAfter := getContainerCount(c)
1212 1205
 		if tc.shouldLeftContainerBehind {
1213 1206
 			if containerCountBefore == containerCountAfter {
1214 1207
 				c.Fatalf("flags %v should have left containers behind", tc.buildflags)
... ...
@@ -2863,13 +2848,10 @@ func (s *DockerSuite) TestBuildAddTarXz(c *check.C) {
2863 2863
 			c.Fatalf("failed to close tar archive: %v", err)
2864 2864
 		}
2865 2865
 
2866
-		xzCompressCmd := exec.Command("xz", "-k", "test.tar")
2867
-		xzCompressCmd.Dir = tmpDir
2868
-		out, _, err := runCommandWithOutput(xzCompressCmd)
2869
-		if err != nil {
2870
-			c.Fatal(err, out)
2871
-		}
2872
-
2866
+		icmd.RunCmd(icmd.Cmd{
2867
+			Command: []string{"xz", "-k", "test.tar"},
2868
+			Dir:     tmpDir,
2869
+		}).Assert(c, icmd.Success)
2873 2870
 		if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
2874 2871
 			c.Fatalf("failed to open destination dockerfile: %v", err)
2875 2872
 		}
... ...
@@ -2913,20 +2895,15 @@ func (s *DockerSuite) TestBuildAddTarXzGz(c *check.C) {
2913 2913
 			c.Fatalf("failed to close tar archive: %v", err)
2914 2914
 		}
2915 2915
 
2916
-		xzCompressCmd := exec.Command("xz", "-k", "test.tar")
2917
-		xzCompressCmd.Dir = tmpDir
2918
-		out, _, err := runCommandWithOutput(xzCompressCmd)
2919
-		if err != nil {
2920
-			c.Fatal(err, out)
2921
-		}
2922
-
2923
-		gzipCompressCmd := exec.Command("gzip", "test.tar.xz")
2924
-		gzipCompressCmd.Dir = tmpDir
2925
-		out, _, err = runCommandWithOutput(gzipCompressCmd)
2926
-		if err != nil {
2927
-			c.Fatal(err, out)
2928
-		}
2916
+		icmd.RunCmd(icmd.Cmd{
2917
+			Command: []string{"xz", "-k", "test.tar"},
2918
+			Dir:     tmpDir,
2919
+		}).Assert(c, icmd.Success)
2929 2920
 
2921
+		icmd.RunCmd(icmd.Cmd{
2922
+			Command: []string{"gzip", "test.tar.xz"},
2923
+			Dir:     tmpDir,
2924
+		})
2930 2925
 		if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
2931 2926
 			c.Fatalf("failed to open destination dockerfile: %v", err)
2932 2927
 		}
... ...
@@ -5591,8 +5568,7 @@ func (s *DockerSuite) TestBuildSquashParent(c *check.C) {
5591 5591
 	dockerCmd(c, "run", "--rm", id, "/bin/sh", "-c", `[ "$(echo $HELLO)" == "world" ]`)
5592 5592
 
5593 5593
 	// make sure the ID produced is the ID of the tag we specified
5594
-	inspectID, err := inspectImage("test", ".ID")
5595
-	c.Assert(err, checker.IsNil)
5594
+	inspectID := inspectImage(c, "test", ".ID")
5596 5595
 	c.Assert(inspectID, checker.Equals, id)
5597 5596
 
5598 5597
 	origHistory, _ := dockerCmd(c, "history", origID)
... ...
@@ -5602,8 +5578,7 @@ func (s *DockerSuite) TestBuildSquashParent(c *check.C) {
5602 5602
 	splitTestHistory := strings.Split(strings.TrimSpace(testHistory), "\n")
5603 5603
 	c.Assert(len(splitTestHistory), checker.Equals, len(splitOrigHistory)+1)
5604 5604
 
5605
-	out, err = inspectImage(id, "len .RootFS.Layers")
5606
-	c.Assert(err, checker.IsNil)
5605
+	out = inspectImage(c, id, "len .RootFS.Layers")
5607 5606
 	c.Assert(strings.TrimSpace(out), checker.Equals, "3")
5608 5607
 }
5609 5608
 
... ...
@@ -422,7 +422,7 @@ func (s *DockerSuite) TestCpSpecialFiles(c *check.C) {
422 422
 	// Copy actual /etc/resolv.conf
423 423
 	dockerCmd(c, "cp", containerID+":/etc/resolv.conf", outDir)
424 424
 
425
-	expected, err := readContainerFile(containerID, "resolv.conf")
425
+	expected := readContainerFile(c, containerID, "resolv.conf")
426 426
 	actual, err := ioutil.ReadFile(outDir + "/resolv.conf")
427 427
 
428 428
 	// Expected copied file to be duplicate of the container resolvconf
... ...
@@ -431,7 +431,7 @@ func (s *DockerSuite) TestCpSpecialFiles(c *check.C) {
431 431
 	// Copy actual /etc/hosts
432 432
 	dockerCmd(c, "cp", containerID+":/etc/hosts", outDir)
433 433
 
434
-	expected, err = readContainerFile(containerID, "hosts")
434
+	expected = readContainerFile(c, containerID, "hosts")
435 435
 	actual, err = ioutil.ReadFile(outDir + "/hosts")
436 436
 
437 437
 	// Expected copied file to be duplicate of the container hosts
... ...
@@ -440,7 +440,7 @@ func (s *DockerSuite) TestCpSpecialFiles(c *check.C) {
440 440
 	// Copy actual /etc/resolv.conf
441 441
 	dockerCmd(c, "cp", containerID+":/etc/hostname", outDir)
442 442
 
443
-	expected, err = readContainerFile(containerID, "hostname")
443
+	expected = readContainerFile(c, containerID, "hostname")
444 444
 	actual, err = ioutil.ReadFile(outDir + "/hostname")
445 445
 	c.Assert(err, checker.IsNil)
446 446
 
... ...
@@ -1951,11 +1951,11 @@ func (s *DockerDaemonSuite) TestDaemonRestartWithKilledRunningContainer(t *check
1951 1951
 
1952 1952
 	// Give time to containerd to process the command if we don't
1953 1953
 	// the exit event might be received after we do the inspect
1954
-	pidCmd := exec.Command("kill", "-0", pid)
1955
-	_, ec, _ := runCommandWithOutput(pidCmd)
1956
-	for ec == 0 {
1954
+	result := icmd.RunCommand("kill", "-0", pid)
1955
+	for result.ExitCode == 0 {
1957 1956
 		time.Sleep(1 * time.Second)
1958
-		_, ec, _ = runCommandWithOutput(pidCmd)
1957
+		// FIXME(vdemeester) should we check it doesn't error out ?
1958
+		result = icmd.RunCommand("kill", "-0", pid)
1959 1959
 	}
1960 1960
 
1961 1961
 	// restart the daemon
... ...
@@ -389,8 +389,7 @@ func (s *DockerSuite) TestRunMutableNetworkFiles(c *check.C) {
389 389
 	for _, fn := range []string{"resolv.conf", "hosts"} {
390 390
 		deleteAllContainers(c)
391 391
 
392
-		content, err := runCommandAndReadContainerFile(fn, exec.Command(dockerBinary, "run", "-d", "--name", "c1", "busybox", "sh", "-c", fmt.Sprintf("echo success >/etc/%s && top", fn)))
393
-		c.Assert(err, checker.IsNil)
392
+		content := runCommandAndReadContainerFile(c, fn, dockerBinary, "run", "-d", "--name", "c1", "busybox", "sh", "-c", fmt.Sprintf("echo success >/etc/%s && top", fn))
394 393
 
395 394
 		c.Assert(strings.TrimSpace(string(content)), checker.Equals, "success", check.Commentf("Content was not what was modified in the container", string(content)))
396 395
 
... ...
@@ -442,30 +441,27 @@ func (s *DockerSuite) TestExecWithPrivileged(c *check.C) {
442 442
 	dockerCmd(c, "run", "-d", "--name", "parent", "--cap-drop=ALL", "busybox", "sh", "-c", `while (true); do if [ -e /exec_priv ]; then cat /exec_priv && mknod /tmp/sda b 8 0 && echo "Success"; else echo "Privileged exec has not run yet"; fi; usleep 10000; done`)
443 443
 
444 444
 	// Check exec mknod doesn't work
445
-	cmd := exec.Command(dockerBinary, "exec", "parent", "sh", "-c", "mknod /tmp/sdb b 8 16")
446
-	out, _, err := runCommandWithOutput(cmd)
447
-	c.Assert(err, checker.NotNil, check.Commentf("exec mknod in --cap-drop=ALL container without --privileged should fail"))
448
-	c.Assert(out, checker.Contains, "Operation not permitted", check.Commentf("exec mknod in --cap-drop=ALL container without --privileged should fail"))
445
+	icmd.RunCommand(dockerBinary, "exec", "parent", "sh", "-c", "mknod /tmp/sdb b 8 16").Assert(c, icmd.Expected{
446
+		ExitCode: 1,
447
+		Err:      "Operation not permitted",
448
+	})
449 449
 
450 450
 	// Check exec mknod does work with --privileged
451
-	cmd = exec.Command(dockerBinary, "exec", "--privileged", "parent", "sh", "-c", `echo "Running exec --privileged" > /exec_priv && mknod /tmp/sdb b 8 16 && usleep 50000 && echo "Finished exec --privileged" > /exec_priv && echo ok`)
452
-	out, _, err = runCommandWithOutput(cmd)
453
-	c.Assert(err, checker.IsNil)
451
+	result := icmd.RunCommand(dockerBinary, "exec", "--privileged", "parent", "sh", "-c", `echo "Running exec --privileged" > /exec_priv && mknod /tmp/sdb b 8 16 && usleep 50000 && echo "Finished exec --privileged" > /exec_priv && echo ok`)
452
+	result.Assert(c, icmd.Success)
454 453
 
455
-	actual := strings.TrimSpace(out)
456
-	c.Assert(actual, checker.Equals, "ok", check.Commentf("exec mknod in --cap-drop=ALL container with --privileged failed, output: %q", out))
454
+	actual := strings.TrimSpace(result.Combined())
455
+	c.Assert(actual, checker.Equals, "ok", check.Commentf("exec mknod in --cap-drop=ALL container with --privileged failed, output: %q", result.Combined()))
457 456
 
458 457
 	// Check subsequent unprivileged exec cannot mknod
459
-	cmd = exec.Command(dockerBinary, "exec", "parent", "sh", "-c", "mknod /tmp/sdc b 8 32")
460
-	out, _, err = runCommandWithOutput(cmd)
461
-	c.Assert(err, checker.NotNil, check.Commentf("repeating exec mknod in --cap-drop=ALL container after --privileged without --privileged should fail"))
462
-	c.Assert(out, checker.Contains, "Operation not permitted", check.Commentf("repeating exec mknod in --cap-drop=ALL container after --privileged without --privileged should fail"))
463
-
458
+	icmd.RunCommand(dockerBinary, "exec", "parent", "sh", "-c", "mknod /tmp/sdc b 8 32").Assert(c, icmd.Expected{
459
+		ExitCode: 1,
460
+		Err:      "Operation not permitted",
461
+	})
464 462
 	// Confirm at no point was mknod allowed
465
-	logCmd := exec.Command(dockerBinary, "logs", "parent")
466
-	out, _, err = runCommandWithOutput(logCmd)
467
-	c.Assert(err, checker.IsNil)
468
-	c.Assert(out, checker.Not(checker.Contains), "Success")
463
+	result = icmd.RunCommand(dockerBinary, "logs", "parent")
464
+	result.Assert(c, icmd.Success)
465
+	c.Assert(result.Combined(), checker.Not(checker.Contains), "Success")
469 466
 
470 467
 }
471 468
 
... ...
@@ -146,11 +146,8 @@ func (s *DockerSuite) TestLinksHostsFilesInject(c *check.C) {
146 146
 
147 147
 	c.Assert(waitRun(idTwo), checker.IsNil)
148 148
 
149
-	contentOne, err := readContainerFileWithExec(idOne, "/etc/hosts")
150
-	c.Assert(err, checker.IsNil, check.Commentf("contentOne: %s", string(contentOne)))
151
-
152
-	contentTwo, err := readContainerFileWithExec(idTwo, "/etc/hosts")
153
-	c.Assert(err, checker.IsNil, check.Commentf("contentTwo: %s", string(contentTwo)))
149
+	readContainerFileWithExec(c, idOne, "/etc/hosts")
150
+	contentTwo := readContainerFileWithExec(c, idTwo, "/etc/hosts")
154 151
 	// Host is not present in updated hosts file
155 152
 	c.Assert(string(contentTwo), checker.Contains, "onetwo")
156 153
 }
... ...
@@ -163,8 +160,7 @@ func (s *DockerSuite) TestLinksUpdateOnRestart(c *check.C) {
163 163
 	id := strings.TrimSpace(string(out))
164 164
 
165 165
 	realIP := inspectField(c, "one", "NetworkSettings.Networks.bridge.IPAddress")
166
-	content, err := readContainerFileWithExec(id, "/etc/hosts")
167
-	c.Assert(err, checker.IsNil)
166
+	content := readContainerFileWithExec(c, id, "/etc/hosts")
168 167
 
169 168
 	getIP := func(hosts []byte, hostname string) string {
170 169
 		re := regexp.MustCompile(fmt.Sprintf(`(\S*)\t%s`, regexp.QuoteMeta(hostname)))
... ...
@@ -181,8 +177,7 @@ func (s *DockerSuite) TestLinksUpdateOnRestart(c *check.C) {
181 181
 	dockerCmd(c, "restart", "one")
182 182
 	realIP = inspectField(c, "one", "NetworkSettings.Networks.bridge.IPAddress")
183 183
 
184
-	content, err = readContainerFileWithExec(id, "/etc/hosts")
185
-	c.Assert(err, checker.IsNil, check.Commentf("content: %s", string(content)))
184
+	content = readContainerFileWithExec(c, id, "/etc/hosts")
186 185
 	ip = getIP(content, "one")
187 186
 	c.Assert(ip, checker.Equals, realIP)
188 187
 
... ...
@@ -869,18 +869,15 @@ func (s *DockerNetworkSuite) TestDockerNetworkAnonymousEndpoint(c *check.C) {
869 869
 	out, _ := dockerCmd(c, "run", "-d", "--net", cstmBridgeNw, "busybox", "top")
870 870
 	cid1 := strings.TrimSpace(out)
871 871
 
872
-	hosts1, err := readContainerFileWithExec(cid1, hostsFile)
873
-	c.Assert(err, checker.IsNil)
872
+	hosts1 := readContainerFileWithExec(c, cid1, hostsFile)
874 873
 
875 874
 	out, _ = dockerCmd(c, "run", "-d", "--net", cstmBridgeNw, "busybox", "top")
876 875
 	cid2 := strings.TrimSpace(out)
877 876
 
878
-	hosts2, err := readContainerFileWithExec(cid2, hostsFile)
879
-	c.Assert(err, checker.IsNil)
877
+	hosts2 := readContainerFileWithExec(c, cid2, hostsFile)
880 878
 
881 879
 	// verify first container etc/hosts file has not changed
882
-	hosts1post, err := readContainerFileWithExec(cid1, hostsFile)
883
-	c.Assert(err, checker.IsNil)
880
+	hosts1post := readContainerFileWithExec(c, cid1, hostsFile)
884 881
 	c.Assert(string(hosts1), checker.Equals, string(hosts1post),
885 882
 		check.Commentf("Unexpected %s change on anonymous container creation", hostsFile))
886 883
 
... ...
@@ -891,11 +888,8 @@ func (s *DockerNetworkSuite) TestDockerNetworkAnonymousEndpoint(c *check.C) {
891 891
 
892 892
 	dockerCmd(c, "network", "connect", cstmBridgeNw1, cid2)
893 893
 
894
-	hosts2, err = readContainerFileWithExec(cid2, hostsFile)
895
-	c.Assert(err, checker.IsNil)
896
-
897
-	hosts1post, err = readContainerFileWithExec(cid1, hostsFile)
898
-	c.Assert(err, checker.IsNil)
894
+	hosts2 = readContainerFileWithExec(c, cid2, hostsFile)
895
+	hosts1post = readContainerFileWithExec(c, cid1, hostsFile)
899 896
 	c.Assert(string(hosts1), checker.Equals, string(hosts1post),
900 897
 		check.Commentf("Unexpected %s change on container connect", hostsFile))
901 898
 
... ...
@@ -910,18 +904,16 @@ func (s *DockerNetworkSuite) TestDockerNetworkAnonymousEndpoint(c *check.C) {
910 910
 
911 911
 	// Stop named container and verify first two containers' etc/hosts file hasn't changed
912 912
 	dockerCmd(c, "stop", cid3)
913
-	hosts1post, err = readContainerFileWithExec(cid1, hostsFile)
914
-	c.Assert(err, checker.IsNil)
913
+	hosts1post = readContainerFileWithExec(c, cid1, hostsFile)
915 914
 	c.Assert(string(hosts1), checker.Equals, string(hosts1post),
916 915
 		check.Commentf("Unexpected %s change on name container creation", hostsFile))
917 916
 
918
-	hosts2post, err := readContainerFileWithExec(cid2, hostsFile)
919
-	c.Assert(err, checker.IsNil)
917
+	hosts2post := readContainerFileWithExec(c, cid2, hostsFile)
920 918
 	c.Assert(string(hosts2), checker.Equals, string(hosts2post),
921 919
 		check.Commentf("Unexpected %s change on name container creation", hostsFile))
922 920
 
923 921
 	// verify that container 1 and 2 can't ping the named container now
924
-	_, _, err = dockerCmdWithError("exec", cid1, "ping", "-c", "1", cName)
922
+	_, _, err := dockerCmdWithError("exec", cid1, "ping", "-c", "1", cName)
925 923
 	c.Assert(err, check.NotNil)
926 924
 	_, _, err = dockerCmdWithError("exec", cid2, "ping", "-c", "1", cName)
927 925
 	c.Assert(err, check.NotNil)
... ...
@@ -15,8 +15,7 @@ func (s *DockerSuite) TestPause(c *check.C) {
15 15
 	runSleepingContainer(c, "-d", "--name", name)
16 16
 
17 17
 	dockerCmd(c, "pause", name)
18
-	pausedContainers, err := getPausedContainers()
19
-	c.Assert(err, checker.IsNil)
18
+	pausedContainers := getPausedContainers(c)
20 19
 	c.Assert(len(pausedContainers), checker.Equals, 1)
21 20
 
22 21
 	dockerCmd(c, "unpause", name)
... ...
@@ -41,8 +40,7 @@ func (s *DockerSuite) TestPauseMultipleContainers(c *check.C) {
41 41
 		runSleepingContainer(c, "-d", "--name", name)
42 42
 	}
43 43
 	dockerCmd(c, append([]string{"pause"}, containers...)...)
44
-	pausedContainers, err := getPausedContainers()
45
-	c.Assert(err, checker.IsNil)
44
+	pausedContainers := getPausedContainers(c)
46 45
 	c.Assert(len(pausedContainers), checker.Equals, len(containers))
47 46
 
48 47
 	dockerCmd(c, append([]string{"unpause"}, containers...)...)
... ...
@@ -4,7 +4,6 @@ import (
4 4
 	"fmt"
5 5
 	"io/ioutil"
6 6
 	"os"
7
-	"os/exec"
8 7
 	"path/filepath"
9 8
 	"sort"
10 9
 	"strconv"
... ...
@@ -159,12 +158,11 @@ func (s *DockerSuite) TestPsListContainersSize(c *check.C) {
159 159
 	dockerCmd(c, "run", "--name", name, "busybox", "sh", "-c", "echo 1 > test")
160 160
 	id := getIDByName(c, name)
161 161
 
162
-	runCmd := exec.Command(dockerBinary, "ps", "-s", "-n=1")
163
-	var out string
162
+	var result *icmd.Result
164 163
 
165 164
 	wait := make(chan struct{})
166 165
 	go func() {
167
-		out, _, err = runCommandWithOutput(runCmd)
166
+		result = icmd.RunCommand(dockerBinary, "ps", "-s", "-n=1")
168 167
 		close(wait)
169 168
 	}()
170 169
 	select {
... ...
@@ -172,8 +170,8 @@ func (s *DockerSuite) TestPsListContainersSize(c *check.C) {
172 172
 	case <-time.After(3 * time.Second):
173 173
 		c.Fatalf("Calling \"docker ps -s\" timed out!")
174 174
 	}
175
-	c.Assert(err, checker.IsNil)
176
-	lines := strings.Split(strings.Trim(out, "\n "), "\n")
175
+	result.Assert(c, icmd.Success)
176
+	lines := strings.Split(strings.Trim(result.Combined(), "\n "), "\n")
177 177
 	c.Assert(lines, checker.HasLen, 2, check.Commentf("Expected 2 lines for 'ps -s -n=1' output, got %d", len(lines)))
178 178
 	sizeIndex := strings.Index(lines[0], "SIZE")
179 179
 	idIndex := strings.Index(lines[0], "CONTAINER ID")
... ...
@@ -1464,10 +1464,7 @@ func (s *DockerSuite) TestRunResolvconfUpdate(c *check.C) {
1464 1464
 	dockerCmd(c, "start", "first")
1465 1465
 
1466 1466
 	// check for update in container
1467
-	containerResolv, err := readContainerFile(containerID1, "resolv.conf")
1468
-	if err != nil {
1469
-		c.Fatal(err)
1470
-	}
1467
+	containerResolv := readContainerFile(c, containerID1, "resolv.conf")
1471 1468
 	if !bytes.Equal(containerResolv, bytesResolvConf) {
1472 1469
 		c.Fatalf("Restarted container does not have updated resolv.conf; expected %q, got %q", tmpResolvConf, string(containerResolv))
1473 1470
 	}
... ...
@@ -1490,11 +1487,7 @@ func (s *DockerSuite) TestRunResolvconfUpdate(c *check.C) {
1490 1490
 	dockerCmd(c, "start", "second")
1491 1491
 
1492 1492
 	// check for update in container
1493
-	containerResolv, err = readContainerFile(containerID2, "resolv.conf")
1494
-	if err != nil {
1495
-		c.Fatal(err)
1496
-	}
1497
-
1493
+	containerResolv = readContainerFile(c, containerID2, "resolv.conf")
1498 1494
 	if bytes.Equal(containerResolv, resolvConfSystem) {
1499 1495
 		c.Fatalf("Container's resolv.conf should not have been updated with host resolv.conf: %q", string(containerResolv))
1500 1496
 	}
... ...
@@ -1509,11 +1502,7 @@ func (s *DockerSuite) TestRunResolvconfUpdate(c *check.C) {
1509 1509
 	}
1510 1510
 
1511 1511
 	// check for update in container
1512
-	containerResolv, err = readContainerFile(runningContainerID, "resolv.conf")
1513
-	if err != nil {
1514
-		c.Fatal(err)
1515
-	}
1516
-
1512
+	containerResolv = readContainerFile(c, runningContainerID, "resolv.conf")
1517 1513
 	if bytes.Equal(containerResolv, bytesResolvConf) {
1518 1514
 		c.Fatalf("Running container should not have updated resolv.conf; expected %q, got %q", string(resolvConfSystem), string(containerResolv))
1519 1515
 	}
... ...
@@ -1523,10 +1512,7 @@ func (s *DockerSuite) TestRunResolvconfUpdate(c *check.C) {
1523 1523
 	dockerCmd(c, "restart", runningContainerID)
1524 1524
 
1525 1525
 	// check for update in container
1526
-	containerResolv, err = readContainerFile(runningContainerID, "resolv.conf")
1527
-	if err != nil {
1528
-		c.Fatal(err)
1529
-	}
1526
+	containerResolv = readContainerFile(c, runningContainerID, "resolv.conf")
1530 1527
 	if !bytes.Equal(containerResolv, bytesResolvConf) {
1531 1528
 		c.Fatalf("Restarted container should have updated resolv.conf; expected %q, got %q", string(bytesResolvConf), string(containerResolv))
1532 1529
 	}
... ...
@@ -1545,11 +1531,7 @@ func (s *DockerSuite) TestRunResolvconfUpdate(c *check.C) {
1545 1545
 
1546 1546
 	// our first exited container ID should have been updated, but with default DNS
1547 1547
 	// after the cleanup of resolv.conf found only a localhost nameserver:
1548
-	containerResolv, err = readContainerFile(containerID1, "resolv.conf")
1549
-	if err != nil {
1550
-		c.Fatal(err)
1551
-	}
1552
-
1548
+	containerResolv = readContainerFile(c, containerID1, "resolv.conf")
1553 1549
 	expected := "\nnameserver 8.8.8.8\nnameserver 8.8.4.4\n"
1554 1550
 	if !bytes.Equal(containerResolv, []byte(expected)) {
1555 1551
 		c.Fatalf("Container does not have cleaned/replaced DNS in resolv.conf; expected %q, got %q", expected, string(containerResolv))
... ...
@@ -1582,10 +1564,7 @@ func (s *DockerSuite) TestRunResolvconfUpdate(c *check.C) {
1582 1582
 	dockerCmd(c, "start", "third")
1583 1583
 
1584 1584
 	// check for update in container
1585
-	containerResolv, err = readContainerFile(containerID3, "resolv.conf")
1586
-	if err != nil {
1587
-		c.Fatal(err)
1588
-	}
1585
+	containerResolv = readContainerFile(c, containerID3, "resolv.conf")
1589 1586
 	if !bytes.Equal(containerResolv, bytesResolvConf) {
1590 1587
 		c.Fatalf("Stopped container does not have updated resolv.conf; expected\n%q\n got\n%q", tmpResolvConf, string(containerResolv))
1591 1588
 	}
... ...
@@ -2840,11 +2819,7 @@ func (s *DockerSuite) TestRunContainerWithRmFlagExitCodeNotEqualToZero(c *check.
2840 2840
 		c.Fatal("Expected docker run to fail", out, err)
2841 2841
 	}
2842 2842
 
2843
-	out, err = getAllContainers()
2844
-	if err != nil {
2845
-		c.Fatal(out, err)
2846
-	}
2847
-
2843
+	out = getAllContainers(c)
2848 2844
 	if out != "" {
2849 2845
 		c.Fatal("Expected not to have containers", out)
2850 2846
 	}
... ...
@@ -2857,11 +2832,7 @@ func (s *DockerSuite) TestRunContainerWithRmFlagCannotStartContainer(c *check.C)
2857 2857
 		c.Fatal("Expected docker run to fail", out, err)
2858 2858
 	}
2859 2859
 
2860
-	out, err = getAllContainers()
2861
-	if err != nil {
2862
-		c.Fatal(out, err)
2863
-	}
2864
-
2860
+	out = getAllContainers(c)
2865 2861
 	if out != "" {
2866 2862
 		c.Fatal("Expected not to have containers", out)
2867 2863
 	}
... ...
@@ -15,6 +15,7 @@ import (
15 15
 
16 16
 	"github.com/docker/docker/integration-cli/checker"
17 17
 	"github.com/docker/docker/pkg/testutil"
18
+	icmd "github.com/docker/docker/pkg/testutil/cmd"
18 19
 	"github.com/go-check/check"
19 20
 	"github.com/opencontainers/go-digest"
20 21
 )
... ...
@@ -37,10 +38,12 @@ func (s *DockerSuite) TestSaveXzAndLoadRepoStdout(c *check.C) {
37 37
 	c.Assert(err, checker.IsNil, check.Commentf("failed to save repo: %v %v", out, err))
38 38
 	deleteImages(repoName)
39 39
 
40
-	loadCmd := exec.Command(dockerBinary, "load")
41
-	loadCmd.Stdin = strings.NewReader(repoTarball)
42
-	out, _, err = runCommandWithOutput(loadCmd)
43
-	c.Assert(err, checker.NotNil, check.Commentf("expected error, but succeeded with no error and output: %v", out))
40
+	icmd.RunCmd(icmd.Cmd{
41
+		Command: []string{dockerBinary, "load"},
42
+		Stdin:   strings.NewReader(repoTarball),
43
+	}).Assert(c, icmd.Expected{
44
+		ExitCode: 1,
45
+	})
44 46
 
45 47
 	after, _, err := dockerCmdWithError("inspect", repoName)
46 48
 	c.Assert(err, checker.NotNil, check.Commentf("the repo should not exist: %v", after))
... ...
@@ -65,10 +68,12 @@ func (s *DockerSuite) TestSaveXzGzAndLoadRepoStdout(c *check.C) {
65 65
 
66 66
 	deleteImages(repoName)
67 67
 
68
-	loadCmd := exec.Command(dockerBinary, "load")
69
-	loadCmd.Stdin = strings.NewReader(out)
70
-	out, _, err = runCommandWithOutput(loadCmd)
71
-	c.Assert(err, checker.NotNil, check.Commentf("expected error, but succeeded with no error and output: %v", out))
68
+	icmd.RunCmd(icmd.Cmd{
69
+		Command: []string{dockerBinary, "load"},
70
+		Stdin:   strings.NewReader(out),
71
+	}).Assert(c, icmd.Expected{
72
+		ExitCode: 1,
73
+	})
72 74
 
73 75
 	after, _, err := dockerCmdWithError("inspect", repoName)
74 76
 	c.Assert(err, checker.NotNil, check.Commentf("the repo should not exist: %v", after))
... ...
@@ -41,11 +41,10 @@ func (s *DockerSuite) TestSaveAndLoadRepoStdout(c *check.C) {
41 41
 
42 42
 	deleteImages(repoName)
43 43
 
44
-	loadCmd := exec.Command(dockerBinary, "load")
45
-	loadCmd.Stdin = tmpFile
46
-
47
-	out, _, err := runCommandWithOutput(loadCmd)
48
-	c.Assert(err, check.IsNil, check.Commentf(out))
44
+	icmd.RunCmd(icmd.Cmd{
45
+		Command: []string{dockerBinary, "load"},
46
+		Stdin:   tmpFile,
47
+	}).Assert(c, icmd.Success)
49 48
 
50 49
 	after := inspectField(c, repoName, "Id")
51 50
 	after = strings.TrimRight(after, "\n")
... ...
@@ -67,7 +66,7 @@ func (s *DockerSuite) TestSaveAndLoadRepoStdout(c *check.C) {
67 67
 
68 68
 	n, err := pty.Read(buf)
69 69
 	c.Assert(err, check.IsNil) //could not read tty output
70
-	c.Assert(string(buf[:n]), checker.Contains, "Cowardly refusing", check.Commentf("help output is not being yielded", out))
70
+	c.Assert(string(buf[:n]), checker.Contains, "Cowardly refusing", check.Commentf("help output is not being yielded"))
71 71
 }
72 72
 
73 73
 func (s *DockerSuite) TestSaveAndLoadWithProgressBar(c *check.C) {
... ...
@@ -17,6 +17,7 @@ import (
17 17
 	"github.com/docker/docker/api/types/swarm"
18 18
 	"github.com/docker/docker/integration-cli/checker"
19 19
 	"github.com/docker/docker/integration-cli/daemon"
20
+	icmd "github.com/docker/docker/pkg/testutil/cmd"
20 21
 	"github.com/docker/libnetwork/driverapi"
21 22
 	"github.com/docker/libnetwork/ipamapi"
22 23
 	remoteipam "github.com/docker/libnetwork/ipams/remote/api"
... ...
@@ -832,8 +833,7 @@ func checkSwarmLockedToUnlocked(c *check.C, d *daemon.Swarm, unlockKey string) {
832 832
 		// it must not have updated to be unlocked in time - unlock, wait 3 seconds, and try again
833 833
 		cmd := d.Command("swarm", "unlock")
834 834
 		cmd.Stdin = bytes.NewBufferString(unlockKey)
835
-		out, err := cmd.CombinedOutput()
836
-		c.Assert(err, checker.IsNil, check.Commentf("out: %v", string(out)))
835
+		icmd.RunCmd(cmd).Assert(c, icmd.Success)
837 836
 
838 837
 		c.Assert(getNodeStatus(c, d), checker.Equals, swarm.LocalNodeStateActive)
839 838
 
... ...
@@ -860,22 +860,24 @@ func (s *DockerSwarmSuite) TestUnlockEngineAndUnlockedSwarm(c *check.C) {
860 860
 
861 861
 	// unlocking a normal engine should return an error - it does not even ask for the key
862 862
 	cmd := d.Command("swarm", "unlock")
863
-	outs, err := cmd.CombinedOutput()
864
-
865
-	c.Assert(err, checker.NotNil, check.Commentf("out: %v", string(outs)))
866
-	c.Assert(string(outs), checker.Contains, "Error: This node is not part of a swarm")
867
-	c.Assert(string(outs), checker.Not(checker.Contains), "Please enter unlock key")
863
+	result := icmd.RunCmd(cmd)
864
+	result.Assert(c, icmd.Expected{
865
+		ExitCode: 1,
866
+	})
867
+	c.Assert(result.Combined(), checker.Contains, "Error: This node is not part of a swarm")
868
+	c.Assert(result.Combined(), checker.Not(checker.Contains), "Please enter unlock key")
868 869
 
869
-	_, err = d.Cmd("swarm", "init")
870
+	_, err := d.Cmd("swarm", "init")
870 871
 	c.Assert(err, checker.IsNil)
871 872
 
872 873
 	// unlocking an unlocked swarm should return an error - it does not even ask for the key
873 874
 	cmd = d.Command("swarm", "unlock")
874
-	outs, err = cmd.CombinedOutput()
875
-
876
-	c.Assert(err, checker.NotNil, check.Commentf("out: %v", string(outs)))
877
-	c.Assert(string(outs), checker.Contains, "Error: swarm is not locked")
878
-	c.Assert(string(outs), checker.Not(checker.Contains), "Please enter unlock key")
875
+	result = icmd.RunCmd(cmd)
876
+	result.Assert(c, icmd.Expected{
877
+		ExitCode: 1,
878
+	})
879
+	c.Assert(result.Combined(), checker.Contains, "Error: swarm is not locked")
880
+	c.Assert(result.Combined(), checker.Not(checker.Contains), "Please enter unlock key")
879 881
 }
880 882
 
881 883
 func (s *DockerSwarmSuite) TestSwarmInitLocked(c *check.C) {
... ...
@@ -907,16 +909,16 @@ func (s *DockerSwarmSuite) TestSwarmInitLocked(c *check.C) {
907 907
 
908 908
 	cmd := d.Command("swarm", "unlock")
909 909
 	cmd.Stdin = bytes.NewBufferString("wrong-secret-key")
910
-	out, err := cmd.CombinedOutput()
911
-	c.Assert(err, checker.NotNil, check.Commentf("out: %v", string(out)))
912
-	c.Assert(string(out), checker.Contains, "invalid key")
910
+	icmd.RunCmd(cmd).Assert(c, icmd.Expected{
911
+		ExitCode: 1,
912
+		Err:      "invalid key",
913
+	})
913 914
 
914 915
 	c.Assert(getNodeStatus(c, d), checker.Equals, swarm.LocalNodeStateLocked)
915 916
 
916 917
 	cmd = d.Command("swarm", "unlock")
917 918
 	cmd.Stdin = bytes.NewBufferString(unlockKey)
918
-	out, err = cmd.CombinedOutput()
919
-	c.Assert(err, checker.IsNil, check.Commentf("out: %v", string(out)))
919
+	icmd.RunCmd(cmd).Assert(c, icmd.Success)
920 920
 
921 921
 	c.Assert(getNodeStatus(c, d), checker.Equals, swarm.LocalNodeStateActive)
922 922
 
... ...
@@ -1007,8 +1009,7 @@ func (s *DockerSwarmSuite) TestSwarmLockUnlockCluster(c *check.C) {
1007 1007
 
1008 1008
 		cmd := d.Command("swarm", "unlock")
1009 1009
 		cmd.Stdin = bytes.NewBufferString(unlockKey)
1010
-		out, err := cmd.CombinedOutput()
1011
-		c.Assert(err, checker.IsNil, check.Commentf("out: %v", string(out)))
1010
+		icmd.RunCmd(cmd).Assert(c, icmd.Success)
1012 1011
 		c.Assert(getNodeStatus(c, d), checker.Equals, swarm.LocalNodeStateActive)
1013 1012
 	}
1014 1013
 
... ...
@@ -1034,8 +1035,7 @@ func (s *DockerSwarmSuite) TestSwarmLockUnlockCluster(c *check.C) {
1034 1034
 	// unlock it
1035 1035
 	cmd := d2.Command("swarm", "unlock")
1036 1036
 	cmd.Stdin = bytes.NewBufferString(unlockKey)
1037
-	out, err := cmd.CombinedOutput()
1038
-	c.Assert(err, checker.IsNil, check.Commentf("out: %v", string(out)))
1037
+	icmd.RunCmd(cmd).Assert(c, icmd.Success)
1039 1038
 	c.Assert(getNodeStatus(c, d2), checker.Equals, swarm.LocalNodeStateActive)
1040 1039
 
1041 1040
 	// once it's caught up, d2 is set to not be locked
... ...
@@ -1088,8 +1088,7 @@ func (s *DockerSwarmSuite) TestSwarmJoinPromoteLocked(c *check.C) {
1088 1088
 
1089 1089
 		cmd := d.Command("swarm", "unlock")
1090 1090
 		cmd.Stdin = bytes.NewBufferString(unlockKey)
1091
-		out, err := cmd.CombinedOutput()
1092
-		c.Assert(err, checker.IsNil, check.Commentf("out: %v", string(out)))
1091
+		icmd.RunCmd(cmd).Assert(c, icmd.Success)
1093 1092
 		c.Assert(getNodeStatus(c, d), checker.Equals, swarm.LocalNodeStateActive)
1094 1093
 	}
1095 1094
 
... ...
@@ -1159,9 +1158,9 @@ func (s *DockerSwarmSuite) TestSwarmRotateUnlockKey(c *check.C) {
1159 1159
 
1160 1160
 		cmd := d.Command("swarm", "unlock")
1161 1161
 		cmd.Stdin = bytes.NewBufferString(unlockKey)
1162
-		out, err := cmd.CombinedOutput()
1162
+		result := icmd.RunCmd(cmd)
1163 1163
 
1164
-		if err == nil {
1164
+		if result.Error == nil {
1165 1165
 			// On occasion, the daemon may not have finished
1166 1166
 			// rotating the KEK before restarting. The test is
1167 1167
 			// intentionally written to explore this behavior.
... ...
@@ -1176,18 +1175,19 @@ func (s *DockerSwarmSuite) TestSwarmRotateUnlockKey(c *check.C) {
1176 1176
 
1177 1177
 			cmd = d.Command("swarm", "unlock")
1178 1178
 			cmd.Stdin = bytes.NewBufferString(unlockKey)
1179
-			out, err = cmd.CombinedOutput()
1179
+			result = icmd.RunCmd(cmd)
1180 1180
 		}
1181
-		c.Assert(err, checker.NotNil, check.Commentf("out: %v", string(out)))
1182
-		c.Assert(string(out), checker.Contains, "invalid key")
1181
+		result.Assert(c, icmd.Expected{
1182
+			ExitCode: 1,
1183
+			Err:      "invalid key",
1184
+		})
1183 1185
 
1184 1186
 		outs, _ = d.Cmd("node", "ls")
1185 1187
 		c.Assert(outs, checker.Contains, "Swarm is encrypted and needs to be unlocked")
1186 1188
 
1187 1189
 		cmd = d.Command("swarm", "unlock")
1188 1190
 		cmd.Stdin = bytes.NewBufferString(newUnlockKey)
1189
-		out, err = cmd.CombinedOutput()
1190
-		c.Assert(err, checker.IsNil, check.Commentf("out: %v", string(out)))
1191
+		icmd.RunCmd(cmd).Assert(c, icmd.Success)
1191 1192
 
1192 1193
 		c.Assert(getNodeStatus(c, d), checker.Equals, swarm.LocalNodeStateActive)
1193 1194
 
... ...
@@ -1245,9 +1245,9 @@ func (s *DockerSwarmSuite) TestSwarmClusterRotateUnlockKey(c *check.C) {
1245 1245
 
1246 1246
 			cmd := d.Command("swarm", "unlock")
1247 1247
 			cmd.Stdin = bytes.NewBufferString(unlockKey)
1248
-			out, err := cmd.CombinedOutput()
1248
+			result := icmd.RunCmd(cmd)
1249 1249
 
1250
-			if err == nil {
1250
+			if result.Error == nil {
1251 1251
 				// On occasion, the daemon may not have finished
1252 1252
 				// rotating the KEK before restarting. The test is
1253 1253
 				// intentionally written to explore this behavior.
... ...
@@ -1262,18 +1262,19 @@ func (s *DockerSwarmSuite) TestSwarmClusterRotateUnlockKey(c *check.C) {
1262 1262
 
1263 1263
 				cmd = d.Command("swarm", "unlock")
1264 1264
 				cmd.Stdin = bytes.NewBufferString(unlockKey)
1265
-				out, err = cmd.CombinedOutput()
1265
+				result = icmd.RunCmd(cmd)
1266 1266
 			}
1267
-			c.Assert(err, checker.NotNil, check.Commentf("out: %v", string(out)))
1268
-			c.Assert(string(out), checker.Contains, "invalid key")
1267
+			result.Assert(c, icmd.Expected{
1268
+				ExitCode: 1,
1269
+				Err:      "invalid key",
1270
+			})
1269 1271
 
1270 1272
 			outs, _ = d.Cmd("node", "ls")
1271 1273
 			c.Assert(outs, checker.Contains, "Swarm is encrypted and needs to be unlocked")
1272 1274
 
1273 1275
 			cmd = d.Command("swarm", "unlock")
1274 1276
 			cmd.Stdin = bytes.NewBufferString(newUnlockKey)
1275
-			out, err = cmd.CombinedOutput()
1276
-			c.Assert(err, checker.IsNil, check.Commentf("out: %v", string(out)))
1277
+			icmd.RunCmd(cmd).Assert(c, icmd.Success)
1277 1278
 
1278 1279
 			c.Assert(getNodeStatus(c, d), checker.Equals, swarm.LocalNodeStateActive)
1279 1280
 
... ...
@@ -1308,8 +1309,7 @@ func (s *DockerSwarmSuite) TestSwarmAlternateLockUnlock(c *check.C) {
1308 1308
 
1309 1309
 		cmd := d.Command("swarm", "unlock")
1310 1310
 		cmd.Stdin = bytes.NewBufferString(unlockKey)
1311
-		out, err := cmd.CombinedOutput()
1312
-		c.Assert(err, checker.IsNil, check.Commentf("out: %v", string(out)))
1311
+		icmd.RunCmd(cmd).Assert(c, icmd.Success)
1313 1312
 
1314 1313
 		c.Assert(getNodeStatus(c, d), checker.Equals, swarm.LocalNodeStateActive)
1315 1314
 
... ...
@@ -1410,12 +1410,11 @@ func (s *DockerTrustedSwarmSuite) TestTrustedServiceCreate(c *check.C) {
1410 1410
 
1411 1411
 	name := "trusted"
1412 1412
 	serviceCmd := d.Command("-D", "service", "create", "--name", name, repoName, "top")
1413
-	trustedExecCmd(serviceCmd)
1414
-	out, _, err := runCommandWithOutput(serviceCmd)
1415
-	c.Assert(err, checker.IsNil, check.Commentf(out))
1416
-	c.Assert(out, checker.Contains, "resolved image tag to", check.Commentf(out))
1413
+	icmd.RunCmd(serviceCmd, trustedCmd).Assert(c, icmd.Expected{
1414
+		Err: "resolved image tag to",
1415
+	})
1417 1416
 
1418
-	out, err = d.Cmd("service", "inspect", "--pretty", name)
1417
+	out, err := d.Cmd("service", "inspect", "--pretty", name)
1419 1418
 	c.Assert(err, checker.IsNil, check.Commentf(out))
1420 1419
 	c.Assert(out, checker.Contains, repoName+"@", check.Commentf(out))
1421 1420
 
... ...
@@ -1429,11 +1428,10 @@ func (s *DockerTrustedSwarmSuite) TestTrustedServiceCreate(c *check.C) {
1429 1429
 
1430 1430
 	name = "untrusted"
1431 1431
 	serviceCmd = d.Command("service", "create", "--name", name, repoName, "top")
1432
-	trustedExecCmd(serviceCmd)
1433
-	out, _, err = runCommandWithOutput(serviceCmd)
1434
-
1435
-	c.Assert(err, check.NotNil, check.Commentf(out))
1436
-	c.Assert(string(out), checker.Contains, "Error: remote trust data does not exist", check.Commentf(out))
1432
+	icmd.RunCmd(serviceCmd, trustedCmd).Assert(c, icmd.Expected{
1433
+		ExitCode: 1,
1434
+		Err:      "Error: remote trust data does not exist",
1435
+	})
1437 1436
 
1438 1437
 	out, err = d.Cmd("service", "inspect", "--pretty", name)
1439 1438
 	c.Assert(err, checker.NotNil, check.Commentf(out))
... ...
@@ -1458,10 +1456,9 @@ func (s *DockerTrustedSwarmSuite) TestTrustedServiceUpdate(c *check.C) {
1458 1458
 	c.Assert(out, check.Not(checker.Contains), repoName+"@", check.Commentf(out))
1459 1459
 
1460 1460
 	serviceCmd := d.Command("-D", "service", "update", "--image", repoName, name)
1461
-	trustedExecCmd(serviceCmd)
1462
-	out, _, err = runCommandWithOutput(serviceCmd)
1463
-	c.Assert(err, checker.IsNil, check.Commentf(out))
1464
-	c.Assert(out, checker.Contains, "resolved image tag to", check.Commentf(out))
1461
+	icmd.RunCmd(serviceCmd, trustedCmd).Assert(c, icmd.Expected{
1462
+		Err: "resolved image tag to",
1463
+	})
1465 1464
 
1466 1465
 	out, err = d.Cmd("service", "inspect", "--pretty", name)
1467 1466
 	c.Assert(err, checker.IsNil, check.Commentf(out))
... ...
@@ -1476,11 +1473,10 @@ func (s *DockerTrustedSwarmSuite) TestTrustedServiceUpdate(c *check.C) {
1476 1476
 	dockerCmd(c, "rmi", repoName)
1477 1477
 
1478 1478
 	serviceCmd = d.Command("service", "update", "--image", repoName, name)
1479
-	trustedExecCmd(serviceCmd)
1480
-	out, _, err = runCommandWithOutput(serviceCmd)
1481
-
1482
-	c.Assert(err, check.NotNil, check.Commentf(out))
1483
-	c.Assert(string(out), checker.Contains, "Error: remote trust data does not exist", check.Commentf(out))
1479
+	icmd.RunCmd(serviceCmd, trustedCmd).Assert(c, icmd.Expected{
1480
+		ExitCode: 1,
1481
+		Err:      "Error: remote trust data does not exist",
1482
+	})
1484 1483
 }
1485 1484
 
1486 1485
 // Test case for issue #27866, which did not allow NW name that is the prefix of a swarm NW ID.
... ...
@@ -52,22 +52,16 @@ func deleteContainer(ignoreNoSuchContainer bool, container ...string) error {
52 52
 	return result.Compare(icmd.Success)
53 53
 }
54 54
 
55
-func getAllContainers() (string, error) {
56
-	getContainersCmd := exec.Command(dockerBinary, "ps", "-q", "-a")
57
-	out, exitCode, err := runCommandWithOutput(getContainersCmd)
58
-	if exitCode != 0 && err == nil {
59
-		err = fmt.Errorf("failed to get a list of containers: %v\n", out)
60
-	}
61
-
62
-	return out, err
55
+func getAllContainers(c *check.C) string {
56
+	result := icmd.RunCommand(dockerBinary, "ps", "-q", "-a")
57
+	result.Assert(c, icmd.Success)
58
+	return result.Combined()
63 59
 }
64 60
 
65 61
 func deleteAllContainers(c *check.C) {
66
-	containers, err := getAllContainers()
67
-	c.Assert(err, checker.IsNil, check.Commentf("containers: %v", containers))
68
-
62
+	containers := getAllContainers(c)
69 63
 	if containers != "" {
70
-		err = deleteContainer(true, strings.Split(strings.TrimSpace(containers), "\n")...)
64
+		err := deleteContainer(true, strings.Split(strings.TrimSpace(containers), "\n")...)
71 65
 		c.Assert(err, checker.IsNil)
72 66
 	}
73 67
 }
... ...
@@ -202,17 +196,10 @@ func deleteAllImages(c *check.C) {
202 202
 	}
203 203
 }
204 204
 
205
-func getPausedContainers() ([]string, error) {
206
-	getPausedContainersCmd := exec.Command(dockerBinary, "ps", "-f", "status=paused", "-q", "-a")
207
-	out, exitCode, err := runCommandWithOutput(getPausedContainersCmd)
208
-	if exitCode != 0 && err == nil {
209
-		err = fmt.Errorf("failed to get a list of paused containers: %v\n", out)
210
-	}
211
-	if err != nil {
212
-		return nil, err
213
-	}
214
-
215
-	return strings.Fields(out), nil
205
+func getPausedContainers(c *check.C) []string {
206
+	result := icmd.RunCommand(dockerBinary, "ps", "-f", "status=paused", "-q", "-a")
207
+	result.Assert(c, icmd.Success)
208
+	return strings.Fields(result.Combined())
216 209
 }
217 210
 
218 211
 func unpauseContainer(c *check.C, container string) {
... ...
@@ -220,8 +207,7 @@ func unpauseContainer(c *check.C, container string) {
220 220
 }
221 221
 
222 222
 func unpauseAllContainers(c *check.C) {
223
-	containers, err := getPausedContainers()
224
-	c.Assert(err, checker.IsNil, check.Commentf("containers: %v", containers))
223
+	containers := getPausedContainers(c)
225 224
 	for _, value := range containers {
226 225
 		unpauseContainer(c, value)
227 226
 	}
... ...
@@ -310,29 +296,24 @@ func findContainerIP(c *check.C, id string, network string) string {
310 310
 	return strings.Trim(out, " \r\n'")
311 311
 }
312 312
 
313
-func getContainerCount() (int, error) {
313
+func getContainerCount(c *check.C) int {
314 314
 	const containers = "Containers:"
315 315
 
316
-	cmd := exec.Command(dockerBinary, "info")
317
-	out, _, err := runCommandWithOutput(cmd)
318
-	if err != nil {
319
-		return 0, err
320
-	}
316
+	result := icmd.RunCommand(dockerBinary, "info")
317
+	result.Assert(c, icmd.Success)
321 318
 
322
-	lines := strings.Split(out, "\n")
319
+	lines := strings.Split(result.Combined(), "\n")
323 320
 	for _, line := range lines {
324 321
 		if strings.Contains(line, containers) {
325 322
 			output := strings.TrimSpace(line)
326 323
 			output = strings.TrimLeft(output, containers)
327 324
 			output = strings.Trim(output, " ")
328 325
 			containerCount, err := strconv.Atoi(output)
329
-			if err != nil {
330
-				return 0, err
331
-			}
332
-			return containerCount, nil
326
+			c.Assert(err, checker.IsNil)
327
+			return containerCount
333 328
 		}
334 329
 	}
335
-	return 0, fmt.Errorf("couldn't find the Container count in the output")
330
+	return 0
336 331
 }
337 332
 
338 333
 // FakeContext creates directories that can be used as a build context
... ...
@@ -626,19 +607,16 @@ func inspectMountPointJSON(j, destination string) (types.MountPoint, error) {
626 626
 	return *m, nil
627 627
 }
628 628
 
629
-func inspectImage(name, filter string) (string, error) {
629
+func inspectImage(c *check.C, name, filter string) string {
630 630
 	args := []string{"inspect", "--type", "image"}
631 631
 	if filter != "" {
632 632
 		format := fmt.Sprintf("{{%s}}", filter)
633 633
 		args = append(args, "-f", format)
634 634
 	}
635 635
 	args = append(args, name)
636
-	inspectCmd := exec.Command(dockerBinary, args...)
637
-	out, exitCode, err := runCommandWithOutput(inspectCmd)
638
-	if err != nil || exitCode != 0 {
639
-		return "", fmt.Errorf("failed to inspect %s: %s", name, out)
640
-	}
641
-	return strings.TrimSpace(out), nil
636
+	result := icmd.RunCommand(dockerBinary, args...)
637
+	result.Assert(c, icmd.Success)
638
+	return strings.TrimSpace(result.Combined())
642 639
 }
643 640
 
644 641
 func getIDByName(c *check.C, name string) string {
... ...
@@ -864,39 +842,30 @@ func containerStorageFile(containerID, basename string) string {
864 864
 }
865 865
 
866 866
 // docker commands that use this function must be run with the '-d' switch.
867
-func runCommandAndReadContainerFile(filename string, cmd *exec.Cmd) ([]byte, error) {
868
-	out, _, err := runCommandWithOutput(cmd)
869
-	if err != nil {
870
-		return nil, fmt.Errorf("%v: %q", err, out)
871
-	}
872
-
873
-	contID := strings.TrimSpace(out)
874
-
867
+func runCommandAndReadContainerFile(c *check.C, filename string, command string, args ...string) []byte {
868
+	result := icmd.RunCommand(command, args...)
869
+	result.Assert(c, icmd.Success)
870
+	contID := strings.TrimSpace(result.Combined())
875 871
 	if err := waitRun(contID); err != nil {
876
-		return nil, fmt.Errorf("%v: %q", contID, err)
872
+		c.Fatalf("%v: %q", contID, err)
877 873
 	}
878
-
879
-	return readContainerFile(contID, filename)
874
+	return readContainerFile(c, contID, filename)
880 875
 }
881 876
 
882
-func readContainerFile(containerID, filename string) ([]byte, error) {
877
+func readContainerFile(c *check.C, containerID, filename string) []byte {
883 878
 	f, err := os.Open(containerStorageFile(containerID, filename))
884
-	if err != nil {
885
-		return nil, err
886
-	}
879
+	c.Assert(err, checker.IsNil)
887 880
 	defer f.Close()
888 881
 
889 882
 	content, err := ioutil.ReadAll(f)
890
-	if err != nil {
891
-		return nil, err
892
-	}
893
-
894
-	return content, nil
883
+	c.Assert(err, checker.IsNil)
884
+	return content
895 885
 }
896 886
 
897
-func readContainerFileWithExec(containerID, filename string) ([]byte, error) {
898
-	out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "exec", containerID, "cat", filename))
899
-	return []byte(out), err
887
+func readContainerFileWithExec(c *check.C, containerID, filename string) []byte {
888
+	result := icmd.RunCommand(dockerBinary, "exec", containerID, "cat", filename)
889
+	result.Assert(c, icmd.Success)
890
+	return []byte(result.Combined())
900 891
 }
901 892
 
902 893
 // daemonTime provides the current time on the daemon host