net: don't run IP stack required tests on IP stack disabled kernels

This change doesn't work perfectly on IPv6-only kernels including CLAT
enabled kernels, but works enough on IPv4-only kernels.

Fixes #10721.
Updates #10729.

Change-Id: I7db0e572e252aa0a9f9f54c8e557955077b72e44
Reviewed-on: https://go-review.googlesource.com/9777
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/src/net/dial_test.go b/src/net/dial_test.go
index fab5262..f5141bc 100644
--- a/src/net/dial_test.go
+++ b/src/net/dial_test.go
@@ -155,7 +155,7 @@
 		t.Skipf("not implemented a way to cancel dial racers in TCP SYN-SENT state on %s", runtime.GOOS)
 	}
 	if !supportsIPv4 || !supportsIPv6 {
-		t.Skip("ipv4 or ipv6 is not supported")
+		t.Skip("both IPv4 and IPv6 are required")
 	}
 
 	origTestHookLookupIP := testHookLookupIP
@@ -247,7 +247,7 @@
 
 func TestDialerDualStack(t *testing.T) {
 	if !supportsIPv4 || !supportsIPv6 {
-		t.Skip("ipv4 or ipv6 is not supported")
+		t.Skip("both IPv4 and IPv6 are required")
 	}
 
 	origTestHookLookupIP := testHookLookupIP
diff --git a/src/net/ipsock_test.go b/src/net/ipsock_test.go
index c06f15e..b36557a 100644
--- a/src/net/ipsock_test.go
+++ b/src/net/ipsock_test.go
@@ -216,7 +216,7 @@
 
 func TestAddrList(t *testing.T) {
 	if !supportsIPv4 || !supportsIPv6 {
-		t.Skip("ipv4 or ipv6 is not supported")
+		t.Skip("both IPv4 and IPv6 are required")
 	}
 
 	for i, tt := range addrListTests {
diff --git a/src/net/listen_test.go b/src/net/listen_test.go
index 995792b..8f43c84 100644
--- a/src/net/listen_test.go
+++ b/src/net/listen_test.go
@@ -218,9 +218,14 @@
 // listening address and same port.
 func TestDualStackTCPListener(t *testing.T) {
 	switch runtime.GOOS {
+	case "dragonfly":
+		t.Skip("not supported on DragonFly, see golang.org/issue/10729")
 	case "nacl", "plan9":
 		t.Skipf("not supported on %s", runtime.GOOS)
 	}
+	if !supportsIPv4 || !supportsIPv6 {
+		t.Skip("both IPv4 and IPv6 are required")
+	}
 
 	for _, tt := range dualStackTCPListenerTests {
 		if !testableListenArgs(tt.network1, JoinHostPort(tt.address1, "0"), "") {
@@ -305,6 +310,9 @@
 	case "nacl", "plan9":
 		t.Skipf("not supported on %s", runtime.GOOS)
 	}
+	if !supportsIPv4 || !supportsIPv6 {
+		t.Skip("both IPv4 and IPv6 are required")
+	}
 
 	for _, tt := range dualStackUDPListenerTests {
 		if !testableListenArgs(tt.network1, JoinHostPort(tt.address1, "0"), "") {
diff --git a/src/net/platform_test.go b/src/net/platform_test.go
index eb680b8..b700091 100644
--- a/src/net/platform_test.go
+++ b/src/net/platform_test.go
@@ -103,15 +103,26 @@
 		return false
 	}
 
-	// Test functionality of IPv6 communication using AF_INET6
-	// sockets.
+	// Test functionality of IPv4 communication using AF_INET and
+	// IPv6 communication using AF_INET6 sockets.
+	if !supportsIPv4 && ip.To4() != nil {
+		return false
+	}
 	if !supportsIPv6 && ip.To16() != nil && ip.To4() == nil {
 		return false
 	}
+	cip := ParseIP(client)
+	if cip != nil {
+		if !supportsIPv4 && cip.To4() != nil {
+			return false
+		}
+		if !supportsIPv6 && cip.To16() != nil && cip.To4() == nil {
+			return false
+		}
+	}
 
 	// Test functionality of IPv4 communication using AF_INET6
 	// sockets.
-	cip := ParseIP(client)
 	if !supportsIPv4map && (network == "tcp" || network == "udp" || network == "ip") && wildcard {
 		// At this point, we prefer IPv4 when ip is nil.
 		// See favoriteAddrFamily for further information.