]> Cypherpunks repositories - gostls13.git/commitdiff
net: fix TestInterfaces, TestInterfaceAddrs on platforms without loopback interface
authorMikio Hara <mikioh.mikioh@gmail.com>
Sun, 22 Mar 2015 21:43:43 +0000 (06:43 +0900)
committerMikio Hara <mikioh.mikioh@gmail.com>
Mon, 23 Mar 2015 10:00:34 +0000 (10:00 +0000)
Fixes #10214.

Change-Id: If29d26c590eb53d4976e0a6ace0ed33aaf0c3e80
Reviewed-on: https://go-review.googlesource.com/7924
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
src/net/interface_test.go

index 15c0cd7be4dc73b5954d81b31ab24f2886eed034..16217e7c26dde9079969a457e6396712409715e1 100644 (file)
@@ -47,12 +47,20 @@ func ipv6LinkLocalUnicastAddr(ifi *Interface) string {
        return ""
 }
 
+type routeStats struct {
+       loop  int // # of active loopback interfaces
+       other int // # of active other interfaces
+
+       uni4, uni6     int // # of active connected unicast, anycast routes
+       multi4, multi6 int // # of active connected multicast route clones
+}
+
 func TestInterfaces(t *testing.T) {
        ift, err := Interfaces()
        if err != nil {
                t.Fatal(err)
        }
-       var nifs, naf4, naf6, nmaf4, nmaf6 int
+       var stats routeStats
        for _, ifi := range ift {
                ifxi, err := InterfaceByIndex(ifi.Index)
                if err != nil {
@@ -70,36 +78,53 @@ func TestInterfaces(t *testing.T) {
                }
                t.Logf("%q: flags %q, ifindex %v, mtu %v", ifi.Name, ifi.Flags.String(), ifi.Index, ifi.MTU)
                t.Logf("hardware address %q", ifi.HardwareAddr.String())
-               if ifi.Flags&FlagUp != 0 && ifi.Flags&FlagLoopback == 0 {
-                       nifs++ // active interfaces except loopback interfaces
+               if ifi.Flags&FlagUp != 0 {
+                       if ifi.Flags&FlagLoopback != 0 {
+                               stats.loop++
+                       } else {
+                               stats.other++
+                       }
                }
                n4, n6 := testInterfaceAddrs(t, &ifi)
-               naf4 += n4
-               naf6 += n6
+               stats.uni4 += n4
+               stats.uni6 += n6
                n4, n6 = testInterfaceMulticastAddrs(t, &ifi)
-               nmaf4 += n4
-               nmaf6 += n6
+               stats.multi4 += n4
+               stats.multi6 += n6
        }
        switch runtime.GOOS {
        case "nacl", "plan9", "solaris":
        default:
-               if supportsIPv4 && nifs > 0 && naf4 == 0 {
-                       t.Errorf("got %v; want more than or equal to one", naf4)
+               // Test the existence of connected unicast routes for
+               // IPv4.
+               if supportsIPv4 && stats.loop+stats.other > 0 && stats.uni4 == 0 {
+                       t.Errorf("num IPv4 unicast routes = 0; want >0; summary: %+v", stats)
                }
-               if supportsIPv6 && nifs > 0 && naf6 == 0 {
-                       t.Errorf("got %v; want more than or equal to one", naf6)
+               // Test the existence of connected unicast routes for
+               // IPv6. We can assume the existence of ::1/128 when
+               // at least one looopback interface is installed.
+               if supportsIPv6 && stats.loop > 0 && stats.uni6 == 0 {
+                       t.Errorf("num IPv6 unicast routes = 0; want >0; summary: %+v", stats)
                }
        }
        switch runtime.GOOS {
        case "dragonfly", "nacl", "netbsd", "openbsd", "plan9", "solaris":
        default:
-               // Unlike IPv6, IPv4 multicast capability is not a
-               // mandatory feature.
-               //if supportsIPv4 && nactvifs > 0 && nmaf4 == 0 {
-               //      t.Errorf("got %v; want more than or equal to one", nmaf4)
+               // Test the existence of connected multicast route
+               // clones for IPv4. Unlike IPv6, IPv4 multicast
+               // capability is not a mandatory feature, and so this
+               // test is disabled.
+               //if supportsIPv4 && stats.loop > 0 && stats.uni4 > 1 && stats.multi4 == 0 {
+               //      t.Errorf("num IPv4 multicast route clones = 0; want >0; summary: %+v", stats)
                //}
-               if supportsIPv6 && nifs > 0 && nmaf6 == 0 {
-                       t.Errorf("got %v; want more than or equal to one", nmaf6)
+               // Test the existence of connected multicast route
+               // clones for IPv6. Some platform never uses loopback
+               // interface as the nexthop for multicast routing.
+               // We can assume the existence of connected multicast
+               // route clones when at least two connected unicast
+               // routes, ::1/128 and other, are installed.
+               if supportsIPv6 && stats.loop > 0 && stats.uni6 > 1 && stats.multi6 == 0 {
+                       t.Errorf("num IPv6 multicast route clones = 0; want >0; summary: %+v", stats)
                }
        }
 }
@@ -109,22 +134,30 @@ func TestInterfaceAddrs(t *testing.T) {
        if err != nil {
                t.Fatal(err)
        }
-       var nifs int
+       var stats routeStats
        for _, ifi := range ift {
-               if ifi.Flags&FlagUp != 0 && ifi.Flags&FlagLoopback == 0 {
-                       nifs++ // active interfaces except loopback interfaces
+               if ifi.Flags&FlagUp != 0 {
+                       if ifi.Flags&FlagLoopback != 0 {
+                               stats.loop++
+                       } else {
+                               stats.other++
+                       }
                }
        }
        ifat, err := InterfaceAddrs()
        if err != nil {
                t.Fatal(err)
        }
-       naf4, naf6 := testAddrs(t, ifat)
-       if supportsIPv4 && nifs > 0 && naf4 == 0 {
-               t.Errorf("got %v; want more than or equal to one", naf4)
+       stats.uni4, stats.uni6 = testAddrs(t, ifat)
+       // Test the existence of connected unicast routes for IPv4.
+       if supportsIPv4 && stats.loop+stats.other > 0 && stats.uni4 == 0 {
+               t.Errorf("num IPv4 unicast routes = 0; want >0; summary: %+v", stats)
        }
-       if supportsIPv6 && nifs > 0 && naf6 == 0 {
-               t.Errorf("got %v; want more than or equal to one", naf6)
+       // Test the existence of connected unicast routes for IPv6.
+       // We can assume the existence of ::1/128 when at least one
+       // looopback interface is installed.
+       if supportsIPv6 && stats.loop > 0 && stats.uni6 == 0 {
+               t.Errorf("num IPv6 unicast routes = 0; want >0; summary: %+v", stats)
        }
 }