aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Brainman <alex.brainman@gmail.com>2015-12-15 12:03:47 +1100
committerRuss Cox <rsc@golang.org>2015-12-17 17:41:41 +0000
commitf172a28f24664d95611b5943f78c6a2c1cc6efbd (patch)
tree5fee0c01ba4109a6708b4855f71122fa9e5d6742
parent3ad3d5931be1aa1fd1b59874eebb40e4b22e2206 (diff)
downloadgo-f172a28f24664d95611b5943f78c6a2c1cc6efbd.tar.gz
go-f172a28f24664d95611b5943f78c6a2c1cc6efbd.zip
net: include both ipv4 and ipv6 netsh output in TestInterfacesWithNetsh
Also include test for interface state (up or down). Updates #13606 Change-Id: I03538d65525ddd9c2d0254761861c2df7fc5bd5a Reviewed-on: https://go-review.googlesource.com/17850 Reviewed-by: Russ Cox <rsc@golang.org> Reviewed-by: Mikio Hara <mikioh.mikioh@gmail.com> Run-TryBot: Russ Cox <rsc@golang.org>
-rw-r--r--src/net/net_windows_test.go86
1 files changed, 76 insertions, 10 deletions
diff --git a/src/net/net_windows_test.go b/src/net/net_windows_test.go
index ce002a62b0..ef71b8d680 100644
--- a/src/net/net_windows_test.go
+++ b/src/net/net_windows_test.go
@@ -177,6 +177,18 @@ func isWindowsXP(t *testing.T) bool {
return major < 6
}
+var (
+ modkernel32 = syscall.NewLazyDLL("kernel32.dll")
+ procGetACP = modkernel32.NewProc("GetACP")
+)
+
+func isEnglishOS(t *testing.T) bool {
+ const windows_1252 = 1252 // ANSI Latin 1; Western European (Windows)
+ r0, _, _ := syscall.Syscall(procGetACP.Addr(), 0, 0, 0, 0)
+ acp := uint32(r0)
+ return acp == windows_1252
+}
+
func runCmd(args ...string) ([]byte, error) {
removeUTF8BOM := func(b []byte) []byte {
if len(b) >= 3 && b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF {
@@ -213,40 +225,87 @@ func runCmd(args ...string) ([]byte, error) {
return removeUTF8BOM(out), nil
}
-func netshInterfaceIPShowConfig() ([]string, error) {
- out, err := runCmd("netsh", "interface", "ip", "show", "config")
+func netshInterfaceIPShowInterface(ipver string, ifaces map[string]bool) error {
+ out, err := runCmd("netsh", "interface", ipver, "show", "interface", "level=verbose")
if err != nil {
- return nil, err
+ return err
}
+ // interface information is listed like:
+ //
+ //Interface Local Area Connection Parameters
+ //----------------------------------------------
+ //IfLuid : ethernet_6
+ //IfIndex : 11
+ //State : connected
+ //Metric : 10
+ //...
+ var name string
lines := bytes.Split(out, []byte{'\r', '\n'})
- names := make([]string, 0)
for _, line := range lines {
- f := bytes.Split(line, []byte{'"'})
- if len(f) == 3 {
- names = append(names, string(f[1]))
+ if bytes.HasPrefix(line, []byte("Interface ")) && bytes.HasSuffix(line, []byte(" Parameters")) {
+ f := line[len("Interface "):]
+ f = f[:len(f)-len(" Parameters")]
+ name = string(f)
+ continue
+ }
+ var isup bool
+ switch string(line) {
+ case "State : connected":
+ isup = true
+ case "State : disconnected":
+ isup = false
+ default:
+ continue
+ }
+ if name != "" {
+ if v, ok := ifaces[name]; ok && v != isup {
+ return fmt.Errorf("%s:%s isup=%v: ipv4 and ipv6 report different interface state", ipver, name, isup)
+ }
+ ifaces[name] = isup
+ name = ""
}
}
- return names, nil
+ return nil
}
func TestInterfacesWithNetsh(t *testing.T) {
if isWindowsXP(t) {
t.Skip("Windows XP netsh command does not provide required functionality")
}
+ if !isEnglishOS(t) {
+ t.Skip("English version of OS required for this test")
+ }
+
+ toString := func(name string, isup bool) string {
+ if isup {
+ return name + ":up"
+ }
+ return name + ":down"
+ }
+
ift, err := Interfaces()
if err != nil {
t.Fatal(err)
}
have := make([]string, 0)
for _, ifi := range ift {
- have = append(have, ifi.Name)
+ have = append(have, toString(ifi.Name, ifi.Flags&FlagUp != 0))
}
sort.Strings(have)
- want, err := netshInterfaceIPShowConfig()
+ ifaces := make(map[string]bool)
+ err = netshInterfaceIPShowInterface("ipv6", ifaces)
if err != nil {
t.Fatal(err)
}
+ err = netshInterfaceIPShowInterface("ipv4", ifaces)
+ if err != nil {
+ t.Fatal(err)
+ }
+ want := make([]string, 0)
+ for name, isup := range ifaces {
+ want = append(want, toString(name, isup))
+ }
sort.Strings(want)
if strings.Join(want, "/") != strings.Join(have, "/") {
@@ -324,6 +383,9 @@ func TestInterfaceAddrsWithNetsh(t *testing.T) {
if isWindowsXP(t) {
t.Skip("Windows XP netsh command does not provide required functionality")
}
+ if !isEnglishOS(t) {
+ t.Skip("English version of OS required for this test")
+ }
ift, err := Interfaces()
if err != nil {
t.Fatal(err)
@@ -377,6 +439,10 @@ func TestInterfaceHardwareAddrWithGetmac(t *testing.T) {
if isWindowsXP(t) {
t.Skip("Windows XP does not have powershell command")
}
+ if !isEnglishOS(t) {
+ t.Skip("English version of OS required for this test")
+ }
+
ift, err := Interfaces()
if err != nil {
t.Fatal(err)