diff options
Diffstat (limited to 'libgo/go/net/timeout_test.go')
-rw-r--r-- | libgo/go/net/timeout_test.go | 111 |
1 files changed, 64 insertions, 47 deletions
diff --git a/libgo/go/net/timeout_test.go b/libgo/go/net/timeout_test.go index 98e3164fb9..55bbf4402d 100644 --- a/libgo/go/net/timeout_test.go +++ b/libgo/go/net/timeout_test.go @@ -6,6 +6,7 @@ package net import ( "fmt" + "internal/testenv" "io" "io/ioutil" "net/internal/socktest" @@ -26,6 +27,8 @@ var dialTimeoutTests = []struct { {-5 * time.Second, 0, -5 * time.Second, 100 * time.Millisecond}, {0, -5 * time.Second, -5 * time.Second, 100 * time.Millisecond}, {-5 * time.Second, 5 * time.Second, -5 * time.Second, 100 * time.Millisecond}, // timeout over deadline + {-1 << 63, 0, time.Second, 100 * time.Millisecond}, + {0, -1 << 63, time.Second, 100 * time.Millisecond}, {50 * time.Millisecond, 0, 100 * time.Millisecond, time.Second}, {0, 50 * time.Millisecond, 100 * time.Millisecond, time.Second}, @@ -38,19 +41,6 @@ func TestDialTimeout(t *testing.T) { defer func() { testHookDialChannel = origTestHookDialChannel }() defer sw.Set(socktest.FilterConnect, nil) - // Avoid tracking open-close jitterbugs between netFD and - // socket that leads to confusion of information inside - // socktest.Switch. - // It may happen when the Dial call bumps against TCP - // simultaneous open. See selfConnect in tcpsock_posix.go. - defer func() { - sw.Set(socktest.FilterClose, nil) - forceCloseSockets() - }() - sw.Set(socktest.FilterClose, func(so *socktest.Status) (socktest.AfterFilter, error) { - return nil, errTimedout - }) - for i, tt := range dialTimeoutTests { switch runtime.GOOS { case "plan9", "windows": @@ -99,6 +89,56 @@ func TestDialTimeout(t *testing.T) { } } +var dialTimeoutMaxDurationTests = []struct { + timeout time.Duration + delta time.Duration // for deadline +}{ + // Large timeouts that will overflow an int64 unix nanos. + {1<<63 - 1, 0}, + {0, 1<<63 - 1}, +} + +func TestDialTimeoutMaxDuration(t *testing.T) { + if runtime.GOOS == "openbsd" { + testenv.SkipFlaky(t, 15157) + } + + ln, err := newLocalListener("tcp") + if err != nil { + t.Fatal(err) + } + defer ln.Close() + + for i, tt := range dialTimeoutMaxDurationTests { + ch := make(chan error) + max := time.NewTimer(250 * time.Millisecond) + defer max.Stop() + go func() { + d := Dialer{Timeout: tt.timeout} + if tt.delta != 0 { + d.Deadline = time.Now().Add(tt.delta) + } + c, err := d.Dial(ln.Addr().Network(), ln.Addr().String()) + if err == nil { + c.Close() + } + ch <- err + }() + + select { + case <-max.C: + t.Fatalf("#%d: Dial didn't return in an expected time", i) + case err := <-ch: + if perr := parseDialError(err); perr != nil { + t.Error(perr) + } + if err != nil { + t.Errorf("#%d: %v", i, err) + } + } + } +} + var acceptTimeoutTests = []struct { timeout time.Duration xerrs [2]error // expected errors in transition @@ -111,6 +151,7 @@ var acceptTimeoutTests = []struct { } func TestAcceptTimeout(t *testing.T) { + testenv.SkipFlaky(t, 17948) t.Parallel() switch runtime.GOOS { @@ -124,16 +165,18 @@ func TestAcceptTimeout(t *testing.T) { } defer ln.Close() + var wg sync.WaitGroup for i, tt := range acceptTimeoutTests { if tt.timeout < 0 { + wg.Add(1) go func() { - c, err := Dial(ln.Addr().Network(), ln.Addr().String()) + defer wg.Done() + d := Dialer{Timeout: 100 * time.Millisecond} + c, err := d.Dial(ln.Addr().Network(), ln.Addr().String()) if err != nil { t.Error(err) return } - var b [1]byte - c.Read(b[:]) c.Close() }() } @@ -154,13 +197,14 @@ func TestAcceptTimeout(t *testing.T) { } if err == nil { c.Close() - time.Sleep(tt.timeout / 3) + time.Sleep(10 * time.Millisecond) continue } break } } } + wg.Wait() } func TestAcceptTimeoutMustReturn(t *testing.T) { @@ -261,13 +305,6 @@ var readTimeoutTests = []struct { } func TestReadTimeout(t *testing.T) { - t.Parallel() - - switch runtime.GOOS { - case "plan9": - t.Skipf("not supported on %s", runtime.GOOS) - } - handler := func(ls *localServer, ln Listener) { c, err := ln.Accept() if err != nil { @@ -393,7 +430,7 @@ var readFromTimeoutTests = []struct { func TestReadFromTimeout(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9": + case "nacl": t.Skipf("not supported on %s", runtime.GOOS) // see golang.org/issue/8916 } @@ -467,11 +504,6 @@ var writeTimeoutTests = []struct { func TestWriteTimeout(t *testing.T) { t.Parallel() - switch runtime.GOOS { - case "plan9": - t.Skipf("not supported on %s", runtime.GOOS) - } - ln, err := newLocalListener("tcp") if err != nil { t.Fatal(err) @@ -587,7 +619,7 @@ func TestWriteToTimeout(t *testing.T) { t.Parallel() switch runtime.GOOS { - case "nacl", "plan9": + case "nacl": t.Skipf("not supported on %s", runtime.GOOS) } @@ -639,11 +671,6 @@ func TestWriteToTimeout(t *testing.T) { func TestReadTimeoutFluctuation(t *testing.T) { t.Parallel() - switch runtime.GOOS { - case "plan9": - t.Skipf("not supported on %s", runtime.GOOS) - } - ln, err := newLocalListener("tcp") if err != nil { t.Fatal(err) @@ -677,11 +704,6 @@ func TestReadTimeoutFluctuation(t *testing.T) { func TestReadFromTimeoutFluctuation(t *testing.T) { t.Parallel() - switch runtime.GOOS { - case "plan9": - t.Skipf("not supported on %s", runtime.GOOS) - } - c1, err := newLocalPacketListener("udp") if err != nil { t.Fatal(err) @@ -787,11 +809,6 @@ func (b neverEnding) Read(p []byte) (int, error) { } func testVariousDeadlines(t *testing.T) { - switch runtime.GOOS { - case "plan9": - t.Skipf("not supported on %s", runtime.GOOS) - } - type result struct { n int64 err error @@ -988,7 +1005,7 @@ func TestReadWriteDeadlineRace(t *testing.T) { t.Parallel() switch runtime.GOOS { - case "nacl", "plan9": + case "nacl": t.Skipf("not supported on %s", runtime.GOOS) } |