Browse code

Merge pull request #5102 from shykes/api-cleanup-tests

Make remote API unit tests easier to read and write

Victor Vieux authored on 2014/04/10 02:27:03
Showing 1 changed files
... ...
@@ -1,6 +1,8 @@
1 1
 package server
2 2
 
3 3
 import (
4
+	"bytes"
5
+	"encoding/json"
4 6
 	"fmt"
5 7
 	"github.com/dotcloud/docker/api"
6 8
 	"github.com/dotcloud/docker/engine"
... ...
@@ -57,15 +59,8 @@ func TesthttpError(t *testing.T) {
57 57
 }
58 58
 
59 59
 func TestGetVersion(t *testing.T) {
60
-	tmp, err := utils.TestDirectory("")
61
-	if err != nil {
62
-		t.Fatal(err)
63
-	}
64
-	defer os.RemoveAll(tmp)
65
-	eng, err := engine.New(tmp)
66
-	if err != nil {
67
-		t.Fatal(err)
68
-	}
60
+	eng := tmpEngine(t)
61
+	defer rmEngine(eng)
69 62
 	var called bool
70 63
 	eng.Register("version", func(job *engine.Job) engine.Status {
71 64
 		called = true
... ...
@@ -80,49 +75,22 @@ func TestGetVersion(t *testing.T) {
80 80
 		}
81 81
 		return engine.StatusOK
82 82
 	})
83
-
84
-	r := httptest.NewRecorder()
85
-	req, err := http.NewRequest("GET", "/version", nil)
86
-	if err != nil {
87
-		t.Fatal(err)
88
-	}
89
-	// FIXME getting the version should require an actual running Server
90
-	if err := ServeRequest(eng, api.APIVERSION, r, req); err != nil {
91
-		t.Fatal(err)
92
-	}
83
+	r := serveRequest("GET", "/version", nil, eng, t)
93 84
 	if !called {
94 85
 		t.Fatalf("handler was not called")
95 86
 	}
96
-	out := engine.NewOutput()
97
-	v, err := out.AddEnv()
98
-	if err != nil {
99
-		t.Fatal(err)
100
-	}
101
-	if _, err := io.Copy(out, r.Body); err != nil {
102
-		t.Fatal(err)
103
-	}
104
-	out.Close()
105
-	expected := "42.1"
106
-	if result := v.Get("Version"); result != expected {
107
-		t.Errorf("Expected version %s, %s found", expected, result)
87
+	v := readEnv(r.Body, t)
88
+	if v.Get("Version") != "42.1" {
89
+		t.Fatalf("%#v\n", v)
108 90
 	}
109
-	expected = "application/json"
110
-	if result := r.HeaderMap.Get("Content-Type"); result != expected {
111
-		t.Errorf("Expected Content-Type %s, %s found", expected, result)
91
+	if r.HeaderMap.Get("Content-Type") != "application/json" {
92
+		t.Fatalf("%#v\n", r)
112 93
 	}
113 94
 }
114 95
 
115 96
 func TestGetInfo(t *testing.T) {
116
-	tmp, err := utils.TestDirectory("")
117
-	if err != nil {
118
-		t.Fatal(err)
119
-	}
120
-	defer os.RemoveAll(tmp)
121
-	eng, err := engine.New(tmp)
122
-	if err != nil {
123
-		t.Fatal(err)
124
-	}
125
-
97
+	eng := tmpEngine(t)
98
+	defer rmEngine(eng)
126 99
 	var called bool
127 100
 	eng.Register("info", func(job *engine.Job) engine.Status {
128 101
 		called = true
... ...
@@ -134,47 +102,67 @@ func TestGetInfo(t *testing.T) {
134 134
 		}
135 135
 		return engine.StatusOK
136 136
 	})
137
+	r := serveRequest("GET", "/info", nil, eng, t)
138
+	if !called {
139
+		t.Fatalf("handler was not called")
140
+	}
141
+	v := readEnv(r.Body, t)
142
+	if v.GetInt("Images") != 42000 {
143
+		t.Fatalf("%#v\n", v)
144
+	}
145
+	if v.GetInt("Containers") != 1 {
146
+		t.Fatalf("%#v\n", v)
147
+	}
148
+	if r.HeaderMap.Get("Content-Type") != "application/json" {
149
+		t.Fatalf("%#v\n", r)
150
+	}
151
+}
137 152
 
153
+func serveRequest(method, target string, body io.Reader, eng *engine.Engine, t *testing.T) *httptest.ResponseRecorder {
138 154
 	r := httptest.NewRecorder()
139
-	req, err := http.NewRequest("GET", "/info", nil)
155
+	req, err := http.NewRequest(method, target, body)
140 156
 	if err != nil {
141 157
 		t.Fatal(err)
142 158
 	}
143
-	// FIXME getting the version should require an actual running Server
144 159
 	if err := ServeRequest(eng, api.APIVERSION, r, req); err != nil {
145 160
 		t.Fatal(err)
146 161
 	}
147
-	if !called {
148
-		t.Fatalf("handler was not called")
162
+	return r
163
+}
164
+
165
+func tmpEngine(t *testing.T) *engine.Engine {
166
+	tmp, err := utils.TestDirectory("")
167
+	if err != nil {
168
+		t.Fatal(err)
149 169
 	}
170
+	eng, err := engine.New(tmp)
171
+	if err != nil {
172
+		t.Fatal(err)
173
+	}
174
+	return eng
175
+}
150 176
 
177
+func rmEngine(eng *engine.Engine) {
178
+	os.RemoveAll(eng.Root())
179
+}
180
+
181
+func readEnv(src io.Reader, t *testing.T) *engine.Env {
151 182
 	out := engine.NewOutput()
152
-	i, err := out.AddEnv()
183
+	v, err := out.AddEnv()
153 184
 	if err != nil {
154 185
 		t.Fatal(err)
155 186
 	}
156
-	if _, err := io.Copy(out, r.Body); err != nil {
187
+	if _, err := io.Copy(out, src); err != nil {
157 188
 		t.Fatal(err)
158 189
 	}
159 190
 	out.Close()
160
-	{
161
-		expected := 42000
162
-		result := i.GetInt("Images")
163
-		if expected != result {
164
-			t.Fatalf("%#v\n", result)
165
-		}
166
-	}
167
-	{
168
-		expected := 1
169
-		result := i.GetInt("Containers")
170
-		if expected != result {
171
-			t.Fatalf("%#v\n", result)
172
-		}
173
-	}
174
-	{
175
-		expected := "application/json"
176
-		if result := r.HeaderMap.Get("Content-Type"); result != expected {
177
-			t.Fatalf("%#v\n", result)
178
-		}
191
+	return v
192
+}
193
+
194
+func toJson(data interface{}, t *testing.T) io.Reader {
195
+	var buf bytes.Buffer
196
+	if err := json.NewEncoder(&buf).Encode(data); err != nil {
197
+		t.Fatal(err)
179 198
 	}
199
+	return &buf
180 200
 }