aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/net/timeout_test.go24
1 files changed, 21 insertions, 3 deletions
diff --git a/src/net/timeout_test.go b/src/net/timeout_test.go
index 3a903f8f73..09adb9bdca 100644
--- a/src/net/timeout_test.go
+++ b/src/net/timeout_test.go
@@ -5,6 +5,7 @@
package net
import (
+ "context"
"errors"
"fmt"
"io"
@@ -193,17 +194,34 @@ func TestAcceptTimeout(t *testing.T) {
// incoming connections available. Try to make one available before the
// call to Accept happens. (It's ok if the timing doesn't always work
// out that way, though: the test should pass regardless.)
+ ctx, cancel := context.WithCancel(context.Background())
dialDone := make(chan struct{})
- t.Cleanup(func() { <-dialDone })
+
+ // Ensure that our background Dial returns before we close the listener.
+ // Otherwise, the listener's port could be reused immediately and we
+ // might spuriously Dial some completely unrelated socket, causing some
+ // other test to see an unexpected extra connection.
+ defer func() {
+ cancel()
+ <-dialDone
+ }()
go func() {
defer close(dialDone)
d := Dialer{}
- c, err := d.Dial(ln.Addr().Network(), ln.Addr().String())
+ c, err := d.DialContext(ctx, ln.Addr().Network(), ln.Addr().String())
if err != nil {
- t.Error(err)
+ // If the timing didn't work out, it is possible for this Dial
+ // to return an error (depending on the kernel's buffering behavior).
+ // In https://go.dev/issue/65240 we saw failures with ECONNREFUSED
+ // and ECONNRESET.
+ //
+ // What this test really cares about is the behavior of Accept, not
+ // Dial, so just log the error and ignore it.
+ t.Logf("DialContext: %v", err)
return
}
+ t.Logf("Dialed %v -> %v", c.LocalAddr(), c.RemoteAddr())
c.Close()
}()