From 77a0b96f2f779717f801173aacd35f2b2041dd9e Mon Sep 17 00:00:00 2001 From: Dave Cheney Date: Tue, 9 Apr 2013 11:14:22 +1000 Subject: [PATCH] net: add test for runtime.PollDesc leak See 8318044 R=bradfitz CC=golang-dev https://golang.org/cl/8547043 --- src/pkg/net/dial_test.go | 42 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/pkg/net/dial_test.go b/src/pkg/net/dial_test.go index 098df738b6..62b9a6843e 100644 --- a/src/pkg/net/dial_test.go +++ b/src/pkg/net/dial_test.go @@ -330,3 +330,45 @@ func numFD() int { // All tests using this should be skipped anyway, but: panic("numFDs not implemented on " + runtime.GOOS) } + +// Assert that a failed Dial attempt does not leak +// runtime.PollDesc structures +func TestDialPollDescLeak(t *testing.T) { + // remove once CL 8318044 is submitted + t.Skip("Test skipped pending submission of CL 8318044") + + if testing.Short() { + t.Skip("skipping PollDesc leak test in -short mode") + } + + const loops = 10 + const count = 20000 + 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 + } + failcount := 0 + for i := 0; i < loops; i++ { + for i := 0; i < count; i++ { + conn, err := Dial("tcp", "127.0.0.1:1") + if err == nil { + t.Error("dial should not succeed") + conn.Close() + t.FailNow() + } + } + if delta := sysdelta(); delta > 0 { + failcount++ + } + // there are always some allocations on the first loop + if failcount > 3 { + t.Error("net.Dial leaked memory") + t.FailNow() + } + } +} -- 2.50.0