Browse code

Fix leaked connections in integration tests

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>

Tonis Tiigi authored on 2017/01/12 05:38:52
Showing 9 changed files
... ...
@@ -180,6 +180,7 @@ func (d *Daemon) getClientConfig() (*clientConfig, error) {
180 180
 	if err := sockets.ConfigureTransport(transport, proto, addr); err != nil {
181 181
 		return nil, err
182 182
 	}
183
+	transport.DisableKeepAlives = true
183 184
 
184 185
 	return &clientConfig{
185 186
 		transport: transport,
... ...
@@ -301,6 +302,7 @@ func (d *Daemon) StartWithLogFile(out *os.File, providedArgs ...string) error {
301 301
 			if err != nil {
302 302
 				continue
303 303
 			}
304
+			resp.Body.Close()
304 305
 			if resp.StatusCode != http.StatusOK {
305 306
 				d.log.Logf("[%s] received status != 200 OK: %s\n", d.id, resp.Status)
306 307
 			}
... ...
@@ -1169,6 +1169,7 @@ func (s *DockerSuite) TestContainerAPIChunkedEncoding(c *check.C) {
1169 1169
 		return nil
1170 1170
 	})
1171 1171
 	c.Assert(err, checker.IsNil, check.Commentf("error creating container with chunked encoding"))
1172
+	defer resp.Body.Close()
1172 1173
 	c.Assert(resp.StatusCode, checker.Equals, http.StatusCreated)
1173 1174
 }
1174 1175
 
... ...
@@ -258,8 +258,9 @@ func createDeletePredefinedNetwork(c *check.C, name string) {
258 258
 
259 259
 func isNetworkAvailable(c *check.C, name string) bool {
260 260
 	resp, body, err := request.Get(daemonHost(), "/networks")
261
-	c.Assert(resp.StatusCode, checker.Equals, http.StatusOK)
262 261
 	c.Assert(err, checker.IsNil)
262
+	defer resp.Body.Close()
263
+	c.Assert(resp.StatusCode, checker.Equals, http.StatusOK)
263 264
 
264 265
 	nJSON := []types.NetworkResource{}
265 266
 	err = json.NewDecoder(body).Decode(&nJSON)
... ...
@@ -308,12 +309,13 @@ func getNetworkResource(c *check.C, id string) *types.NetworkResource {
308 308
 
309 309
 func createNetwork(c *check.C, config types.NetworkCreateRequest, shouldSucceed bool) string {
310 310
 	resp, body, err := request.Post(daemonHost(), "/networks/create", request.JSONBody(config))
311
+	c.Assert(err, checker.IsNil)
312
+	defer resp.Body.Close()
311 313
 	if !shouldSucceed {
312 314
 		c.Assert(resp.StatusCode, checker.Not(checker.Equals), http.StatusCreated)
313 315
 		return ""
314 316
 	}
315 317
 
316
-	c.Assert(err, checker.IsNil)
317 318
 	c.Assert(resp.StatusCode, checker.Equals, http.StatusCreated)
318 319
 
319 320
 	var nr types.NetworkCreateResponse
... ...
@@ -345,10 +347,11 @@ func disconnectNetwork(c *check.C, nid, cid string) {
345 345
 
346 346
 func deleteNetwork(c *check.C, id string, shouldSucceed bool) {
347 347
 	resp, _, err := request.Delete(daemonHost(), "/networks/"+id)
348
+	c.Assert(err, checker.IsNil)
349
+	defer resp.Body.Close()
348 350
 	if !shouldSucceed {
349 351
 		c.Assert(resp.StatusCode, checker.Not(checker.Equals), http.StatusOK)
350 352
 		return
351 353
 	}
352 354
 	c.Assert(resp.StatusCode, checker.Equals, http.StatusNoContent)
353
-	c.Assert(err, checker.IsNil)
354 355
 }
... ...
@@ -288,7 +288,7 @@ func (s *DockerSuite) TestLogsFollowGoroutinesWithStdout(c *check.C) {
288 288
 	}()
289 289
 	c.Assert(<-chErr, checker.IsNil)
290 290
 	c.Assert(cmd.Process.Kill(), checker.IsNil)
291
-
291
+	r.Close()
292 292
 	// NGoroutines is not updated right away, so we need to wait before failing
293 293
 	c.Assert(waitForGoroutines(nroutines), checker.IsNil)
294 294
 }
... ...
@@ -72,21 +72,25 @@ func (s *DockerRegistrySuite) TestUserAgentPassThrough(c *check.C) {
72 72
 	)
73 73
 
74 74
 	buildReg, err := registry.NewMock(c)
75
+	defer buildReg.Close()
75 76
 	c.Assert(err, check.IsNil)
76 77
 	registerUserAgentHandler(buildReg, &buildUA)
77 78
 	buildRepoName := fmt.Sprintf("%s/busybox", buildReg.URL())
78 79
 
79 80
 	pullReg, err := registry.NewMock(c)
81
+	defer pullReg.Close()
80 82
 	c.Assert(err, check.IsNil)
81 83
 	registerUserAgentHandler(pullReg, &pullUA)
82 84
 	pullRepoName := fmt.Sprintf("%s/busybox", pullReg.URL())
83 85
 
84 86
 	pushReg, err := registry.NewMock(c)
87
+	defer pushReg.Close()
85 88
 	c.Assert(err, check.IsNil)
86 89
 	registerUserAgentHandler(pushReg, &pushUA)
87 90
 	pushRepoName := fmt.Sprintf("%s/busybox", pushReg.URL())
88 91
 
89 92
 	loginReg, err := registry.NewMock(c)
93
+	defer loginReg.Close()
90 94
 	c.Assert(err, check.IsNil)
91 95
 	registerUserAgentHandler(loginReg, &loginUA)
92 96
 
... ...
@@ -3102,12 +3102,16 @@ func (s *DockerSuite) TestRunUnshareProc(c *check.C) {
3102 3102
 		}
3103 3103
 	}()
3104 3104
 
3105
+	var retErr error
3105 3106
 	for i := 0; i < 3; i++ {
3106 3107
 		err := <-errChan
3107
-		if err != nil {
3108
-			c.Fatal(err)
3108
+		if retErr == nil && err != nil {
3109
+			retErr = err
3109 3110
 		}
3110 3111
 	}
3112
+	if retErr != nil {
3113
+		c.Fatal(retErr)
3114
+	}
3111 3115
 }
3112 3116
 
3113 3117
 func (s *DockerSuite) TestRunPublishPort(c *check.C) {
... ...
@@ -38,6 +38,7 @@ func makefile(contents string) (string, func(), error) {
38 38
 // attempt to contact any v1 registry endpoints.
39 39
 func (s *DockerRegistrySuite) TestV2Only(c *check.C) {
40 40
 	reg, err := registry.NewMock(c)
41
+	defer reg.Close()
41 42
 	c.Assert(err, check.IsNil)
42 43
 
43 44
 	reg.RegisterHandler("/v2/", func(w http.ResponseWriter, r *http.Request) {
... ...
@@ -70,6 +71,7 @@ func (s *DockerRegistrySuite) TestV2Only(c *check.C) {
70 70
 // login, push, pull, build & run
71 71
 func (s *DockerRegistrySuite) TestV1(c *check.C) {
72 72
 	reg, err := registry.NewMock(c)
73
+	defer reg.Close()
73 74
 	c.Assert(err, check.IsNil)
74 75
 
75 76
 	v2Pings := 0
... ...
@@ -59,3 +59,8 @@ func NewMock(t testingT) (*Mock, error) {
59 59
 func (tr *Mock) URL() string {
60 60
 	return tr.hostport
61 61
 }
62
+
63
+// Close closes mock and releases resources
64
+func (tr *Mock) Close() {
65
+	tr.server.Close()
66
+}
... ...
@@ -129,6 +129,7 @@ func NewClient(host string) (*http.Client, error) {
129 129
 		}
130 130
 		transport = &http.Transport{TLSClientConfig: tlsConfig}
131 131
 	}
132
+	transport.DisableKeepAlives = true
132 133
 	err = sockets.ConfigureTransport(transport, proto, addr)
133 134
 	return &http.Client{
134 135
 		Transport: transport,