diff options
Diffstat (limited to 'src/pkg/net/dial_test.go')
-rw-r--r-- | src/pkg/net/dial_test.go | 93 |
1 files changed, 36 insertions, 57 deletions
diff --git a/src/pkg/net/dial_test.go b/src/pkg/net/dial_test.go index f1d813f41..f9260fd28 100644 --- a/src/pkg/net/dial_test.go +++ b/src/pkg/net/dial_test.go @@ -58,7 +58,7 @@ func TestDialTimeout(t *testing.T) { errc <- err }() } - case "darwin", "windows": + case "darwin", "plan9", "windows": // At least OS X 10.7 seems to accept any number of // connections, ignoring listen's backlog, so resort // to connecting to a hopefully-dead 127/8 address. @@ -141,13 +141,13 @@ func TestSelfConnect(t *testing.T) { n = 1000 } switch runtime.GOOS { - case "darwin", "dragonfly", "freebsd", "netbsd", "openbsd", "plan9", "windows": + case "darwin", "dragonfly", "freebsd", "netbsd", "openbsd", "plan9", "solaris", "windows": // Non-Linux systems take a long time to figure // out that there is nothing listening on localhost. n = 100 } for i := 0; i < n; i++ { - c, err := Dial("tcp", addr) + c, err := DialTimeout("tcp", addr, time.Millisecond) if err == nil { c.Close() t.Errorf("#%d: Dial %q succeeded", i, addr) @@ -425,60 +425,6 @@ func numFD() int { panic("numFDs not implemented on " + runtime.GOOS) } -// Assert that a failed Dial attempt does not leak -// runtime.PollDesc structures -func TestDialFailPDLeak(t *testing.T) { - if testing.Short() { - t.Skip("skipping test in short mode") - } - if runtime.GOOS == "windows" && runtime.GOARCH == "386" { - // Just skip the test because it takes too long. - t.Skipf("skipping test on %q/%q", runtime.GOOS, runtime.GOARCH) - } - - maxprocs := runtime.GOMAXPROCS(0) - loops := 10 + maxprocs - // 500 is enough to turn over the chunk of pollcache. - // See allocPollDesc in runtime/netpoll.goc. - const count = 500 - var old runtime.MemStats // used by sysdelta - runtime.ReadMemStats(&old) - sysdelta := func() uint64 { - var new runtime.MemStats - runtime.ReadMemStats(&new) - delta := old.Sys - new.Sys - old = new - return delta - } - d := &Dialer{Timeout: time.Nanosecond} // don't bother TCP with handshaking - failcount := 0 - for i := 0; i < loops; i++ { - var wg sync.WaitGroup - for i := 0; i < count; i++ { - wg.Add(1) - go func() { - defer wg.Done() - if c, err := d.Dial("tcp", "127.0.0.1:1"); err == nil { - t.Error("dial should not succeed") - c.Close() - } - }() - } - wg.Wait() - if t.Failed() { - t.FailNow() - } - if delta := sysdelta(); delta > 0 { - failcount++ - } - // there are always some allocations on the first loop - if failcount > maxprocs+2 { - t.Error("detected possible memory leak in runtime") - t.FailNow() - } - } -} - func TestDialer(t *testing.T) { ln, err := Listen("tcp4", "127.0.0.1:0") if err != nil { @@ -555,3 +501,36 @@ func TestDialDualStackLocalhost(t *testing.T) { } } } + +func TestDialerKeepAlive(t *testing.T) { + ln := newLocalListener(t) + defer ln.Close() + defer func() { + testHookSetKeepAlive = func() {} + }() + go func() { + for { + c, err := ln.Accept() + if err != nil { + return + } + c.Close() + } + }() + for _, keepAlive := range []bool{false, true} { + got := false + testHookSetKeepAlive = func() { got = true } + var d Dialer + if keepAlive { + d.KeepAlive = 30 * time.Second + } + c, err := d.Dial("tcp", ln.Addr().String()) + if err != nil { + t.Fatal(err) + } + c.Close() + if got != keepAlive { + t.Errorf("Dialer.KeepAlive = %v: SetKeepAlive called = %v, want %v", d.KeepAlive, got, !got) + } + } +} |