aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2017-01-06 01:17:24 -0500
committerRuss Cox <rsc@golang.org>2017-01-06 16:28:57 +0000
commitcb91dccd86ec07ecdc6cd227f0789372e3c75153 (patch)
treed3fb27ccdc11bc7cd402c35c2a56ea3b5736acf0
parent7aefdfded022f9775eb463156eda3a25a658a0ae (diff)
downloadgo-cb91dccd86ec07ecdc6cd227f0789372e3c75153.tar.gz
go-cb91dccd86ec07ecdc6cd227f0789372e3c75153.zip
net/http: better failure in TestTransportPersistConnLeak
If one of the c.Get(ts.URL) results in an error, the child goroutine calls t.Errorf, but the test goroutine gets stuck waiting for <-gotReqCh, so the test hangs and the program is eventually killed (after 10 minutes!). Whatever might have been printed to t.Errorf is never seen. Adjust test so that the test fails cleanly in this case. Still trying to debug why c.Get might fail. It seems to have something to do with occasional connection failures on macOS Sierra. Change-Id: Ia797787bd51ea7cd6deb1192aec89c331c4f2c48 Reviewed-on: https://go-review.googlesource.com/34836 Run-TryBot: Russ Cox <rsc@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
-rw-r--r--src/net/http/transport_test.go19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/net/http/transport_test.go b/src/net/http/transport_test.go
index 5a402657cc..d5ddf6a123 100644
--- a/src/net/http/transport_test.go
+++ b/src/net/http/transport_test.go
@@ -1083,8 +1083,10 @@ func waitNumGoroutine(nmax int) int {
func TestTransportPersistConnLeak(t *testing.T) {
// Not parallel: counts goroutines
defer afterTest(t)
- gotReqCh := make(chan bool)
- unblockCh := make(chan bool)
+
+ const numReq = 25
+ gotReqCh := make(chan bool, numReq)
+ unblockCh := make(chan bool, numReq)
ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
gotReqCh <- true
<-unblockCh
@@ -1098,14 +1100,15 @@ func TestTransportPersistConnLeak(t *testing.T) {
n0 := runtime.NumGoroutine()
- const numReq = 25
- didReqCh := make(chan bool)
+ didReqCh := make(chan bool, numReq)
+ failed := make(chan bool, numReq)
for i := 0; i < numReq; i++ {
go func() {
res, err := c.Get(ts.URL)
didReqCh <- true
if err != nil {
t.Errorf("client fetch error: %v", err)
+ failed <- true
return
}
res.Body.Close()
@@ -1114,7 +1117,13 @@ func TestTransportPersistConnLeak(t *testing.T) {
// Wait for all goroutines to be stuck in the Handler.
for i := 0; i < numReq; i++ {
- <-gotReqCh
+ select {
+ case <-gotReqCh:
+ // ok
+ case <-failed:
+ close(unblockCh)
+ return
+ }
}
nhigh := runtime.NumGoroutine()