hunk.code_window: package utils
   import (
   	"net/http"
   	"net/url"
   	"strings"
  
hunk.labels: keep keep add keep keep keep keep
hunk.after_edit: 	"fmt"
   	"html/template"
  
hunk.file_path: utils/api.go
hunk.type: add
file: package sockaddr
  
  import "testing"
  
  func Test_parseBSDDefaultIfName(t *testing.T) {
  	testCases := []struct {
  		name     string
  		routeOut string
  		want     string
  	}{
  		{
  			name: "macOS Sierra 10.12 - Common",
  			routeOut: `   route to: default
  destination: default
         mask: default
      gateway: 10.23.9.1
    interface: en0
        flags: <UP,GATEWAY,DONE,STATIC,PRCLONING>
   recvpipe  sendpipe  ssthresh  rtt,msec    rttvar  hopcount      mtu     expire
         0         0         0         0         0         0      1500         0 
  `,
  			want: "en0",
  		},
  	}
  
  	for _, tc := range testCases {
  		t.Run(tc.name, func(t *testing.T) {
  			got, err := parseDefaultIfNameFromRoute(tc.routeOut)
  			if err != nil {
  				t.Fatalf("unable to parse default interface from route output: %v", err)
  			}
  
  			if got != tc.want {
  				t.Errorf("got %s; want %s", got, tc.want)
  			}
  		})
  	}
  }
  
  func Test_parseLinuxDefaultIfName(t *testing.T) {
  	testCases := []struct {
  		name     string
  		routeOut string
  		want     string
  	}{
  		{
  			name: "Linux Ubuntu 14.04 - Common",
  			routeOut: `default via 10.1.2.1 dev eth0 
  10.1.2.0/24 dev eth0  proto kernel  scope link  src 10.1.2.5 
  `,
  			want: "eth0",
  		},
  		{
  			name: "Chromebook - 8743.85.0 (Official Build) stable-channel gandof, Milestone 54",
  			routeOut: `default via 192.168.1.1 dev wlan0  metric 1 
  192.168.1.0/24 dev wlan0  proto kernel  scope link  src 192.168.1.174 
  `,
  			want: "wlan0",
  		},
  	}
  
  	for _, tc := range testCases {
  		t.Run(tc.name, func(t *testing.T) {
  			got, err := parseDefaultIfNameFromIPCmd(tc.routeOut)
  			if err != nil {
  				t.Fatalf("unable to parse default interface from route output: %v", err)
  			}
  
  			if got != tc.want {
  				t.Errorf("got %+q; want %+q", got, tc.want)
  			}
  		})
  	}
  }
  
  func Test_parseWindowsDefaultIfName(t *testing.T) {
  	testCases := []struct {
  		name        string
  		routeOut    string
  		ipconfigOut string
  		want        string
  	}{
  		{
  			name: "Windows 10 - Enterprise",
  			routeOut: `===========================================================================
  Interface List
   10...08 00 27 a2 e9 51 ......Intel(R) PRO/1000 MT Desktop Adapter
   13...08 00 27 35 02 ed ......Intel(R) PRO/1000 MT Desktop Adapter #2
    1...........................Software Loopback Interface 1
    5...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter
    8...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #3
  ===========================================================================
  
  IPv4 Route Table
  ===========================================================================
  Active Routes:
  Network Destination        Netmask          Gateway       Interface  Metric
            0.0.0.0          0.0.0.0         10.0.2.2        10.0.2.15     25
           10.0.2.0    255.255.255.0         On-link         10.0.2.15    281
          10.0.2.15  255.255.255.255         On-link         10.0.2.15    281
         10.0.2.255  255.255.255.255         On-link         10.0.2.15    281
          127.0.0.0        255.0.0.0         On-link         127.0.0.1    331
          127.0.0.1  255.255.255.255         On-link         127.0.0.1    331
    127.255.255.255  255.255.255.255         On-link         127.0.0.1    331
       192.168.56.0    255.255.255.0         On-link    192.168.56.100    281
     192.168.56.100  255.255.255.255         On-link    192.168.56.100    281
     192.168.56.255  255.255.255.255         On-link    192.168.56.100    281
          224.0.0.0        240.0.0.0         On-link         127.0.0.1    331
          224.0.0.0        240.0.0.0         On-link    192.168.56.100    281
          224.0.0.0        240.0.0.0         On-link         10.0.2.15    281
    255.255.255.255  255.255.255.255         On-link         127.0.0.1    331
    255.255.255.255  255.255.255.255         On-link    192.168.56.100    281
    255.255.255.255  255.255.255.255         On-link         10.0.2.15    281
  ===========================================================================
  Persistent Routes:
    None
  
  IPv6 Route Table
  ===========================================================================
  Active Routes:
   If Metric Network Destination      Gateway
    1    331 ::1/128                  On-link
   13    281 fe80::/64                On-link
   10    281 fe80::/64                On-link
   13    281 fe80::60cc:155f:77a4:ab99/128
                                      On-link
   10    281 fe80::cccc:710e:f5bb:3088/128
                                      On-link
    1    331 ff00::/8                 On-link
   13    281 ff00::/8                 On-link
   10    281 ff00::/8                 On-link
  ===========================================================================
  Persistent Routes:
    None
  `,
  			ipconfigOut: `Windows IP Configuration
  
  
  Ethernet adapter Ethernet:
  
     Connection-specific DNS Suffix  . : host.example.org
     Link-local IPv6 Address . . . . . : fe80::cccc:710e:f5bb:3088%10
     IPv4 Address. . . . . . . . . . . : 10.0.2.15
     Subnet Mask . . . . . . . . . . . : 255.255.255.0
     Default Gateway . . . . . . . . . : 10.0.2.2
  
  Ethernet adapter Ethernet 2:
  
     Connection-specific DNS Suffix  . : 
     Link-local IPv6 Address . . . . . : fe80::60cc:155f:77a4:ab99%13
     IPv4 Address. . . . . . . . . . . : 192.168.56.100
     Subnet Mask . . . . . . . . . . . : 255.255.255.0
     Default Gateway . . . . . . . . . : 
  
  Tunnel adapter isatap.host.example.org:
  
     Media State . . . . . . . . . . . : Media disconnected
     Connection-specific DNS Suffix  . : 
  
  Tunnel adapter Reusable ISATAP Interface {F3F2E4A5-8823-40E5-87EA-1F6881BACC95}:
  
     Media State . . . . . . . . . . . : Media disconnected
     Connection-specific DNS Suffix  . : host.example.org
  `,
  			want: "Ethernet",
  		},
  	}
  
  	for _, tc := range testCases {
  		t.Run(tc.name, func(t *testing.T) {
  			got, err := parseDefaultIfNameWindows(tc.routeOut, tc.ipconfigOut)
  			if err != nil {
  				t.Fatalf("unable to parse default interface from route output: %v", err)
  			}
  
  			if got != tc.want {
  				t.Errorf("got %s; want %s", got, tc.want)
  			}
  		})
  	}
  }
  
  func Test_VisitComands(t *testing.T) {
  	ri, err := NewRouteInfo()
  	if err != nil {
  		t.Fatalf("bad: %v", err)
  	}
  
  	var count int
  	ri.VisitCommands(func(name string, cmd []string) {
  		count++
  	})
  	if count == 0 {
  		t.Fatalf("Expected more than 0 items")
  	}
  }
  