Browse code

test for panic on daemon restart

Docker-DCO-1.1-Signed-off-by: Jessica Frazelle <jess@docker.com> (github: jfrazelle)

Jessica Frazelle authored on 2014/09/19 06:36:34
Showing 2 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,139 @@
0
+package main
1
+
2
+import (
3
+	"bufio"
4
+	"os/exec"
5
+	"strings"
6
+	"testing"
7
+	"time"
8
+)
9
+
10
+func TestExec(t *testing.T) {
11
+	runCmd := exec.Command(dockerBinary, "run", "-d", "--name", "testing", "busybox", "sh", "-c", "echo test > /tmp/file && sleep 100")
12
+	out, _, _, err := runCommandWithStdoutStderr(runCmd)
13
+	errorOut(err, t, out)
14
+
15
+	execCmd := exec.Command(dockerBinary, "exec", "testing", "cat", "/tmp/file")
16
+
17
+	out, _, err = runCommandWithOutput(execCmd)
18
+	errorOut(err, t, out)
19
+
20
+	out = strings.Trim(out, "\r\n")
21
+
22
+	if expected := "test"; out != expected {
23
+		t.Errorf("container exec should've printed %q but printed %q", expected, out)
24
+	}
25
+
26
+	deleteAllContainers()
27
+
28
+	logDone("exec - basic test")
29
+}
30
+
31
+func TestExecInteractive(t *testing.T) {
32
+	runCmd := exec.Command(dockerBinary, "run", "-d", "--name", "testing", "busybox", "sh", "-c", "echo test > /tmp/file && sleep 100")
33
+	out, _, _, err := runCommandWithStdoutStderr(runCmd)
34
+	errorOut(err, t, out)
35
+
36
+	execCmd := exec.Command(dockerBinary, "exec", "-i", "testing", "sh")
37
+	stdin, err := execCmd.StdinPipe()
38
+	if err != nil {
39
+		t.Fatal(err)
40
+	}
41
+	stdout, err := execCmd.StdoutPipe()
42
+	if err != nil {
43
+		t.Fatal(err)
44
+	}
45
+
46
+	if err := execCmd.Start(); err != nil {
47
+		t.Fatal(err)
48
+	}
49
+	if _, err := stdin.Write([]byte("cat /tmp/file\n")); err != nil {
50
+		t.Fatal(err)
51
+	}
52
+
53
+	r := bufio.NewReader(stdout)
54
+	line, err := r.ReadString('\n')
55
+	if err != nil {
56
+		t.Fatal(err)
57
+	}
58
+	line = strings.TrimSpace(line)
59
+	if line != "test" {
60
+		t.Fatalf("Output should be 'test', got '%q'", line)
61
+	}
62
+	if err := stdin.Close(); err != nil {
63
+		t.Fatal(err)
64
+	}
65
+	finish := make(chan struct{})
66
+	go func() {
67
+		if err := execCmd.Wait(); err != nil {
68
+			t.Fatal(err)
69
+		}
70
+		close(finish)
71
+	}()
72
+	select {
73
+	case <-finish:
74
+	case <-time.After(1 * time.Second):
75
+		t.Fatal("docker exec failed to exit on stdin close")
76
+	}
77
+
78
+	deleteAllContainers()
79
+
80
+	logDone("exec - Interactive test")
81
+}
82
+
83
+func TestExecAfterContainerRestart(t *testing.T) {
84
+	runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "top")
85
+	out, _, err := runCommandWithOutput(runCmd)
86
+	errorOut(err, t, out)
87
+
88
+	cleanedContainerID := stripTrailingCharacters(out)
89
+
90
+	runCmd = exec.Command(dockerBinary, "restart", cleanedContainerID)
91
+	out, _, err = runCommandWithOutput(runCmd)
92
+	errorOut(err, t, out)
93
+
94
+	runCmd = exec.Command(dockerBinary, "exec", cleanedContainerID, "echo", "hello")
95
+	out, _, err = runCommandWithOutput(runCmd)
96
+	errorOut(err, t, out)
97
+
98
+	outStr := strings.TrimSpace(out)
99
+	if outStr != "hello" {
100
+		t.Errorf("container should've printed hello, instead printed %q", outStr)
101
+	}
102
+
103
+	deleteAllContainers()
104
+
105
+	logDone("exec - exec running container after container restart")
106
+}
107
+
108
+func TestExecAfterDaemonRestart(t *testing.T) {
109
+	d := NewDaemon(t)
110
+	if err := d.StartWithBusybox(); err != nil {
111
+		t.Fatalf("Could not start daemon with busybox: %v", err)
112
+	}
113
+	defer d.Stop()
114
+
115
+	if out, err := d.Cmd("run", "-d", "--name", "top", "-p", "80", "busybox:latest", "top"); err != nil {
116
+		t.Fatalf("Could not run top: err=%v\n%s", err, out)
117
+	}
118
+
119
+	if err := d.Restart(); err != nil {
120
+		t.Fatalf("Could not restart daemon: %v", err)
121
+	}
122
+
123
+	if out, err := d.Cmd("start", "top"); err != nil {
124
+		t.Fatalf("Could not start top after daemon restart: err=%v\n%s", err, out)
125
+	}
126
+
127
+	out, err := d.Cmd("exec", "top", "echo", "hello")
128
+	if err != nil {
129
+		t.Fatalf("Could not exec on container top: err=%v\n%s", err, out)
130
+	}
131
+
132
+	outStr := strings.TrimSpace(string(out))
133
+	if outStr != "hello" {
134
+		t.Errorf("container should've printed hello, instead printed %q", outStr)
135
+	}
136
+
137
+	logDone("exec - exec running container after daemon restart")
138
+}
... ...
@@ -2012,81 +2012,6 @@ func TestRunPortInUse(t *testing.T) {
2012 2012
 	logDone("run - fail if port already in use")
2013 2013
 }
