net: fix tester goroutine leakage in tests

This change tries to stop various tester goroutines at the end of each
scope for avoiding interference between test cases including benchmarks.
Not yet finished completely but enough to land upcoming changes to Dial
functions. The rest will be fixed later.

Change-Id: Ic38b8681a3a2ddbcd69ba3696f24a61d418a0346
Reviewed-on: https://go-review.googlesource.com/8398
Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/src/net/dial_test.go b/src/net/dial_test.go
index 448faac..d808ae2 100644
--- a/src/net/dial_test.go
+++ b/src/net/dial_test.go
@@ -19,17 +19,6 @@
 	"time"
 )
 
-func newLocalListener(t *testing.T) Listener {
-	ln, err := Listen("tcp", "127.0.0.1:0")
-	if err != nil {
-		ln, err = Listen("tcp6", "[::1]:0")
-	}
-	if err != nil {
-		t.Fatal(err)
-	}
-	return ln
-}
-
 func TestSelfConnect(t *testing.T) {
 	if runtime.GOOS == "windows" {
 		// TODO(brainman): do not know why it hangs.
@@ -249,7 +238,7 @@
 		t.Skip("neither ipv4 nor ipv6 is supported")
 	}
 
-	halfDeadServer := func(dss *dualStackServer, ln Listener) {
+	handler := func(dss *dualStackServer, ln Listener) {
 		for {
 			if c, err := ln.Accept(); err != nil {
 				return
@@ -262,14 +251,14 @@
 		}
 	}
 	dss, err := newDualStackServer([]streamListener{
-		{net: "tcp4", addr: "127.0.0.1"},
-		{net: "tcp6", addr: "[::1]"},
+		{network: "tcp4", address: "127.0.0.1"},
+		{network: "tcp6", address: "::1"},
 	})
 	if err != nil {
 		t.Fatalf("newDualStackServer failed: %v", err)
 	}
 	defer dss.teardown()
-	if err := dss.buildup(halfDeadServer); err != nil {
+	if err := dss.buildup(handler); err != nil {
 		t.Fatalf("dualStackServer.buildup failed: %v", err)
 	}
 
@@ -319,14 +308,9 @@
 	}
 }
 
-func TestDialer(t *testing.T) {
-	ln, err := Listen("tcp4", "127.0.0.1:0")
-	if err != nil {
-		t.Fatalf("Listen failed: %v", err)
-	}
-	defer ln.Close()
+func TestDialerLocalAddr(t *testing.T) {
 	ch := make(chan error, 1)
-	go func() {
+	handler := func(ls *localServer, ln Listener) {
 		c, err := ln.Accept()
 		if err != nil {
 			ch <- fmt.Errorf("Accept failed: %v", err)
@@ -334,14 +318,23 @@
 		}
 		defer c.Close()
 		ch <- nil
-	}()
+	}
+	ls, err := newLocalServer("tcp")
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer ls.teardown()
+	if err := ls.buildup(handler); err != nil {
+		t.Fatal(err)
+	}
 
-	laddr, err := ResolveTCPAddr("tcp4", "127.0.0.1:0")
+	laddr, err := ResolveTCPAddr(ls.Listener.Addr().Network(), ls.Listener.Addr().String())
 	if err != nil {
 		t.Fatalf("ResolveTCPAddr failed: %v", err)
 	}
+	laddr.Port = 0
 	d := &Dialer{LocalAddr: laddr}
-	c, err := d.Dial("tcp4", ln.Addr().String())
+	c, err := d.Dial(ls.Listener.Addr().Network(), ls.Addr().String())
 	if err != nil {
 		t.Fatalf("Dial failed: %v", err)
 	}
@@ -353,7 +346,7 @@
 	}
 }
 
-func TestDialDualStackLocalhost(t *testing.T) {
+func TestDialerDualStack(t *testing.T) {
 	switch runtime.GOOS {
 	case "nacl":
 		t.Skipf("skipping test on %q", runtime.GOOS)
@@ -365,7 +358,7 @@
 		t.Skip("localhost doesn't have a pair of different address family IP addresses")
 	}
 
-	touchAndByeServer := func(dss *dualStackServer, ln Listener) {
+	handler := func(dss *dualStackServer, ln Listener) {
 		for {
 			if c, err := ln.Accept(); err != nil {
 				return
@@ -375,20 +368,20 @@
 		}
 	}
 	dss, err := newDualStackServer([]streamListener{
-		{net: "tcp4", addr: "127.0.0.1"},
-		{net: "tcp6", addr: "[::1]"},
+		{network: "tcp4", address: "127.0.0.1"},
+		{network: "tcp6", address: "::1"},
 	})
 	if err != nil {
 		t.Fatalf("newDualStackServer failed: %v", err)
 	}
 	defer dss.teardown()
-	if err := dss.buildup(touchAndByeServer); err != nil {
+	if err := dss.buildup(handler); err != nil {
 		t.Fatalf("dualStackServer.buildup failed: %v", err)
 	}
 
 	d := &Dialer{DualStack: true}
 	for range dss.lns {
-		if c, err := d.Dial("tcp", "localhost:"+dss.port); err != nil {
+		if c, err := d.Dial("tcp", JoinHostPort("localhost", dss.port)); err != nil {
 			t.Errorf("Dial failed: %v", err)
 		} else {
 			if addr := c.LocalAddr().(*TCPAddr); addr.IP.To4() != nil {
@@ -402,12 +395,7 @@
 }
 
 func TestDialerKeepAlive(t *testing.T) {
-	ln := newLocalListener(t)
-	defer ln.Close()
-	defer func() {
-		testHookSetKeepAlive = func() {}
-	}()
-	go func() {
+	handler := func(ls *localServer, ln Listener) {
 		for {
 			c, err := ln.Accept()
 			if err != nil {
@@ -415,7 +403,19 @@
 			}
 			c.Close()
 		}
+	}
+	ls, err := newLocalServer("tcp")
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer ls.teardown()
+	if err := ls.buildup(handler); err != nil {
+		t.Fatal(err)
+	}
+	defer func() {
+		testHookSetKeepAlive = func() {}
 	}()
+
 	for _, keepAlive := range []bool{false, true} {
 		got := false
 		testHookSetKeepAlive = func() { got = true }
@@ -423,7 +423,7 @@
 		if keepAlive {
 			d.KeepAlive = 30 * time.Second
 		}
-		c, err := d.Dial("tcp", ln.Addr().String())
+		c, err := d.Dial("tcp", ls.Listener.Addr().String())
 		if err != nil {
 			t.Fatal(err)
 		}