Skip to content

Commit

Permalink
net/http: deflake TestIssue4191_InfiniteGetTimeout
Browse files Browse the repository at this point in the history
This test exercises the case where a net.Conn error occurs while
writing a response body. It injects an error by setting a timeout
on the Conn. If this timeout expires before response headers are
written, the test fails. The test attempts to recover from this
failure by extending the timeout and retrying.

Set the timeout after the response headers are removed, and
remove the retry loop.

Fixes #56274.

Change-Id: I293f8bedb7b20a21d14f43ea9bb48fc56b59441c
Reviewed-on: https://go-review.googlesource.com/c/go/+/452175
TryBot-Result: Gopher Robot <[email protected]>
Reviewed-by: Bryan Mills <[email protected]>
Run-TryBot: Damien Neil <[email protected]>
  • Loading branch information
neild committed Nov 19, 2022
1 parent c6cdfd8 commit f4f8397
Showing 1 changed file with 14 additions and 34 deletions.
48 changes: 14 additions & 34 deletions src/net/http/transport_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2224,57 +2224,37 @@ func testTransportConcurrency(t *testing.T, mode testMode) {

func TestIssue4191_InfiniteGetTimeout(t *testing.T) { run(t, testIssue4191_InfiniteGetTimeout) }
func testIssue4191_InfiniteGetTimeout(t *testing.T, mode testMode) {
const debug = false
mux := NewServeMux()
mux.HandleFunc("/get", func(w ResponseWriter, r *Request) {
io.Copy(w, neverEnding('a'))
})
ts := newClientServerTest(t, mode, mux).ts
timeout := 100 * time.Millisecond

connc := make(chan net.Conn, 1)
c := ts.Client()
c.Transport.(*Transport).Dial = func(n, addr string) (net.Conn, error) {
conn, err := net.Dial(n, addr)
if err != nil {
return nil, err
}
conn.SetDeadline(time.Now().Add(timeout))
if debug {
conn = NewLoggingConn("client", conn)
select {
case connc <- conn:
default:
}
return conn, nil
}

getFailed := false
nRuns := 5
if testing.Short() {
nRuns = 1
}
for i := 0; i < nRuns; i++ {
if debug {
println("run", i+1, "of", nRuns)
}
sres, err := c.Get(ts.URL + "/get")
if err != nil {
if !getFailed {
// Make the timeout longer, once.
getFailed = true
t.Logf("increasing timeout")
i--
timeout *= 10
continue
}
t.Errorf("Error issuing GET: %v", err)
break
}
_, err = io.Copy(io.Discard, sres.Body)
if err == nil {
t.Errorf("Unexpected successful copy")
break
}
res, err := c.Get(ts.URL + "/get")
if err != nil {
t.Fatalf("Error issuing GET: %v", err)
}
if debug {
println("tests complete; waiting for handlers to finish")
defer res.Body.Close()

conn := <-connc
conn.SetDeadline(time.Now().Add(1 * time.Millisecond))
_, err = io.Copy(io.Discard, res.Body)
if err == nil {
t.Errorf("Unexpected successful copy")
}
}

Expand Down

0 comments on commit f4f8397

Please sign in to comment.