net: eliminate arbitrary timeout in TestVariousDeadlines

When we set a timeout, we don't actually have a guarantee one how long
the OS will take to notice it. Moreover, if the test deadlocks
completely (for example, due to a deadline never taking effect), it
would be more useful to get a full goroutine dump instead of the current
"client stuck in Dial+Copy" failure message.

For #37883
For #41863

Change-Id: I9f712ef1c620f97a5ab69baac45deb71134b99bc
Reviewed-on: https://go-review.googlesource.com/c/go/+/371994
Trust: Bryan Mills <bcmills@google.com>
Run-TryBot: Bryan Mills <bcmills@google.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
Bryan C. Mills 2021-12-14 17:07:24 -05:00 committed by Bryan Mills
parent 9d0ca262bb
commit b5c0dbaafc

View file

@ -947,35 +947,23 @@ func testVariousDeadlines(t *testing.T) {
name := fmt.Sprintf("%v %d/%d", timeout, run, numRuns)
t.Log(name)
tooSlow := time.NewTimer(5 * time.Second)
defer tooSlow.Stop()
c, err := Dial(ls.Listener.Addr().Network(), ls.Listener.Addr().String())
if err != nil {
t.Fatal(err)
}
ch := make(chan result, 1)
go func() {
t0 := time.Now()
if err := c.SetDeadline(t0.Add(timeout)); err != nil {
t.Error(err)
}
n, err := io.Copy(io.Discard, c)
dt := time.Since(t0)
c.Close()
ch <- result{n, err, dt}
}()
t0 := time.Now()
if err := c.SetDeadline(t0.Add(timeout)); err != nil {
t.Error(err)
}
n, err := io.Copy(io.Discard, c)
dt := time.Since(t0)
c.Close()
select {
case res := <-ch:
if nerr, ok := res.err.(Error); ok && nerr.Timeout() {
t.Logf("%v: good timeout after %v; %d bytes", name, res.d, res.n)
} else {
t.Fatalf("%v: Copy = %d, %v; want timeout", name, res.n, res.err)
}
case <-tooSlow.C:
t.Fatalf("%v: client stuck in Dial+Copy", name)
if nerr, ok := err.(Error); ok && nerr.Timeout() {
t.Logf("%v: good timeout after %v; %d bytes", name, dt, n)
} else {
t.Fatalf("%v: Copy = %d, %v; want timeout", name, n, err)
}
}
}