Browse code

Add and modify tests for legacy and new daemon invokations

Signed-off-by: Shishir Mahajan <shishir.mahajan@redhat.com>
Signed-off-by: Tibor Vass <tibor@docker.com>

Shishir Mahajan authored on 2015/05/01 23:00:43
Showing 7 changed files
... ...
@@ -79,7 +79,7 @@ func (s *DockerSuite) TestBuildShCmdJSONEntrypoint(c *check.C) {
79 79
 	out, _ := dockerCmd(c, "run", "--rm", name)
80 80
 
81 81
 	if strings.TrimSpace(out) != "/bin/sh -c echo test" {
82
-		c.Fatal("CMD did not contain /bin/sh -c")
82
+		c.Fatalf("CMD did not contain /bin/sh -c : %s", out)
83 83
 	}
84 84
 
85 85
 }
... ...
@@ -324,6 +324,100 @@ func (s *DockerDaemonSuite) TestDaemonLogLevelWrong(c *check.C) {
324 324
 	c.Assert(s.d.Start("--log-level=bogus"), check.NotNil, check.Commentf("Daemon shouldn't start with wrong log level"))
325 325
 }
326 326
 
327
+func (s *DockerSuite) TestDaemonStartWithBackwardCompatibility(c *check.C) {
328
+
329
+	var validCommandArgs = [][]string{
330
+		{"--selinux-enabled", "-l", "info"},
331
+		{"--insecure-registry", "daemon"},
332
+	}
333
+
334
+	var invalidCommandArgs = [][]string{
335
+		{"--selinux-enabled", "--storage-opt"},
336
+		{"-D", "-b"},
337
+		{"--config", "/tmp"},
338
+	}
339
+
340
+	for _, args := range validCommandArgs {
341
+		d := NewDaemon(c)
342
+		d.Command = "--daemon"
343
+		if err := d.Start(args...); err != nil {
344
+			c.Fatalf("Daemon should have started successfully with --daemon %v: %v", args, err)
345
+		}
346
+		d.Stop()
347
+	}
348
+
349
+	for _, args := range invalidCommandArgs {
350
+		d := NewDaemon(c)
351
+		if err := d.Start(args...); err == nil {
352
+			d.Stop()
353
+			c.Fatalf("Daemon should have failed to start with %v", args)
354
+		}
355
+	}
356
+}
357
+
358
+func (s *DockerSuite) TestDaemonStartWithDaemonCommand(c *check.C) {
359
+
360
+	type kind int
361
+
362
+	const (
363
+		common kind = iota
364
+		daemon
365
+	)
366
+
367
+	var flags = []map[kind][]string{
368
+		{common: {"-l", "info"}, daemon: {"--selinux-enabled"}},
369
+		{common: {"-D"}, daemon: {"--selinux-enabled", "-r"}},
370
+		{common: {"-D"}, daemon: {"--restart"}},
371
+		{common: {"--debug"}, daemon: {"--log-driver=json-file", "--log-opt=max-size=1k"}},
372
+	}
373
+
374
+	var invalidGlobalFlags = [][]string{
375
+		//Invalid because you cannot pass daemon flags as global flags.
376
+		{"--selinux-enabled", "-l", "info"},
377
+		{"-D", "-r"},
378
+		{"--config", "/tmp"},
379
+	}
380
+
381
+	// `docker daemon -l info --selinux-enabled`
382
+	// should NOT error out
383
+	for _, f := range flags {
384
+		d := NewDaemon(c)
385
+		args := append(f[common], f[daemon]...)
386
+		if err := d.Start(args...); err != nil {
387
+			c.Fatalf("Daemon should have started successfully with %v: %v", args, err)
388
+		}
389
+		d.Stop()
390
+	}
391
+
392
+	// `docker -l info daemon --selinux-enabled`
393
+	// should error out
394
+	for _, f := range flags {
395
+		d := NewDaemon(c)
396
+		d.GlobalFlags = f[common]
397
+		if err := d.Start(f[daemon]...); err == nil {
398
+			d.Stop()
399
+			c.Fatalf("Daemon should have failed to start with docker %v daemon %v", d.GlobalFlags, f[daemon])
400
+		}
401
+	}
402
+
403
+	for _, f := range invalidGlobalFlags {
404
+		cmd := exec.Command(dockerBinary, append(f, "daemon")...)
405
+		errch := make(chan error)
406
+		var err error
407
+		go func() {
408
+			errch <- cmd.Run()
409
+		}()
410
+		select {
411
+		case <-time.After(time.Second):
412
+			cmd.Process.Kill()
413
+		case err = <-errch:
414
+		}
415
+		if err == nil {
416
+			c.Fatalf("Daemon should have failed to start with docker %v daemon", f)
417
+		}
418
+	}
419
+}
420
+
327 421
 func (s *DockerDaemonSuite) TestDaemonLogLevelDebug(c *check.C) {
328 422
 	if err := s.d.Start("--log-level=debug"); err != nil {
329 423
 		c.Fatal(err)
... ...
@@ -382,7 +476,7 @@ func (s *DockerDaemonSuite) TestDaemonAllocatesListeningPort(c *check.C) {
382 382
 		{"localhost", "127.0.0.1", "1235"},
383 383
 	}
384 384
 
385
-	cmdArgs := []string{}
385
+	cmdArgs := make([]string, 0, len(listeningPorts)*2)
386 386
 	for _, hostDirective := range listeningPorts {
387 387
 		cmdArgs = append(cmdArgs, "--host", fmt.Sprintf("tcp://%s:%s", hostDirective[0], hostDirective[2]))
388 388
 	}
... ...
@@ -798,8 +892,7 @@ func (s *DockerDaemonSuite) TestDaemonLinksIpTablesRulesWhenLinkAndUnlink(c *che
798 798
 	c.Assert(err, check.IsNil, check.Commentf(out))
799 799
 	defer deleteInterface(c, bridgeName)
800 800
 
801
-	args := []string{"--bridge", bridgeName, "--icc=false"}
802
-	err = s.d.StartWithBusybox(args...)
801
+	err = s.d.StartWithBusybox("--bridge", bridgeName, "--icc=false")
803 802
 	c.Assert(err, check.IsNil)
804 803
 	defer s.d.Restart()
805 804
 
... ...
@@ -1210,7 +1303,7 @@ func (s *DockerDaemonSuite) TestDaemonRestartKillWait(c *check.C) {
1210 1210
 // TestHttpsInfo connects via two-way authenticated HTTPS to the info endpoint
1211 1211
 func (s *DockerDaemonSuite) TestHttpsInfo(c *check.C) {
1212 1212
 	const (
1213
-		testDaemonHTTPSAddr = "localhost:4271"
1213
+		testDaemonHTTPSAddr = "tcp://localhost:4271"
1214 1214
 	)
1215 1215
 
1216 1216
 	if err := s.d.Start("--tlsverify", "--tlscacert", "fixtures/https/ca.pem", "--tlscert", "fixtures/https/server-cert.pem",
... ...
@@ -1218,9 +1311,7 @@ func (s *DockerDaemonSuite) TestHttpsInfo(c *check.C) {
1218 1218
 		c.Fatalf("Could not start daemon with busybox: %v", err)
1219 1219
 	}
1220 1220
 
1221
-	//force tcp protocol
1222
-	host := fmt.Sprintf("tcp://%s", testDaemonHTTPSAddr)
1223
-	daemonArgs := []string{"--host", host, "--tlsverify", "--tlscacert", "fixtures/https/ca.pem", "--tlscert", "fixtures/https/client-cert.pem", "--tlskey", "fixtures/https/client-key.pem"}
1221
+	daemonArgs := []string{"--host", testDaemonHTTPSAddr, "--tlsverify", "--tlscacert", "fixtures/https/ca.pem", "--tlscert", "fixtures/https/client-cert.pem", "--tlskey", "fixtures/https/client-key.pem"}
1224 1222
 	out, err := s.d.CmdWithArgs(daemonArgs, "info")
1225 1223
 	if err != nil {
1226 1224
 		c.Fatalf("Error Occurred: %s and output: %s", err, out)
... ...
@@ -1232,16 +1323,15 @@ func (s *DockerDaemonSuite) TestHttpsInfo(c *check.C) {
1232 1232
 func (s *DockerDaemonSuite) TestHttpsInfoRogueCert(c *check.C) {
1233 1233
 	const (
1234 1234
 		errBadCertificate   = "remote error: bad certificate"
1235
-		testDaemonHTTPSAddr = "localhost:4271"
1235
+		testDaemonHTTPSAddr = "tcp://localhost:4271"
1236 1236
 	)
1237
+
1237 1238
 	if err := s.d.Start("--tlsverify", "--tlscacert", "fixtures/https/ca.pem", "--tlscert", "fixtures/https/server-cert.pem",
1238 1239
 		"--tlskey", "fixtures/https/server-key.pem", "-H", testDaemonHTTPSAddr); err != nil {
1239 1240
 		c.Fatalf("Could not start daemon with busybox: %v", err)
1240 1241
 	}
1241 1242
 
1242
-	//force tcp protocol
1243
-	host := fmt.Sprintf("tcp://%s", testDaemonHTTPSAddr)
1244
-	daemonArgs := []string{"--host", host, "--tlsverify", "--tlscacert", "fixtures/https/ca.pem", "--tlscert", "fixtures/https/client-rogue-cert.pem", "--tlskey", "fixtures/https/client-rogue-key.pem"}
1243
+	daemonArgs := []string{"--host", testDaemonHTTPSAddr, "--tlsverify", "--tlscacert", "fixtures/https/ca.pem", "--tlscert", "fixtures/https/client-rogue-cert.pem", "--tlskey", "fixtures/https/client-rogue-key.pem"}
1245 1244
 	out, err := s.d.CmdWithArgs(daemonArgs, "info")
1246 1245
 	if err == nil || !strings.Contains(out, errBadCertificate) {
1247 1246
 		c.Fatalf("Expected err: %s, got instead: %s and output: %s", errBadCertificate, err, out)
... ...
@@ -1253,16 +1343,14 @@ func (s *DockerDaemonSuite) TestHttpsInfoRogueCert(c *check.C) {
1253 1253
 func (s *DockerDaemonSuite) TestHttpsInfoRogueServerCert(c *check.C) {
1254 1254
 	const (
1255 1255
 		errCaUnknown             = "x509: certificate signed by unknown authority"
1256
-		testDaemonRogueHTTPSAddr = "localhost:4272"
1256
+		testDaemonRogueHTTPSAddr = "tcp://localhost:4272"
1257 1257
 	)
1258 1258
 	if err := s.d.Start("--tlsverify", "--tlscacert", "fixtures/https/ca.pem", "--tlscert", "fixtures/https/server-rogue-cert.pem",
1259 1259
 		"--tlskey", "fixtures/https/server-rogue-key.pem", "-H", testDaemonRogueHTTPSAddr); err != nil {
1260 1260
 		c.Fatalf("Could not start daemon with busybox: %v", err)
1261 1261
 	}
1262 1262
 
1263
-	//force tcp protocol
1264
-	host := fmt.Sprintf("tcp://%s", testDaemonRogueHTTPSAddr)
1265
-	daemonArgs := []string{"--host", host, "--tlsverify", "--tlscacert", "fixtures/https/ca.pem", "--tlscert", "fixtures/https/client-rogue-cert.pem", "--tlskey", "fixtures/https/client-rogue-key.pem"}
1263
+	daemonArgs := []string{"--host", testDaemonRogueHTTPSAddr, "--tlsverify", "--tlscacert", "fixtures/https/ca.pem", "--tlscert", "fixtures/https/client-rogue-cert.pem", "--tlskey", "fixtures/https/client-rogue-key.pem"}
1266 1264
 	out, err := s.d.CmdWithArgs(daemonArgs, "info")
1267 1265
 	if err == nil || !strings.Contains(out, errCaUnknown) {
1268 1266
 		c.Fatalf("Expected err: %s, got instead: %s and output: %s", errCaUnknown, err, out)
... ...
@@ -89,10 +89,18 @@ func (s *DockerSuite) TestHelpTextVerify(c *check.C) {
89 89
 			c.Fatalf("Missing 'Commands:' in:\n%s", out)
90 90
 		}
91 91
 
92
-		// Grab all chars starting at "Commands:"
93
-		// Skip first line, its "Commands:"
94 92
 		cmds := []string{}
95
-		for _, cmd := range strings.Split(out[i:], "\n")[1:] {
93
+		// Grab all chars starting at "Commands:"
94
+		helpOut := strings.Split(out[i:], "\n")
95
+		// First line is just "Commands:"
96
+		if isLocalDaemon {
97
+			// Replace first line with "daemon" command since it's not part of the list of commands.
98
+			helpOut[0] = " daemon"
99
+		} else {
100
+			// Skip first line
101
+			helpOut = helpOut[1:]
102
+		}
103
+		for _, cmd := range helpOut {
96 104
 			var stderr string
97 105
 
98 106
 			// Stop on blank line or non-idented line
... ...
@@ -192,9 +200,10 @@ func (s *DockerSuite) TestHelpTextVerify(c *check.C) {
192 192
 				// lead to incorrect test result (like false negative).
193 193
 				// Whatever the reason, skip trying to run w/o args and
194 194
 				// jump to trying with a bogus arg.
195
-				skipNoArgs := map[string]string{
196
-					"events": "",
197
-					"load":   "",
195
+				skipNoArgs := map[string]struct{}{
196
+					"daemon": {},
197
+					"events": {},
198
+					"load":   {},
198 199
 				}
199 200
 
200 201
 				ec = 0
... ...
@@ -230,6 +239,9 @@ func (s *DockerSuite) TestHelpTextVerify(c *check.C) {
230 230
 		}
231 231
 
232 232
 		expected := 39
233
+		if isLocalDaemon {
234
+			expected++ // for the daemon command
235
+		}
233 236
 		if len(cmds) != expected {
234 237
 			c.Fatalf("Wrong # of cmds(%d), it should be: %d\nThe list:\n%q",
235 238
 				len(cmds), expected, cmds)
... ...
@@ -246,7 +258,7 @@ func (s *DockerSuite) TestHelpExitCodesHelpOutput(c *check.C) {
246 246
 	cmd := exec.Command(dockerBinary)
247 247
 	stdout, stderr, ec, err := runCommandWithStdoutStderr(cmd)
248 248
 	if len(stdout) == 0 || len(stderr) != 0 || ec != 0 || err != nil {
249
-		c.Fatalf("Bad results from 'docker'\nec:%d\nstdout:%s\nstderr:%s\nerr:%q", ec, stdout, stderr, err)
249
+		c.Fatalf("Bad results from 'docker'\nec:%d\nstdout:%s\nstderr:%s\nerr:%v", ec, stdout, stderr, err)
250 250
 	}
251 251
 	// Be really pick
252 252
 	if strings.HasSuffix(stdout, "\n\n") {
... ...
@@ -257,7 +269,7 @@ func (s *DockerSuite) TestHelpExitCodesHelpOutput(c *check.C) {
257 257
 	cmd = exec.Command(dockerBinary, "help")
258 258
 	stdout, stderr, ec, err = runCommandWithStdoutStderr(cmd)
259 259
 	if len(stdout) == 0 || len(stderr) != 0 || ec != 0 || err != nil {
260
-		c.Fatalf("Bad results from 'docker help'\nec:%d\nstdout:%s\nstderr:%s\nerr:%q", ec, stdout, stderr, err)
260
+		c.Fatalf("Bad results from 'docker help'\nec:%d\nstdout:%s\nstderr:%s\nerr:%v", ec, stdout, stderr, err)
261 261
 	}
262 262
 	// Be really pick
263 263
 	if strings.HasSuffix(stdout, "\n\n") {
... ...
@@ -268,7 +280,7 @@ func (s *DockerSuite) TestHelpExitCodesHelpOutput(c *check.C) {
268 268
 	cmd = exec.Command(dockerBinary, "--help")
269 269
 	stdout, stderr, ec, err = runCommandWithStdoutStderr(cmd)
270 270
 	if len(stdout) == 0 || len(stderr) != 0 || ec != 0 || err != nil {
271
-		c.Fatalf("Bad results from 'docker --help'\nec:%d\nstdout:%s\nstderr:%s\nerr:%q", ec, stdout, stderr, err)
271
+		c.Fatalf("Bad results from 'docker --help'\nec:%d\nstdout:%s\nstderr:%s\nerr:%v", ec, stdout, stderr, err)
272 272
 	}
273 273
 	// Be really pick
274 274
 	if strings.HasSuffix(stdout, "\n\n") {
... ...
@@ -280,7 +292,7 @@ func (s *DockerSuite) TestHelpExitCodesHelpOutput(c *check.C) {
280 280
 	cmd = exec.Command(dockerBinary, "inspect", "busybox")
281 281
 	stdout, stderr, ec, err = runCommandWithStdoutStderr(cmd)
282 282
 	if len(stdout) == 0 || len(stderr) != 0 || ec != 0 || err != nil {
283
-		c.Fatalf("Bad results from 'docker inspect busybox'\nec:%d\nstdout:%s\nstderr:%s\nerr:%q", ec, stdout, stderr, err)
283
+		c.Fatalf("Bad results from 'docker inspect busybox'\nec:%d\nstdout:%s\nstderr:%s\nerr:%v", ec, stdout, stderr, err)
284 284
 	}
285 285
 	// Be really pick
286 286
 	if strings.HasSuffix(stdout, "\n\n") {
... ...
@@ -292,7 +304,7 @@ func (s *DockerSuite) TestHelpExitCodesHelpOutput(c *check.C) {
292 292
 	cmd = exec.Command(dockerBinary, "rm")
293 293
 	stdout, stderr, ec, err = runCommandWithStdoutStderr(cmd)
294 294
 	if len(stdout) != 0 || len(stderr) == 0 || ec == 0 || err == nil {
295
-		c.Fatalf("Bad results from 'docker rm'\nec:%d\nstdout:%s\nstderr:%s\nerr:%q", ec, stdout, stderr, err)
295
+		c.Fatalf("Bad results from 'docker rm'\nec:%d\nstdout:%s\nstderr:%s\nerr:%v", ec, stdout, stderr, err)
296 296
 	}
297 297
 	// Should not contain full help text but should contain info about
298 298
 	// # of args and Usage line
... ...
@@ -305,7 +317,7 @@ func (s *DockerSuite) TestHelpExitCodesHelpOutput(c *check.C) {
305 305
 	cmd = exec.Command(dockerBinary, "rm", "NoSuchContainer")
306 306
 	stdout, stderr, ec, err = runCommandWithStdoutStderr(cmd)
307 307
 	if len(stdout) != 0 || len(stderr) == 0 || ec == 0 || err == nil {
308
-		c.Fatalf("Bad results from 'docker rm NoSuchContainer'\nec:%d\nstdout:%s\nstderr:%s\nerr:%q", ec, stdout, stderr, err)
308
+		c.Fatalf("Bad results from 'docker rm NoSuchContainer'\nec:%d\nstdout:%s\nstderr:%s\nerr:%v", ec, stdout, stderr, err)
309 309
 	}
310 310
 	// Be really picky
311 311
 	if strings.HasSuffix(stderr, "\n\n") {
... ...
@@ -316,7 +328,7 @@ func (s *DockerSuite) TestHelpExitCodesHelpOutput(c *check.C) {
316 316
 	cmd = exec.Command(dockerBinary, "BadCmd")
317 317
 	stdout, stderr, ec, err = runCommandWithStdoutStderr(cmd)
318 318
 	if len(stdout) != 0 || len(stderr) == 0 || ec == 0 || err == nil {
319
-		c.Fatalf("Bad results from 'docker BadCmd'\nec:%d\nstdout:%s\nstderr:%s\nerr:%q", ec, stdout, stderr, err)
319
+		c.Fatalf("Bad results from 'docker BadCmd'\nec:%d\nstdout:%s\nstderr:%s\nerr:%v", ec, stdout, stderr, err)
320 320
 	}
321 321
 	if stderr != "docker: 'BadCmd' is not a docker command.\nSee 'docker --help'.\n" {
322 322
 		c.Fatalf("Unexcepted output for 'docker badCmd'\nstderr:%s", stderr)
... ...
@@ -43,8 +43,7 @@ func (s *DockerDaemonSuite) TestCliProxyProxyTCPSock(c *check.C) {
43 43
 		c.Fatal("could not find ip to connect to")
44 44
 	}
45 45
 
46
-	s.d.GlobalFlags = []string{"-H", "tcp://" + ip + ":2375"}
47
-	if err := s.d.Start(); err != nil {
46
+	if err := s.d.Start("-H", "tcp://"+ip+":2375"); err != nil {
48 47
 		c.Fatal(err)
49 48
 	}
50 49
 
... ...
@@ -217,6 +217,17 @@ func (s *DockerSuite) TestRunLinksContainerWithContainerId(c *check.C) {
217 217
 	}
218 218
 }
219 219
 
220
+// Issue 9677.
221
+func (s *DockerSuite) TestRunWithDaemonFlags(c *check.C) {
222
+	out, _, err := dockerCmdWithError(c, "--selinux-enabled", "run", "-i", "-t", "busybox", "true")
223
+	if err != nil {
224
+		if !strings.Contains(out, "must follow the 'docker daemon' command") && // daemon
225
+			!strings.Contains(out, "flag provided but not defined: --selinux-enabled") { // no daemon (client-only)
226
+			c.Fatal(err, out)
227
+		}
228
+	}
229
+}
230
+
220 231
 // Regression test for #4979
221 232
 func (s *DockerSuite) TestRunWithVolumesFromExited(c *check.C) {
222 233
 	out, exitCode := dockerCmd(c, "run", "--name", "test-data", "--volume", "/some/dir", "busybox", "touch", "/some/dir/file")
... ...
@@ -29,6 +29,12 @@ import (
29 29
 
30 30
 // Daemon represents a Docker daemon for the testing framework.
31 31
 type Daemon struct {
32
+	// Defaults to "daemon"
33
+	// Useful to set to --daemon or -d for checking backwards compatability
34
+	Command     string
35
+	GlobalFlags []string
36
+
37
+	id             string
32 38
 	c              *check.C
33 39
 	logFile        *os.File
34 40
 	folder         string
... ...
@@ -59,7 +65,8 @@ func NewDaemon(c *check.C) *Daemon {
59 59
 		c.Fatal("Please set the DEST environment variable")
60 60
 	}
61 61
 
62
-	dir := filepath.Join(dest, fmt.Sprintf("d%d", time.Now().UnixNano()%100000000))
62
+	id := fmt.Sprintf("d%d", time.Now().UnixNano()%100000000)
63
+	dir := filepath.Join(dest, id)
63 64
 	daemonFolder, err := filepath.Abs(dir)
64 65
 	if err != nil {
65 66
 		c.Fatalf("Could not make %q an absolute path: %v", dir, err)
... ...
@@ -77,6 +84,8 @@ func NewDaemon(c *check.C) *Daemon {
77 77
 	}
78 78
 
79 79
 	return &Daemon{
80
+		Command:       "daemon",
81
+		id:            id,
80 82
 		c:             c,
81 83
 		folder:        daemonFolder,
82 84
 		storageDriver: os.Getenv("DOCKER_GRAPHDRIVER"),
... ...
@@ -90,22 +99,22 @@ func NewDaemon(c *check.C) *Daemon {
90 90
 func (d *Daemon) Start(arg ...string) error {
91 91
 	dockerBinary, err := exec.LookPath(dockerBinary)
92 92
 	if err != nil {
93
-		d.c.Fatalf("could not find docker binary in $PATH: %v", err)
93
+		d.c.Fatalf("[%s] could not find docker binary in $PATH: %v", d.id, err)
94 94
 	}
95 95
 
96
-	args := []string{
96
+	args := append(d.GlobalFlags,
97
+		d.Command,
97 98
 		"--host", d.sock(),
98
-		"--daemon",
99 99
 		"--graph", fmt.Sprintf("%s/graph", d.folder),
100 100
 		"--pidfile", fmt.Sprintf("%s/docker.pid", d.folder),
101 101
 		fmt.Sprintf("--userland-proxy=%t", d.userlandProxy),
102
-	}
102
+	)
103 103
 
104 104
 	// If we don't explicitly set the log-level or debug flag(-D) then
105 105
 	// turn on debug mode
106 106
 	foundIt := false
107 107
 	for _, a := range arg {
108
-		if strings.Contains(a, "--log-level") || strings.Contains(a, "-D") {
108
+		if strings.Contains(a, "--log-level") || strings.Contains(a, "-D") || strings.Contains(a, "--debug") {
109 109
 			foundIt = true
110 110
 		}
111 111
 	}
... ...
@@ -125,21 +134,21 @@ func (d *Daemon) Start(arg ...string) error {
125 125
 
126 126
 	d.logFile, err = os.OpenFile(filepath.Join(d.folder, "docker.log"), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0600)
127 127
 	if err != nil {
128
-		d.c.Fatalf("Could not create %s/docker.log: %v", d.folder, err)
128
+		d.c.Fatalf("[%s] Could not create %s/docker.log: %v", d.id, d.folder, err)
129 129
 	}
130 130
 
131 131
 	d.cmd.Stdout = d.logFile
132 132
 	d.cmd.Stderr = d.logFile
133 133
 
134 134
 	if err := d.cmd.Start(); err != nil {
135
-		return fmt.Errorf("could not start daemon container: %v", err)
135
+		return fmt.Errorf("[%s] could not start daemon container: %v", d.id, err)
136 136
 	}
137 137
 
138 138
 	wait := make(chan error)
139 139
 
140 140
 	go func() {
141 141
 		wait <- d.cmd.Wait()
142
-		d.c.Log("exiting daemon")
142
+		d.c.Logf("[%s] exiting daemon", d.id)
143 143
 		close(wait)
144 144
 	}()
145 145
 
... ...
@@ -149,14 +158,14 @@ func (d *Daemon) Start(arg ...string) error {
149 149
 	// make sure daemon is ready to receive requests
150 150
 	startTime := time.Now().Unix()
151 151
 	for {
152
-		d.c.Log("waiting for daemon to start")
152
+		d.c.Logf("[%s] waiting for daemon to start", d.id)
153 153
 		if time.Now().Unix()-startTime > 5 {
154 154
 			// After 5 seconds, give up
155
-			return errors.New("Daemon exited and never started")
155
+			return fmt.Errorf("[%s] Daemon exited and never started", d.id)
156 156
 		}
157 157
 		select {
158 158
 		case <-time.After(2 * time.Second):
159
-			return errors.New("timeout: daemon does not respond")
159
+			return fmt.Errorf("[%s] timeout: daemon does not respond", d.id)
160 160
 		case <-tick:
161 161
 			c, err := net.Dial("unix", filepath.Join(d.folder, "docker.sock"))
162 162
 			if err != nil {
... ...
@@ -168,7 +177,7 @@ func (d *Daemon) Start(arg ...string) error {
168 168
 
169 169
 			req, err := http.NewRequest("GET", "/_ping", nil)
170 170
 			if err != nil {
171
-				d.c.Fatalf("could not create new request: %v", err)
171
+				d.c.Fatalf("[%s] could not create new request: %v", d.id, err)
172 172
 			}
173 173
 
174 174
 			resp, err := client.Do(req)
... ...
@@ -176,10 +185,10 @@ func (d *Daemon) Start(arg ...string) error {
176 176
 				continue
177 177
 			}
178 178
 			if resp.StatusCode != http.StatusOK {
179
-				d.c.Logf("received status != 200 OK: %s", resp.Status)
179
+				d.c.Logf("[%s] received status != 200 OK: %s", d.id, resp.Status)
180 180
 			}
181 181
 
182
-			d.c.Log("daemon started")
182
+			d.c.Logf("[%s] daemon started", d.id)
183 183
 			return nil
184 184
 		}
185 185
 	}
... ...
@@ -11,7 +11,7 @@ func TestUlimitOpt(t *testing.T) {
11 11
 		"nofile": {"nofile", 1024, 512},
12 12
 	}
13 13
 
14
-	ulimitOpt := NewUlimitOpt(ulimitMap)
14
+	ulimitOpt := NewUlimitOpt(&ulimitMap)
15 15
 
16 16
 	expected := "[nofile=512:1024]"
17 17
 	if ulimitOpt.String() != expected {