From 1e98fb5ad91b956005059ae2148b1dda6fdf372c Mon Sep 17 00:00:00 2001 From: Tonis Tiigi Date: Wed, 11 Jan 2017 12:38:52 -0800 Subject: [PATCH] Fix leaked connections in integration tests Signed-off-by: Tonis Tiigi --- integration-cli/daemon/daemon.go | 2 ++ integration-cli/docker_api_containers_test.go | 1 + integration-cli/docker_api_network_test.go | 9 ++++++--- integration-cli/docker_cli_logs_test.go | 2 +- integration-cli/docker_cli_registry_user_agent_test.go | 4 ++++ integration-cli/docker_cli_run_test.go | 8 ++++++-- integration-cli/docker_cli_v2_only_test.go | 2 ++ integration-cli/registry/registry_mock.go | 5 +++++ integration-cli/request/request.go | 1 + 9 files changed, 28 insertions(+), 6 deletions(-) diff --git a/integration-cli/daemon/daemon.go b/integration-cli/daemon/daemon.go index 67e6066f5b..31ff6a45ce 100644 --- a/integration-cli/daemon/daemon.go +++ b/integration-cli/daemon/daemon.go @@ -180,6 +180,7 @@ func (d *Daemon) getClientConfig() (*clientConfig, error) { if err := sockets.ConfigureTransport(transport, proto, addr); err != nil { return nil, err } + transport.DisableKeepAlives = true return &clientConfig{ transport: transport, @@ -301,6 +302,7 @@ func (d *Daemon) StartWithLogFile(out *os.File, providedArgs ...string) error { if err != nil { continue } + resp.Body.Close() if resp.StatusCode != http.StatusOK { d.log.Logf("[%s] received status != 200 OK: %s\n", d.id, resp.Status) } diff --git a/integration-cli/docker_api_containers_test.go b/integration-cli/docker_api_containers_test.go index 359310a9da..d7e592d79a 100644 --- a/integration-cli/docker_api_containers_test.go +++ b/integration-cli/docker_api_containers_test.go @@ -1169,6 +1169,7 @@ func (s *DockerSuite) TestContainerAPIChunkedEncoding(c *check.C) { return nil }) c.Assert(err, checker.IsNil, check.Commentf("error creating container with chunked encoding")) + defer resp.Body.Close() c.Assert(resp.StatusCode, checker.Equals, http.StatusCreated) } diff --git a/integration-cli/docker_api_network_test.go b/integration-cli/docker_api_network_test.go index b8cbb8dedb..09388f2f54 100644 --- a/integration-cli/docker_api_network_test.go +++ b/integration-cli/docker_api_network_test.go @@ -258,8 +258,9 @@ func createDeletePredefinedNetwork(c *check.C, name string) { func isNetworkAvailable(c *check.C, name string) bool { resp, body, err := request.Get(daemonHost(), "/networks") - c.Assert(resp.StatusCode, checker.Equals, http.StatusOK) c.Assert(err, checker.IsNil) + defer resp.Body.Close() + c.Assert(resp.StatusCode, checker.Equals, http.StatusOK) nJSON := []types.NetworkResource{} err = json.NewDecoder(body).Decode(&nJSON) @@ -308,12 +309,13 @@ func getNetworkResource(c *check.C, id string) *types.NetworkResource { func createNetwork(c *check.C, config types.NetworkCreateRequest, shouldSucceed bool) string { resp, body, err := request.Post(daemonHost(), "/networks/create", request.JSONBody(config)) + c.Assert(err, checker.IsNil) + defer resp.Body.Close() if !shouldSucceed { c.Assert(resp.StatusCode, checker.Not(checker.Equals), http.StatusCreated) return "" } - c.Assert(err, checker.IsNil) c.Assert(resp.StatusCode, checker.Equals, http.StatusCreated) var nr types.NetworkCreateResponse @@ -345,10 +347,11 @@ func disconnectNetwork(c *check.C, nid, cid string) { func deleteNetwork(c *check.C, id string, shouldSucceed bool) { resp, _, err := request.Delete(daemonHost(), "/networks/"+id) + c.Assert(err, checker.IsNil) + defer resp.Body.Close() if !shouldSucceed { c.Assert(resp.StatusCode, checker.Not(checker.Equals), http.StatusOK) return } c.Assert(resp.StatusCode, checker.Equals, http.StatusNoContent) - c.Assert(err, checker.IsNil) } diff --git a/integration-cli/docker_cli_logs_test.go b/integration-cli/docker_cli_logs_test.go index 47fb1ebc51..31dee6bdd7 100644 --- a/integration-cli/docker_cli_logs_test.go +++ b/integration-cli/docker_cli_logs_test.go @@ -288,7 +288,7 @@ func (s *DockerSuite) TestLogsFollowGoroutinesWithStdout(c *check.C) { }() c.Assert(<-chErr, checker.IsNil) c.Assert(cmd.Process.Kill(), checker.IsNil) - + r.Close() // NGoroutines is not updated right away, so we need to wait before failing c.Assert(waitForGoroutines(nroutines), checker.IsNil) } diff --git a/integration-cli/docker_cli_registry_user_agent_test.go b/integration-cli/docker_cli_registry_user_agent_test.go index 7d1989e2b3..7becca4b95 100644 --- a/integration-cli/docker_cli_registry_user_agent_test.go +++ b/integration-cli/docker_cli_registry_user_agent_test.go @@ -72,21 +72,25 @@ func (s *DockerRegistrySuite) TestUserAgentPassThrough(c *check.C) { ) buildReg, err := registry.NewMock(c) + defer buildReg.Close() c.Assert(err, check.IsNil) registerUserAgentHandler(buildReg, &buildUA) buildRepoName := fmt.Sprintf("%s/busybox", buildReg.URL()) pullReg, err := registry.NewMock(c) + defer pullReg.Close() c.Assert(err, check.IsNil) registerUserAgentHandler(pullReg, &pullUA) pullRepoName := fmt.Sprintf("%s/busybox", pullReg.URL()) pushReg, err := registry.NewMock(c) + defer pushReg.Close() c.Assert(err, check.IsNil) registerUserAgentHandler(pushReg, &pushUA) pushRepoName := fmt.Sprintf("%s/busybox", pushReg.URL()) loginReg, err := registry.NewMock(c) + defer loginReg.Close() c.Assert(err, check.IsNil) registerUserAgentHandler(loginReg, &loginUA) diff --git a/integration-cli/docker_cli_run_test.go b/integration-cli/docker_cli_run_test.go index 6f3d11b59e..883fd8a67e 100644 --- a/integration-cli/docker_cli_run_test.go +++ b/integration-cli/docker_cli_run_test.go @@ -3102,12 +3102,16 @@ func (s *DockerSuite) TestRunUnshareProc(c *check.C) { } }() + var retErr error for i := 0; i < 3; i++ { err := <-errChan - if err != nil { - c.Fatal(err) + if retErr == nil && err != nil { + retErr = err } } + if retErr != nil { + c.Fatal(retErr) + } } func (s *DockerSuite) TestRunPublishPort(c *check.C) { diff --git a/integration-cli/docker_cli_v2_only_test.go b/integration-cli/docker_cli_v2_only_test.go index 6e0d944590..77974c4ef4 100644 --- a/integration-cli/docker_cli_v2_only_test.go +++ b/integration-cli/docker_cli_v2_only_test.go @@ -38,6 +38,7 @@ func makefile(contents string) (string, func(), error) { // attempt to contact any v1 registry endpoints. func (s *DockerRegistrySuite) TestV2Only(c *check.C) { reg, err := registry.NewMock(c) + defer reg.Close() c.Assert(err, check.IsNil) reg.RegisterHandler("/v2/", func(w http.ResponseWriter, r *http.Request) { @@ -70,6 +71,7 @@ func (s *DockerRegistrySuite) TestV2Only(c *check.C) { // login, push, pull, build & run func (s *DockerRegistrySuite) TestV1(c *check.C) { reg, err := registry.NewMock(c) + defer reg.Close() c.Assert(err, check.IsNil) v2Pings := 0 diff --git a/integration-cli/registry/registry_mock.go b/integration-cli/registry/registry_mock.go index 5d1980f81c..e70967fdd6 100644 --- a/integration-cli/registry/registry_mock.go +++ b/integration-cli/registry/registry_mock.go @@ -59,3 +59,8 @@ func NewMock(t testingT) (*Mock, error) { func (tr *Mock) URL() string { return tr.hostport } + +// Close closes mock and releases resources +func (tr *Mock) Close() { + tr.server.Close() +} diff --git a/integration-cli/request/request.go b/integration-cli/request/request.go index 72e15b73d0..fabc90ccfc 100644 --- a/integration-cli/request/request.go +++ b/integration-cli/request/request.go @@ -129,6 +129,7 @@ func NewClient(host string) (*http.Client, error) { } transport = &http.Transport{TLSClientConfig: tlsConfig} } + transport.DisableKeepAlives = true err = sockets.ConfigureTransport(transport, proto, addr) return &http.Client{ Transport: transport,