2014 2014
 
2015
-// "test" should be printed by docker exec
2016
-func TestDockerExec(t *testing.T) {
2017
-	runCmd := exec.Command(dockerBinary, "run", "-d", "--name", "testing", "busybox", "sh", "-c", "echo test > /tmp/file && sleep 100")
2018
-	out, _, _, err := runCommandWithStdoutStderr(runCmd)
2019
-	errorOut(err, t, out)
2020
-
2021
-	execCmd := exec.Command(dockerBinary, "exec", "testing", "cat", "/tmp/file")
2022
-
2023
-	out, _, err = runCommandWithOutput(execCmd)
2024
-	errorOut(err, t, out)
2025
-
2026
-	out = strings.Trim(out, "\r\n")
2027
-
2028
-	if expected := "test"; out != expected {
2029
-		t.Errorf("container exec should've printed %q but printed %q", expected, out)
2030
-	}
2031
-
2032
-	deleteAllContainers()
2033
-
2034
-	logDone("exec - basic test")
2035
-}
2036
-
2037
-// "test" should be printed by docker exec
2038
-func TestDockerExecInteractive(t *testing.T) {
2039
-	runCmd := exec.Command(dockerBinary, "run", "-d", "--name", "testing", "busybox", "sh", "-c", "echo test > /tmp/file && sleep 100")
2040
-	out, _, _, err := runCommandWithStdoutStderr(runCmd)
2041
-	errorOut(err, t, out)
2042
-
2043
-	execCmd := exec.Command(dockerBinary, "exec", "-i", "testing", "sh")
2044
-	stdin, err := execCmd.StdinPipe()
2045
-	if err != nil {
2046
-		t.Fatal(err)
2047
-	}
2048
-	stdout, err := execCmd.StdoutPipe()
2049
-	if err != nil {
2050
-		t.Fatal(err)
2051
-	}
2052
-
2053
-	if err := execCmd.Start(); err != nil {
2054
-		t.Fatal(err)
2055
-	}
2056
-	if _, err := stdin.Write([]byte("cat /tmp/file\n")); err != nil {
2057
-		t.Fatal(err)
2058
-	}
2059
-
2060
-	r := bufio.NewReader(stdout)
2061
-	line, err := r.ReadString('\n')
2062
-	if err != nil {
2063
-		t.Fatal(err)
2064
-	}
2065
-	line = strings.TrimSpace(line)
2066
-	if line != "test" {
2067
-		t.Fatalf("Output should be 'test', got '%q'", line)
2068
-	}
2069
-	if err := stdin.Close(); err != nil {
2070
-		t.Fatal(err)
2071
-	}
2072
-	finish := make(chan struct{})
2073
-	go func() {
2074
-		if err := execCmd.Wait(); err != nil {
2075
-			t.Fatal(err)
2076
-		}
2077
-		close(finish)
2078
-	}()
2079
-	select {
2080
-	case <-finish:
2081
-	case <-time.After(1 * time.Second):
2082
-		t.Fatal("docker exec failed to exit on stdin close")
2083
-	}
2084
-
2085
-	deleteAllContainers()
2086
-
2087
-	logDone("exec - Interactive test")
2088
-}
2089
-
2090 2015
 // Regression test for #7792
2091 2016
 func TestMountOrdering(t *testing.T) {
2092 2017
 	tmpDir, err := ioutil.TempDir("", "docker_nested_mount_test")