Browse code

Add unit test for multiple attach / restart

Guillaume J. Charmes authored on 2013/03/30 02:56:49
Showing 1 changed files
... ...
@@ -39,6 +39,117 @@ func TestIdFormat(t *testing.T) {
39 39
 	}
40 40
 }
41 41
 
42
+func TestMultipleAttachRestart(t *testing.T) {
43
+	runtime, err := newTestRuntime()
44
+	if err != nil {
45
+		t.Fatal(err)
46
+	}
47
+	defer nuke(runtime)
48
+	container, err := runtime.Create(
49
+		&Config{
50
+			Image: GetTestImage(runtime).Id,
51
+			Cmd: []string{"/bin/sh", "-c",
52
+				"i=1; while [ $i -le 5 ]; do i=`expr $i + 1`;  echo hello; done"},
53
+			Memory: 33554432,
54
+		},
55
+	)
56
+	if err != nil {
57
+		t.Fatal(err)
58
+	}
59
+	defer runtime.Destroy(container)
60
+
61
+	// Simulate 3 client attaching to the container and stop/restart
62
+
63
+	stdout1, err := container.StdoutPipe()
64
+	if err != nil {
65
+		t.Fatal(err)
66
+	}
67
+	stdout2, err := container.StdoutPipe()
68
+	if err != nil {
69
+		t.Fatal(err)
70
+	}
71
+	stdout3, err := container.StdoutPipe()
72
+	if err != nil {
73
+		t.Fatal(err)
74
+	}
75
+	if err := container.Start(); err != nil {
76
+		t.Fatal(err)
77
+	}
78
+	l1, err := bufio.NewReader(stdout1).ReadString('\n')
79
+	if err != nil {
80
+		t.Fatal(err)
81
+	}
82
+	if strings.Trim(l1, " \r\n") != "hello" {
83
+		t.Fatalf("Unexpected output. Expected [%s], received [%s]", "hello", l1)
84
+	}
85
+	l2, err := bufio.NewReader(stdout2).ReadString('\n')
86
+	if err != nil {
87
+		t.Fatal(err)
88
+	}
89
+	if strings.Trim(l2, " \r\n") != "hello" {
90
+		t.Fatalf("Unexpected output. Expected [%s], received [%s]", "hello", l2)
91
+	}
92
+	l3, err := bufio.NewReader(stdout3).ReadString('\n')
93
+	if err != nil {
94
+		t.Fatal(err)
95
+	}
96
+	if strings.Trim(l3, " \r\n") != "hello" {
97
+		t.Fatalf("Unexpected output. Expected [%s], received [%s]", "hello", l3)
98
+	}
99
+
100
+	if err := container.Stop(); err != nil {
101
+		t.Fatal(err)
102
+	}
103
+
104
+	stdout1, err = container.StdoutPipe()
105
+	if err != nil {
106
+		t.Fatal(err)
107
+	}
108
+	stdout2, err = container.StdoutPipe()
109
+	if err != nil {
110
+		t.Fatal(err)
111
+	}
112
+	stdout3, err = container.StdoutPipe()
113
+	if err != nil {
114
+		t.Fatal(err)
115
+	}
116
+	if err := container.Start(); err != nil {
117
+		t.Fatal(err)
118
+	}
119
+	timeout := make(chan bool)
120
+	go func() {
121
+		l1, err = bufio.NewReader(stdout1).ReadString('\n')
122
+		if err != nil {
123
+			t.Fatal(err)
124
+		}
125
+		if strings.Trim(l1, " \r\n") != "hello" {
126
+			t.Fatalf("Unexpected output. Expected [%s], received [%s]", "hello", l1)
127
+		}
128
+		l2, err = bufio.NewReader(stdout2).ReadString('\n')
129
+		if err != nil {
130
+			t.Fatal(err)
131
+		}
132
+		if strings.Trim(l2, " \r\n") != "hello" {
133
+			t.Fatalf("Unexpected output. Expected [%s], received [%s]", "hello", l2)
134
+		}
135
+		l3, err = bufio.NewReader(stdout3).ReadString('\n')
136
+		if err != nil {
137
+			t.Fatal(err)
138
+		}
139
+		if strings.Trim(l3, " \r\n") != "hello" {
140
+			t.Fatalf("Unexpected output. Expected [%s], received [%s]", "hello", l3)
141
+		}
142
+		timeout <- false
143
+	}()
144
+	go func() {
145
+		time.Sleep(3 * time.Second)
146
+		timeout <- true
147
+	}()
148
+	if <-timeout {
149
+		t.Fatalf("Timeout reading from the process")
150
+	}
151
+}
152
+
42 153
 func TestCommitRun(t *testing.T) {
43 154
 	runtime, err := newTestRuntime()
44 155
 	if err != nil {
... ...
@@ -89,7 +200,6 @@ func TestCommitRun(t *testing.T) {
89 89
 		t.Fatal(err)
90 90
 	}
91 91
 	defer runtime.Destroy(container2)
92
-
93 92
 	stdout, err := container2.StdoutPipe()
94 93
 	stderr, err := container2.StderrPipe()
95 94
 	if err := container2.Start(); err != nil {