Skip to content

Commit 0d87f6a

Browse files
committed
net/http: deflake TestServerTimeouts
Retry the test several times with increasingly long timeouts. Fixes #19538 (hopefully) Change-Id: Ia3bf2b63b4298a6ee1e4082e14d9bfd5922c293a Reviewed-on: https://go-review.googlesource.com/38154 Run-TryBot: Brad Fitzpatrick <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Josh Bleecher Snyder <[email protected]>
1 parent 50520f1 commit 0d87f6a

File tree

1 file changed

+32
-13
lines changed

1 file changed

+32
-13
lines changed

src/net/http/serve_test.go

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -463,74 +463,93 @@ func TestMuxRedirectLeadingSlashes(t *testing.T) {
463463
func TestServerTimeouts(t *testing.T) {
464464
setParallel(t)
465465
defer afterTest(t)
466+
// Try three times, with increasing timeouts.
467+
tries := []time.Duration{250 * time.Millisecond, 500 * time.Millisecond, 1 * time.Second}
468+
for i, timeout := range tries {
469+
err := testServerTimeouts(timeout)
470+
if err == nil {
471+
return
472+
}
473+
t.Logf("failed at %v: %v", timeout, err)
474+
if i != len(tries)-1 {
475+
t.Logf("retrying at %v ...", tries[i+1])
476+
}
477+
}
478+
t.Fatal("all attempts failed")
479+
}
480+
481+
func testServerTimeouts(timeout time.Duration) error {
466482
reqNum := 0
467483
ts := httptest.NewUnstartedServer(HandlerFunc(func(res ResponseWriter, req *Request) {
468484
reqNum++
469485
fmt.Fprintf(res, "req=%d", reqNum)
470486
}))
471-
ts.Config.ReadTimeout = 250 * time.Millisecond
472-
ts.Config.WriteTimeout = 250 * time.Millisecond
487+
ts.Config.ReadTimeout = timeout
488+
ts.Config.WriteTimeout = timeout
473489
ts.Start()
474490
defer ts.Close()
475491

476492
// Hit the HTTP server successfully.
477493
c := ts.Client()
478494
r, err := c.Get(ts.URL)
479495
if err != nil {
480-
t.Fatalf("http Get #1: %v", err)
496+
return fmt.Errorf("http Get #1: %v", err)
481497
}
482498
got, err := ioutil.ReadAll(r.Body)
483499
expected := "req=1"
484500
if string(got) != expected || err != nil {
485-
t.Errorf("Unexpected response for request #1; got %q ,%v; expected %q, nil",
501+
return fmt.Errorf("Unexpected response for request #1; got %q ,%v; expected %q, nil",
486502
string(got), err, expected)
487503
}
488504

489505
// Slow client that should timeout.
490506
t1 := time.Now()
491507
conn, err := net.Dial("tcp", ts.Listener.Addr().String())
492508
if err != nil {
493-
t.Fatalf("Dial: %v", err)
509+
return fmt.Errorf("Dial: %v", err)
494510
}
495511
buf := make([]byte, 1)
496512
n, err := conn.Read(buf)
497513
conn.Close()
498514
latency := time.Since(t1)
499515
if n != 0 || err != io.EOF {
500-
t.Errorf("Read = %v, %v, wanted %v, %v", n, err, 0, io.EOF)
516+
return fmt.Errorf("Read = %v, %v, wanted %v, %v", n, err, 0, io.EOF)
501517
}
502-
if latency < 200*time.Millisecond /* fudge from 250 ms above */ {
503-
t.Errorf("got EOF after %s, want >= %s", latency, 200*time.Millisecond)
518+
minLatency := timeout / 5 * 4
519+
if latency < minLatency {
520+
return fmt.Errorf("got EOF after %s, want >= %s", latency, minLatency)
504521
}
505522

506523
// Hit the HTTP server successfully again, verifying that the
507524
// previous slow connection didn't run our handler. (that we
508525
// get "req=2", not "req=3")
509526
r, err = c.Get(ts.URL)
510527
if err != nil {
511-
t.Fatalf("http Get #2: %v", err)
528+
return fmt.Errorf("http Get #2: %v", err)
512529
}
513530
got, err = ioutil.ReadAll(r.Body)
531+
r.Body.Close()
514532
expected = "req=2"
515533
if string(got) != expected || err != nil {
516-
t.Errorf("Get #2 got %q, %v, want %q, nil", string(got), err, expected)
534+
return fmt.Errorf("Get #2 got %q, %v, want %q, nil", string(got), err, expected)
517535
}
518536

519537
if !testing.Short() {
520538
conn, err := net.Dial("tcp", ts.Listener.Addr().String())
521539
if err != nil {
522-
t.Fatalf("Dial: %v", err)
540+
return fmt.Errorf("long Dial: %v", err)
523541
}
524542
defer conn.Close()
525543
go io.Copy(ioutil.Discard, conn)
526544
for i := 0; i < 5; i++ {
527545
_, err := conn.Write([]byte("GET / HTTP/1.1\r\nHost: foo\r\n\r\n"))
528546
if err != nil {
529-
t.Fatalf("on write %d: %v", i, err)
547+
return fmt.Errorf("on write %d: %v", i, err)
530548
}
531-
time.Sleep(ts.Config.ReadTimeout / 2)
549+
time.Sleep(timeout / 2)
532550
}
533551
}
552+
return nil
534553
}
535554

536555
// Test that the HTTP/2 server handles Server.WriteTimeout (Issue 18437)

0 commit comments

Comments
 (0)