1
0
mirror of https://github.com/golang/go synced 2024-11-17 20:54:48 -07:00

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>
This commit is contained in:
Alex Brainman 2015-12-15 12:03:47 +11:00 committed by Russ Cox
parent 3ad3d5931b
commit f172a28f24

View File

@ -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)