1 // Copyright 2015 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
9 "internal/syscall/windows"
14 func TestWindowsInterfaces(t
*testing
.T
) {
15 aas
, err
:= adapterAddresses()
19 ift
, err
:= Interfaces()
23 for i
, ifi
:= range ift
{
25 if len(ifi
.HardwareAddr
) != int(aa
.PhysicalAddressLength
) {
26 t
.Errorf("got %d; want %d", len(ifi
.HardwareAddr
), aa
.PhysicalAddressLength
)
28 if ifi
.MTU
> 0x7fffffff {
29 t
.Errorf("%s: got %d; want less than or equal to 1<<31 - 1", ifi
.Name
, ifi
.MTU
)
31 if ifi
.Flags
&FlagUp
!= 0 && aa
.OperStatus
!= windows
.IfOperStatusUp
{
32 t
.Errorf("%s: got %v; should not include FlagUp", ifi
.Name
, ifi
.Flags
)
34 if ifi
.Flags
&FlagLoopback
!= 0 && aa
.IfType
!= windows
.IF_TYPE_SOFTWARE_LOOPBACK
{
35 t
.Errorf("%s: got %v; should not include FlagLoopback", ifi
.Name
, ifi
.Flags
)
37 if _
, _
, err
:= addrPrefixTable(aa
); err
!= nil {
38 t
.Errorf("%s: %v", ifi
.Name
, err
)
43 type byAddrLen
[]IPNet
45 func (ps byAddrLen
) Len() int { return len(ps
) }
47 func (ps byAddrLen
) Less(i
, j
int) bool {
48 if n
:= bytes
.Compare(ps
[i
].IP
, ps
[j
].IP
); n
!= 0 {
51 if n
:= bytes
.Compare(ps
[i
].Mask
, ps
[j
].Mask
); n
!= 0 {
57 func (ps byAddrLen
) Swap(i
, j
int) { ps
[i
], ps
[j
] = ps
[j
], ps
[i
] }
59 var windowsAddrPrefixLenTests
= []struct {
66 {IP
: IPv4(172, 16, 0, 0), Mask
: IPv4Mask(255, 255, 0, 0)},
67 {IP
: IPv4(192, 168, 0, 0), Mask
: IPv4Mask(255, 255, 255, 0)},
68 {IP
: IPv4(192, 168, 0, 0), Mask
: IPv4Mask(255, 255, 255, 128)},
69 {IP
: IPv4(192, 168, 0, 0), Mask
: IPv4Mask(255, 255, 255, 192)},
76 {IP
: ParseIP("2001:db8::"), Mask
: IPMask(ParseIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0"))},
77 {IP
: ParseIP("2001:db8::"), Mask
: IPMask(ParseIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff8"))},
78 {IP
: ParseIP("2001:db8::"), Mask
: IPMask(ParseIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc"))},
80 ParseIP("2001:db8::1"),
84 // Fallback cases. It may happen on Windows XP or 2003 server.
87 {IP
: IPv4(127, 0, 0, 0).To4(), Mask
: IPv4Mask(255, 0, 0, 0)},
88 {IP
: IPv4(10, 0, 0, 0).To4(), Mask
: IPv4Mask(255, 0, 0, 0)},
89 {IP
: IPv4(172, 16, 0, 0).To4(), Mask
: IPv4Mask(255, 255, 0, 0)},
90 {IP
: IPv4(192, 168, 255, 0), Mask
: IPv4Mask(255, 255, 255, 0)},
91 {IP
: IPv4zero
, Mask
: IPv4Mask(0, 0, 0, 0)},
103 {IP
: IPv6loopback
, Mask
: IPMask(ParseIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))},
104 {IP
: ParseIP("2001:db8:1::"), Mask
: IPMask(ParseIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0"))},
105 {IP
: ParseIP("2001:db8:2::"), Mask
: IPMask(ParseIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff8"))},
106 {IP
: ParseIP("2001:db8:3::"), Mask
: IPMask(ParseIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc"))},
107 {IP
: IPv6unspecified
, Mask
: IPMask(ParseIP("::"))},
109 ParseIP("2001:db8::1"),
114 ParseIP("2001:db8::1"),
119 func TestWindowsAddrPrefixLen(t
*testing
.T
) {
120 for i
, tt
:= range windowsAddrPrefixLenTests
{
121 sort
.Sort(byAddrLen(tt
.pfxs
))
122 l
:= addrPrefixLen(tt
.pfxs
, tt
.ip
)
124 t
.Errorf("#%d: got %d; want %d", i
, l
, tt
.out
)
126 sort
.Sort(sort
.Reverse(byAddrLen(tt
.pfxs
)))
127 l
= addrPrefixLen(tt
.pfxs
, tt
.ip
)
129 t
.Errorf("#%d: got %d; want %d", i
, l
, tt
.out
)