aboutsummaryrefslogtreecommitdiff
path: root/libgo/go/net/interface_windows_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/net/interface_windows_test.go')
-rw-r--r--libgo/go/net/interface_windows_test.go132
1 files changed, 132 insertions, 0 deletions
diff --git a/libgo/go/net/interface_windows_test.go b/libgo/go/net/interface_windows_test.go
new file mode 100644
index 00000000000..03f9168b482
--- /dev/null
+++ b/libgo/go/net/interface_windows_test.go
@@ -0,0 +1,132 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package net
+
+import (
+ "bytes"
+ "internal/syscall/windows"
+ "sort"
+ "testing"
+)
+
+func TestWindowsInterfaces(t *testing.T) {
+ aas, err := adapterAddresses()
+ if err != nil {
+ t.Fatal(err)
+ }
+ ift, err := Interfaces()
+ if err != nil {
+ t.Fatal(err)
+ }
+ for i, ifi := range ift {
+ aa := aas[i]
+ if len(ifi.HardwareAddr) != int(aa.PhysicalAddressLength) {
+ t.Errorf("got %d; want %d", len(ifi.HardwareAddr), aa.PhysicalAddressLength)
+ }
+ if ifi.MTU > 0x7fffffff {
+ t.Errorf("%s: got %d; want less than or equal to 1<<31 - 1", ifi.Name, ifi.MTU)
+ }
+ if ifi.Flags&FlagUp != 0 && aa.OperStatus != windows.IfOperStatusUp {
+ t.Errorf("%s: got %v; should not include FlagUp", ifi.Name, ifi.Flags)
+ }
+ if ifi.Flags&FlagLoopback != 0 && aa.IfType != windows.IF_TYPE_SOFTWARE_LOOPBACK {
+ t.Errorf("%s: got %v; should not include FlagLoopback", ifi.Name, ifi.Flags)
+ }
+ if _, _, err := addrPrefixTable(aa); err != nil {
+ t.Errorf("%s: %v", ifi.Name, err)
+ }
+ }
+}
+
+type byAddrLen []IPNet
+
+func (ps byAddrLen) Len() int { return len(ps) }
+
+func (ps byAddrLen) Less(i, j int) bool {
+ if n := bytes.Compare(ps[i].IP, ps[j].IP); n != 0 {
+ return n < 0
+ }
+ if n := bytes.Compare(ps[i].Mask, ps[j].Mask); n != 0 {
+ return n < 0
+ }
+ return false
+}
+
+func (ps byAddrLen) Swap(i, j int) { ps[i], ps[j] = ps[j], ps[i] }
+
+var windowsAddrPrefixLenTests = []struct {
+ pfxs []IPNet
+ ip IP
+ out int
+}{
+ {
+ []IPNet{
+ {IP: IPv4(172, 16, 0, 0), Mask: IPv4Mask(255, 255, 0, 0)},
+ {IP: IPv4(192, 168, 0, 0), Mask: IPv4Mask(255, 255, 255, 0)},
+ {IP: IPv4(192, 168, 0, 0), Mask: IPv4Mask(255, 255, 255, 128)},
+ {IP: IPv4(192, 168, 0, 0), Mask: IPv4Mask(255, 255, 255, 192)},
+ },
+ IPv4(192, 168, 0, 1),
+ 26,
+ },
+ {
+ []IPNet{
+ {IP: ParseIP("2001:db8::"), Mask: IPMask(ParseIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0"))},
+ {IP: ParseIP("2001:db8::"), Mask: IPMask(ParseIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff8"))},
+ {IP: ParseIP("2001:db8::"), Mask: IPMask(ParseIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc"))},
+ },
+ ParseIP("2001:db8::1"),
+ 126,
+ },
+
+ // Fallback cases. It may happen on Windows XP or 2003 server.
+ {
+ []IPNet{
+ {IP: IPv4(127, 0, 0, 0).To4(), Mask: IPv4Mask(255, 0, 0, 0)},
+ {IP: IPv4(10, 0, 0, 0).To4(), Mask: IPv4Mask(255, 0, 0, 0)},
+ {IP: IPv4(172, 16, 0, 0).To4(), Mask: IPv4Mask(255, 255, 0, 0)},
+ {IP: IPv4(192, 168, 255, 0), Mask: IPv4Mask(255, 255, 255, 0)},
+ {IP: IPv4zero, Mask: IPv4Mask(0, 0, 0, 0)},
+ },
+ IPv4(192, 168, 0, 1),
+ 8 * IPv4len,
+ },
+ {
+ nil,
+ IPv4(192, 168, 0, 1),
+ 8 * IPv4len,
+ },
+ {
+ []IPNet{
+ {IP: IPv6loopback, Mask: IPMask(ParseIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))},
+ {IP: ParseIP("2001:db8:1::"), Mask: IPMask(ParseIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0"))},
+ {IP: ParseIP("2001:db8:2::"), Mask: IPMask(ParseIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff8"))},
+ {IP: ParseIP("2001:db8:3::"), Mask: IPMask(ParseIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc"))},
+ {IP: IPv6unspecified, Mask: IPMask(ParseIP("::"))},
+ },
+ ParseIP("2001:db8::1"),
+ 8 * IPv6len,
+ },
+ {
+ nil,
+ ParseIP("2001:db8::1"),
+ 8 * IPv6len,
+ },
+}
+
+func TestWindowsAddrPrefixLen(t *testing.T) {
+ for i, tt := range windowsAddrPrefixLenTests {
+ sort.Sort(byAddrLen(tt.pfxs))
+ l := addrPrefixLen(tt.pfxs, tt.ip)
+ if l != tt.out {
+ t.Errorf("#%d: got %d; want %d", i, l, tt.out)
+ }
+ sort.Sort(sort.Reverse(byAddrLen(tt.pfxs)))
+ l = addrPrefixLen(tt.pfxs, tt.ip)
+ if l != tt.out {
+ t.Errorf("#%d: got %d; want %d", i, l, tt.out)
+ }
+ }
+}