diff options
author | Christopher Speller <crspeller@gmail.com> | 2018-04-16 05:37:14 -0700 |
---|---|---|
committer | Joram Wilander <jwawilander@gmail.com> | 2018-04-16 08:37:14 -0400 |
commit | 6e2cb00008cbf09e556b00f87603797fcaa47e09 (patch) | |
tree | 3c0eb55ff4226a3f024aad373140d1fb860a6404 /vendor/github.com/hashicorp/go-sockaddr/ifaddrs_test.go | |
parent | bf24f51c4e1cc6286885460672f7f449e8c6f5ef (diff) | |
download | chat-6e2cb00008cbf09e556b00f87603797fcaa47e09.tar.gz chat-6e2cb00008cbf09e556b00f87603797fcaa47e09.tar.bz2 chat-6e2cb00008cbf09e556b00f87603797fcaa47e09.zip |
Depenancy upgrades and movign to dep. (#8630)
Diffstat (limited to 'vendor/github.com/hashicorp/go-sockaddr/ifaddrs_test.go')
-rw-r--r-- | vendor/github.com/hashicorp/go-sockaddr/ifaddrs_test.go | 1987 |
1 files changed, 0 insertions, 1987 deletions
diff --git a/vendor/github.com/hashicorp/go-sockaddr/ifaddrs_test.go b/vendor/github.com/hashicorp/go-sockaddr/ifaddrs_test.go deleted file mode 100644 index aed847808..000000000 --- a/vendor/github.com/hashicorp/go-sockaddr/ifaddrs_test.go +++ /dev/null @@ -1,1987 +0,0 @@ -package sockaddr_test - -import ( - "fmt" - "net" - "reflect" - "testing" - - sockaddr "github.com/hashicorp/go-sockaddr" -) - -const ( - // NOTE(seanc@): Assume "en0" is the interface with a default route attached - // to it. When this is not the case, change this one constant and tests - // should pass (i.e. "net0"). - ifNameWithDefault = "en0" -) - -// NOTE: A number of these code paths are exercised in template/ and -// cmd/sockaddr/. -// -// TODO(sean@): Add better coverage for filtering functions (e.g. ExcludeBy*, -// IncludeBy*). - -func TestCmpIfAddrFunc(t *testing.T) { - tests := []struct { - name string - t1 sockaddr.IfAddr // must come before t2 according to the ascOp - t2 sockaddr.IfAddr - ascOp sockaddr.CmpIfAddrFunc - ascResult int - descOp sockaddr.CmpIfAddrFunc - descResult int - }{ - { - name: "empty test", - t1: sockaddr.IfAddr{}, - t2: sockaddr.IfAddr{}, - ascOp: sockaddr.AscIfAddress, - descOp: sockaddr.DescIfAddress, - ascResult: 0, - descResult: 0, - }, - { - name: "ipv4 address less", - t1: sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.3"), - }, - t2: sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.4"), - }, - ascOp: sockaddr.AscIfAddress, - descOp: sockaddr.DescIfAddress, - ascResult: -1, - descResult: -1, - }, - { - name: "ipv4 private", - t1: sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("10.1.2.3"), - }, - t2: sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("203.0.113.3"), - }, - ascOp: sockaddr.AscIfPrivate, - descOp: sockaddr.DescIfPrivate, - ascResult: 0, // not both private, can't complete the test - descResult: 0, - }, - { - name: "IfAddr name", - t1: sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("10.1.2.3"), - Interface: net.Interface{ - Name: "abc0", - }, - }, - t2: sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("203.0.113.3"), - Interface: net.Interface{ - Name: "xyz0", - }, - }, - ascOp: sockaddr.AscIfName, - descOp: sockaddr.DescIfName, - ascResult: -1, - descResult: -1, - }, - { - name: "IfAddr network size", - t1: sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("10.0.0.0/8"), - }, - t2: sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("127.0.0.0/24"), - }, - ascOp: sockaddr.AscIfNetworkSize, - descOp: sockaddr.DescIfNetworkSize, - ascResult: -1, - descResult: -1, - }, - { - name: "IfAddr port", - t1: sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("10.0.0.0:80"), - }, - t2: sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("127.0.0.0:8600"), - }, - ascOp: sockaddr.AscIfPort, - descOp: sockaddr.DescIfPort, - ascResult: -1, - descResult: -1, - }, - { - name: "IfAddr type", - t1: sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("10.0.0.0:80"), - }, - t2: sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv6Addr("[::1]:80"), - }, - ascOp: sockaddr.AscIfType, - descOp: sockaddr.DescIfType, - ascResult: -1, - descResult: -1, - }, - } - - for i, test := range tests { - if test.name == "" { - t.Fatalf("test %d must have a name", i) - } - - // Test ascending operation - ascExpected := test.ascResult - ascResult := test.ascOp(&test.t1, &test.t2) - if ascResult != ascExpected { - t.Errorf("%s: Unexpected result %d, expected %d when comparing %v and %v using %v", test.name, ascResult, ascExpected, test.t1, test.t2, test.ascOp) - } - - // Test descending operation - descExpected := test.descResult - descResult := test.descOp(&test.t2, &test.t1) - if descResult != descExpected { - t.Errorf("%s: Unexpected result %d, expected %d when comparing %v and %v using %v", test.name, descResult, descExpected, test.t1, test.t2, test.descOp) - } - - if ascResult != descResult { - t.Fatalf("bad") - } - - // Reverse the args - ascExpected = -1 * test.ascResult - ascResult = test.ascOp(&test.t2, &test.t1) - if ascResult != ascExpected { - t.Errorf("%s: Unexpected result %d, expected %d when comparing %v and %v using %v", test.name, ascResult, ascExpected, test.t1, test.t2, test.ascOp) - } - - descExpected = -1 * test.descResult - descResult = test.descOp(&test.t1, &test.t2) - if descResult != descExpected { - t.Errorf("%s: Unexpected result %d, expected %d when comparing %v and %v using %v", test.name, descResult, descExpected, test.t1, test.t2, test.descOp) - } - - if ascResult != descResult { - t.Fatalf("bad") - } - - // Test equality - ascExpected = 0 - ascResult = test.ascOp(&test.t1, &test.t1) - if ascResult != ascExpected { - t.Errorf("%s: Unexpected result %d, expected %d when comparing %v and %v using %v", test.name, ascResult, ascExpected, test.t1, test.t2, test.ascOp) - } - - descExpected = 0 - descResult = test.descOp(&test.t1, &test.t1) - if descResult != descExpected { - t.Errorf("%s: Unexpected result %d, expected %d when comparing %v and %v using %v", test.name, descResult, descExpected, test.t1, test.t2, test.descOp) - } - } -} - -func TestFilterIfByFlags(t *testing.T) { - tests := []struct { - name string - selector string - ifAddrs sockaddr.IfAddrs - flags net.Flags - fail bool - }{ - { - name: "broadcast", - selector: "broadcast", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - Interface: net.Interface{ - Flags: net.FlagBroadcast, - }, - SockAddr: sockaddr.MustIPv4Addr("1.2.3.1"), - }, - }, - }, - { - name: "down", - selector: "down", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - Interface: net.Interface{}, - SockAddr: sockaddr.MustIPv4Addr("1.2.3.2"), - }, - }, - }, - { - name: "forwardable IPv4", - selector: "forwardable", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - Interface: net.Interface{}, - SockAddr: sockaddr.MustIPv4Addr("1.2.3.3"), - }, - }, - }, - { - name: "forwardable IPv6", - selector: "forwardable", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - Interface: net.Interface{}, - SockAddr: sockaddr.MustIPv6Addr("cc::1/128"), - }, - }, - }, - { - name: "global unicast", - selector: "global unicast", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - Interface: net.Interface{}, - SockAddr: sockaddr.MustIPv6Addr("cc::2"), - }, - }, - }, - { - name: "interface-local multicast", - selector: "interface-local multicast", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - Interface: net.Interface{}, - SockAddr: sockaddr.MustIPv6Addr("ff01::2"), - }, - }, - }, - { - name: "link-local multicast", - selector: "link-local multicast", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - Interface: net.Interface{}, - SockAddr: sockaddr.MustIPv6Addr("ff02::3"), - }, - }, - }, - { - name: "link-local unicast IPv4", - selector: "link-local unicast", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - Interface: net.Interface{}, - SockAddr: sockaddr.MustIPv4Addr("169.254.1.101"), - }, - }, - }, - { - name: "link-local unicast IPv6", - selector: "link-local unicast", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - Interface: net.Interface{}, - SockAddr: sockaddr.MustIPv6Addr("fe80::3"), - }, - }, - }, - { - name: "loopback ipv4", - selector: "loopback", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - Interface: net.Interface{ - Flags: net.FlagLoopback, - }, - SockAddr: sockaddr.MustIPv4Addr("127.0.0.1"), - }, - }, - }, - { - name: "loopback ipv6", - selector: "loopback", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - Interface: net.Interface{ - Flags: net.FlagLoopback, - }, - SockAddr: sockaddr.MustIPv6Addr("::1"), - }, - }, - }, - { - name: "multicast IPv4", - selector: "multicast", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - Interface: net.Interface{ - Flags: net.FlagMulticast, - }, - SockAddr: sockaddr.MustIPv4Addr("224.0.0.1"), - }, - }, - }, - { - name: "multicast IPv6", - selector: "multicast", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - Interface: net.Interface{ - Flags: net.FlagMulticast, - }, - SockAddr: sockaddr.MustIPv6Addr("ff05::3"), - }, - }, - }, - { - name: "point-to-point", - selector: "point-to-point", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - Interface: net.Interface{ - Flags: net.FlagPointToPoint, - }, - SockAddr: sockaddr.MustIPv6Addr("cc::3"), - }, - }, - }, - { - name: "unspecified", - selector: "unspecified", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - Interface: net.Interface{}, - SockAddr: sockaddr.MustIPv6Addr("::"), - }, - }, - }, - { - name: "up", - selector: "up", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - Interface: net.Interface{ - Flags: net.FlagUp, - }, - SockAddr: sockaddr.MustIPv6Addr("cc::3"), - }, - }, - }, - { - name: "invalid", - selector: "foo", - fail: true, - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - Interface: net.Interface{}, - SockAddr: sockaddr.MustIPv6Addr("cc::3"), - }, - }, - }, - } - - for i, test := range tests { - if test.name == "" { - t.Fatalf("test %d needs a name", i) - } - - t.Run(test.name, func(t *testing.T) { - in, out, err := sockaddr.IfByFlag(test.selector, test.ifAddrs) - if test.fail == true && err == nil { - t.Fatalf("%s: expected failure", test.name) - } else if test.fail == true && err != nil { - return - } - - if err != nil && test.fail != true { - t.Fatalf("%s: failed: %v", test.name, err) - } - if ilen := len(in); ilen != 1 { - t.Fatalf("%s: wrong in length %d, expected 1", test.name, ilen) - } - if olen := len(out); olen != 0 { - t.Fatalf("%s: wrong in length %d, expected 0", test.name, olen) - } - }) - } -} - -func TestIfByNetwork(t *testing.T) { - tests := []struct { - name string - input sockaddr.IfAddrs - selector string - matched sockaddr.IfAddrs - excluded sockaddr.IfAddrs - fail bool - }{ - { - name: "exact match", - input: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.4"), - }, - }, - selector: "1.2.3.4", - matched: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.4"), - }, - }, - }, - { - name: "exact match plural", - input: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.4"), - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.0/24"), - }, - }, - selector: "1.2.3.0/24", - matched: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.4"), - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.0/24"), - }, - }, - }, - { - name: "split plural", - input: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.4"), - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("12.2.3.0/24"), - }, - }, - selector: "1.2.3.0/24", - excluded: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("12.2.3.0/24"), - }, - }, - matched: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.4"), - }, - }, - }, - { - name: "excluded plural", - input: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.4"), - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("12.2.3.0/24"), - }, - }, - selector: "10.0.0.0/8", - excluded: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.4"), - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("12.2.3.0/24"), - }, - }, - }, - { - name: "invalid selector", - input: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.4"), - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("12.2.3.0/24"), - }, - }, - selector: "[:]", - fail: true, - }, - } - - for i, test := range tests { - if test.name == "" { - t.Fatalf("test %d needs a name", i) - } - - t.Run(test.name, func(t *testing.T) { - matched, excluded, err := sockaddr.IfByNetwork(test.selector, test.input) - if err != nil && !test.fail { - t.Fatal("bad") - } else if err == nil && test.fail { - t.Fatal("bad") - } - - if len(test.matched) != len(matched) { - t.Fatal("bad") - } else if len(test.excluded) != len(excluded) { - t.Fatal("bad") - } - - for i := 0; i < len(test.excluded); i++ { - if !reflect.DeepEqual(test.excluded[i], excluded[i]) { - t.Errorf("wrong excluded: %d %v %v", i, test.excluded[i], excluded[i]) - } - } - - for i := 0; i < len(test.matched); i++ { - if !reflect.DeepEqual(test.matched[i], matched[i]) { - t.Errorf("wrong matched: %d %v %v", i, test.matched[i], matched[i]) - } - } - }) - } -} - -func TestFilterIfByType(t *testing.T) { - tests := []struct { - name string - ifAddrs sockaddr.IfAddrs - ifAddrType sockaddr.SockAddrType - matchedLen int - remainingLen int - }{ - { - name: "include all", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.4"), - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("2.3.4.5"), - }, - }, - ifAddrType: sockaddr.TypeIPv4, - matchedLen: 2, - remainingLen: 0, - }, - { - name: "include some", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.4"), - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv6Addr("::1"), - }, - }, - ifAddrType: sockaddr.TypeIPv4, - matchedLen: 1, - remainingLen: 1, - }, - { - name: "exclude all", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.4"), - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.5"), - }, - }, - ifAddrType: sockaddr.TypeIPv6, - matchedLen: 0, - remainingLen: 2, - }, - } - - for i, test := range tests { - if test.name == "" { - t.Fatalf("test %d needs a name", i) - } - - in, out := sockaddr.FilterIfByType(test.ifAddrs, test.ifAddrType) - if len(in) != test.matchedLen { - t.Fatalf("%s: wrong length %d, expected %d", test.name, len(in), test.matchedLen) - } - - if len(out) != test.remainingLen { - t.Fatalf("%s: wrong length %d, expected %d", test.name, len(out), test.remainingLen) - } - } -} - -// TestGetIfAddrs runs through the motions of calling sockaddr.GetIfAddrs(), but -// doesn't do much in the way of testing beyond verifying that `lo0` has a -// loopback address present. -func TestGetIfAddrs(t *testing.T) { - ifAddrs, err := sockaddr.GetAllInterfaces() - if err != nil { - t.Fatalf("Unable to proceed: %v", err) - } - if len(ifAddrs) == 0 { - t.Skip() - } - - var loInt *sockaddr.IfAddr - for _, ifAddr := range ifAddrs { - val := sockaddr.IfAddrAttr(ifAddr, "name") - if val == "" { - t.Fatalf("name failed") - } else if val == "lo0" || val == "lo" || val == "Loopback Pseudo-Interface 1" { - loInt = &ifAddr - break - } - } - if loInt == nil { - t.Fatalf("No loopback interfaces found, loInt nil") - } - - if val := sockaddr.IfAddrAttr(*loInt, "flags"); !(val == "up|loopback|multicast" || val == "up|loopback") { - t.Fatalf("expected different flags from loopback: %q", val) - } - - if loInt == nil { - t.Fatalf("Expected to find an lo0 interface, didn't find any") - } - - haveIPv4, foundIPv4lo := false, false - haveIPv6, foundIPv6lo := false, false - switch loInt.SockAddr.(type) { - case sockaddr.IPv4Addr: - haveIPv4 = true - - // Make the semi-brittle assumption that if we have - // IPv4, we also have an address at 127.0.0.1 available - // to us. - if loInt.SockAddr.String() == "127.0.0.1/8" { - foundIPv4lo = true - } - case sockaddr.IPv6Addr: - haveIPv6 = true - if loInt.SockAddr.String() == "::1" { - foundIPv6lo = true - } - default: - t.Fatalf("Unsupported type %v for address %v", loInt.Type(), loInt) - } - - // While not wise, it's entirely possible a host doesn't have IPv4 - // enabled. - if haveIPv4 && !foundIPv4lo { - t.Fatalf("Had an IPv4 w/o an expected IPv4 loopback addresses") - } - - // While prudent to run without, a sane environment may still contain an - // IPv6 loopback address. - if haveIPv6 && !foundIPv6lo { - t.Fatalf("Had an IPv6 w/o an expected IPv6 loopback addresses") - } -} - -// TestGetDefaultIfName tests to make sure a default interface name is always -// returned from getDefaultIfName(). -func TestGetDefaultInterface(t *testing.T) { - reportOnDefault := func(args ...interface{}) { - if havePublicIP() || havePrivateIP() { - t.Fatalf(args[0].(string), args[1:]...) - } else { - t.Skipf(args[0].(string), args[1:]...) - } - } - - ifAddrs, err := sockaddr.GetDefaultInterfaces() - if err != nil { - switch { - case len(ifAddrs) == 0: - reportOnDefault("bad: %v", err) - case ifAddrs[0].Flags&net.FlagUp == 0: - reportOnDefault("bad: %v", err) - default: - reportOnDefault("bad: %v", err) - } - } -} - -func TestIfAddrAttrs(t *testing.T) { - const expectedNumAttrs = 2 - attrs := sockaddr.IfAddrAttrs() - if len(attrs) != expectedNumAttrs { - t.Fatalf("wrong number of attrs") - } - - tests := []struct { - name string - ifAddr sockaddr.IfAddr - attr string - expected string - }{ - { - name: "name", - ifAddr: sockaddr.IfAddr{ - Interface: net.Interface{ - Name: "abc0", - }, - }, - attr: "name", - expected: "abc0", - }, - } - - for i, test := range tests { - if test.name == "" { - t.Fatalf("test %d must have a name", i) - } - - result, err := sockaddr.IfAttrs(test.attr, sockaddr.IfAddrs{test.ifAddr}) - if err != nil { - t.Errorf("failed to get attr %q from %v", test.name, test.ifAddr) - } - - if result != test.expected { - t.Errorf("unexpected result") - } - } - - // Test an empty array - result, err := sockaddr.IfAttrs("name", sockaddr.IfAddrs{}) - if err != nil { - t.Error(`failed to get attr "name" from an empty array`) - } - - if result != "" { - t.Errorf("unexpected result") - } -} - -func TestGetAllInterfaces(t *testing.T) { - ifAddrs, err := sockaddr.GetAllInterfaces() - if err != nil { - t.Fatalf("unable to gather interfaces: %v", err) - } - - initialLen := len(ifAddrs) - if initialLen == 0 { - t.Fatalf("no interfaces available") - } - - ifAddrs, err = sockaddr.SortIfBy("name,type,port,size,address", ifAddrs) - if err != nil { - t.Fatalf("unable to initially sort address") - } - - ascSorted, err := sockaddr.SortIfBy("name,type,port,size,address", ifAddrs) - if err != nil { - t.Fatalf("unable to asc sort address") - } - - descSorted, err := sockaddr.SortIfBy("name,type,port,size,-address", ascSorted) - if err != nil { - t.Fatalf("unable to desc sort address") - } - - if initialLen != len(ascSorted) && len(ascSorted) != len(descSorted) { - t.Fatalf("wrong len") - } - - for i := initialLen - 1; i >= 0; i-- { - if !reflect.DeepEqual(descSorted[i], ifAddrs[i]) { - t.Errorf("wrong sort order: %d %v %v", i, descSorted[i], ifAddrs[i]) - } - } -} - -func TestGetDefaultInterfaces(t *testing.T) { - reportOnDefault := func(args ...interface{}) { - if havePublicIP() || havePrivateIP() { - t.Fatalf(args[0].(string), args[1:]...) - } else { - t.Skipf(args[0].(string), args[1:]...) - } - } - - ifAddrs, err := sockaddr.GetDefaultInterfaces() - if err != nil { - reportOnDefault("unable to gather default interfaces: %v", err) - } - - if len(ifAddrs) == 0 { - reportOnDefault("no default interfaces available", nil) - } -} - -func TestGetPrivateInterfaces(t *testing.T) { - reportOnPrivate := func(args ...interface{}) { - if havePrivateIP() { - t.Fatalf(args[0].(string), args[1:]...) - } else { - t.Skipf(args[0].(string), args[1:]...) - } - } - - ifAddrs, err := sockaddr.GetPrivateInterfaces() - if err != nil { - reportOnPrivate("failed: %v", err) - } - - if len(ifAddrs) == 0 { - reportOnPrivate("no public IPs found") - } - - if len(ifAddrs[0].String()) == 0 { - reportOnPrivate("no string representation of private IP found") - } -} - -func TestGetPublicInterfaces(t *testing.T) { - reportOnPublic := func(args ...interface{}) { - if havePublicIP() { - t.Fatalf(args[0].(string), args[1:]...) - } else { - t.Skipf(args[0].(string), args[1:]...) - } - } - - ifAddrs, err := sockaddr.GetPublicInterfaces() - if err != nil { - reportOnPublic("failed: %v", err) - } - - if len(ifAddrs) == 0 { - reportOnPublic("no public IPs found") - } -} - -func TestIncludeExcludeIfs(t *testing.T) { - tests := []struct { - name string - ifAddrs sockaddr.IfAddrs - fail bool - excludeNum int - excludeName string - excludeParam string - includeName string - includeParam string - includeNum int - }{ - { - name: "address", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.4"), - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("2.3.4.5"), - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("3.4.5.6"), - }, - }, - excludeName: "address", - excludeNum: 2, - excludeParam: `^1\..*\.4$`, - includeName: "address", - includeNum: 1, - includeParam: `^1\.2\.3\.`, - }, - { - name: "address invalid", - fail: true, - excludeName: "address", - excludeNum: 0, - excludeParam: `*`, - includeName: "address", - includeNum: 0, - includeParam: `[`, - }, - { - name: "flag", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - Interface: net.Interface{ - Flags: net.FlagUp | net.FlagLoopback, - }, - }, - sockaddr.IfAddr{ - Interface: net.Interface{ - Flags: net.FlagLoopback, - }, - }, - sockaddr.IfAddr{ - Interface: net.Interface{ - Flags: net.FlagMulticast, - }, - }, - }, - excludeName: "flags", - excludeNum: 2, - excludeParam: `up|loopback`, - includeName: "flags", - includeNum: 2, - includeParam: `loopback`, - }, - { - name: "flag invalid", - fail: true, - excludeName: "foo", - excludeNum: 0, - excludeParam: `*`, - includeName: "bar", - includeNum: 0, - includeParam: `[`, - }, - { - name: "name", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - Interface: net.Interface{ - Name: "abc0", - }, - }, - sockaddr.IfAddr{ - Interface: net.Interface{ - Name: "xyz0", - }, - }, - sockaddr.IfAddr{ - Interface: net.Interface{ - Name: "docker666", - }, - }, - }, - excludeName: "name", - excludeNum: 2, - excludeParam: `^docker[\d]+$`, - includeName: "name", - includeNum: 2, - includeParam: `^([a-z]+)0$`, - }, - { - name: "name invalid", - fail: true, - excludeName: "name", - excludeNum: 0, - excludeParam: `*`, - includeName: "name", - includeNum: 0, - includeParam: `[`, - }, - { - name: "network", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("10.2.3.4/24"), - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("10.255.255.4/24"), - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPAddr("::1"), - }, - }, - excludeName: "network", - excludeNum: 1, - excludeParam: `10.0.0.0/8`, - includeName: "network", - includeNum: 1, - includeParam: `::/127`, - }, - { - name: "port", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.4:8600"), - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("2.3.4.5:4646"), - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("3.4.5.6:4647"), - }, - }, - excludeName: "port", - excludeNum: 2, - excludeParam: `0$`, - includeName: "port", - includeNum: 2, - includeParam: `^46[\d]{2}$`, - }, - { - name: "port invalid", - fail: true, - excludeName: "port", - excludeNum: 0, - excludeParam: `*`, - includeName: "port", - includeNum: 0, - includeParam: `[`, - }, - { - name: "rfc", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("10.2.3.4/24"), - }, - sockaddr.IfAddr{ - // Excluded (/127 vs /128) - SockAddr: sockaddr.MustIPv6Addr("::1/127"), - }, - sockaddr.IfAddr{ - // Excluded (/127 vs /128) - SockAddr: sockaddr.MustIPv6Addr("::/127"), - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPAddr("203.0.113.0/24"), - }, - }, - excludeName: "rfc", - excludeNum: 2, - excludeParam: `6890`, - includeName: "rfc", - includeNum: 1, - includeParam: `3330`, - }, - { - name: "rfc invalid", - fail: true, - excludeName: "rfc", - excludeNum: 0, - excludeParam: `rfcOneTwoThree`, - includeName: "rfc", - includeNum: 0, - includeParam: `99999999999999`, - }, - { - name: "rfc IPv4 exclude", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("192.169.1.1"), - }, - }, - excludeName: "rfc", - excludeNum: 1, - excludeParam: `1918`, - includeName: "rfc", - includeNum: 0, - includeParam: `1918`, - }, - { - name: "rfc IPv4 include", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("192.168.1.1"), - }, - }, - excludeName: "rfc", - excludeNum: 0, - excludeParam: `1918`, - includeName: "rfc", - includeNum: 1, - includeParam: `1918`, - }, - { - name: "rfc IPv4 excluded RFCs", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("192.168.1.1"), - }, - }, - excludeName: "rfc", - excludeNum: 1, - excludeParam: `4291`, - includeName: "rfc", - includeNum: 0, - includeParam: `4291`, - }, - { - name: "rfc IPv6 exclude", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv6Addr("cc::1/127"), - }, - }, - excludeName: "rfc", - excludeNum: 1, - excludeParam: `4291`, - includeName: "rfc", - includeNum: 0, - includeParam: `4291`, - }, - { - name: "rfc IPv6 include", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv6Addr("::1/127"), - }, - }, - excludeName: "rfc", - excludeNum: 0, - excludeParam: `4291`, - includeName: "rfc", - includeNum: 1, - includeParam: `4291`, - }, - { - name: "rfc zero match", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.4"), - }, - }, - excludeName: "rfc", - excludeNum: 1, - excludeParam: `1918`, - includeName: "rfc", - includeNum: 0, - includeParam: `1918`, - }, - { - name: "rfc empty list", - ifAddrs: sockaddr.IfAddrs{}, - excludeName: "rfc", - excludeNum: 0, - excludeParam: `4291`, - includeName: "rfc", - includeNum: 0, - includeParam: `1918`, - }, - { - name: "size", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("10.2.3.4/24"), - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPAddr("203.0.113.0/24"), - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv6Addr("::1/24"), - }, - }, - excludeName: "size", - excludeParam: `24`, - excludeNum: 0, - includeName: "size", - includeParam: `24`, - includeNum: 3, - }, - { - name: "size invalid", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("10.2.3.4/24"), - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv6Addr("::1/128"), - }, - }, - fail: true, - excludeName: "size", - excludeParam: `33`, - excludeNum: 0, - includeName: "size", - includeParam: `-1`, - includeNum: 0, - }, - { - name: "type", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("10.2.3.4/24"), - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPAddr("203.0.113.0/24"), - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv6Addr("::1/127"), - }, - }, - excludeName: "type", - excludeParam: `ipv6`, - excludeNum: 2, - includeName: "type", - includeParam: `ipv4`, - includeNum: 2, - }, - { - name: "type", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("10.2.3.4/24"), - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPAddr("::1"), - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustUnixSock("/tmp/foo"), - }, - }, - excludeName: "type", - excludeParam: `ip`, - excludeNum: 1, - includeName: "type", - includeParam: `unix`, - includeNum: 1, - }, - { - name: "type invalid arg", - fail: true, - excludeName: "type", - excludeParam: `*`, - excludeNum: 0, - includeName: "type", - includeParam: `[`, - includeNum: 0, - }, - { - name: "type invalid", - fail: true, - excludeName: "foo", - excludeParam: `bar`, - excludeNum: 0, - includeName: "baz", - includeParam: `bur`, - includeNum: 0, - }, - } - - for i, test := range tests { - if test.name == "" { - t.Fatalf("test %d must have a name", i) - } - t.Run(fmt.Sprintf("%s-%s", test.name, "include"), func(t *testing.T) { - t.Logf("test.ifAddrs: %v", test.ifAddrs) - inIfAddrs, err := sockaddr.IncludeIfs(test.includeName, test.includeParam, test.ifAddrs) - t.Logf("inIfAddrs: %v", inIfAddrs) - - switch { - case !test.fail && err != nil: - t.Errorf("%s: failed unexpectedly: %v", test.name, err) - case test.fail && err == nil: - t.Errorf("%s: failed to throw an error", test.name) - case test.fail && err != nil: - // expected test failure - return - } - - if len(inIfAddrs) != test.includeNum { - t.Errorf("%s: failed include length check. Expected %d, got %d. Input: %q", test.name, test.includeNum, len(inIfAddrs), test.includeParam) - } - }) - - t.Run(fmt.Sprintf("%s-%s", test.name, "exclude"), func(t *testing.T) { - t.Logf("test.ifAddrs: %v", test.ifAddrs) - outIfAddrs, err := sockaddr.ExcludeIfs(test.excludeName, test.excludeParam, test.ifAddrs) - t.Logf("outIfAddrs: %v", outIfAddrs) - - switch { - case !test.fail && err != nil: - t.Errorf("%s: failed unexpectedly: %v", test.name, err) - case test.fail && err == nil: - t.Errorf("%s: failed to throw an error", test.name) - case test.fail && err != nil: - // expected test failure - return - } - - if len(outIfAddrs) != test.excludeNum { - t.Errorf("%s: failed exclude length check. Expected %d, got %d. Input: %q", test.name, test.excludeNum, len(outIfAddrs), test.excludeParam) - } - }) - } -} - -func TestNewIPAddr(t *testing.T) { - tests := []struct { - name string - input string - output string - pass bool - }{ - { - name: "ipv4", - input: "1.2.3.4", - output: "1.2.3.4", - pass: true, - }, - { - name: "ipv6", - input: "::1", - output: "::1", - pass: true, - }, - { - name: "invalid", - input: "255.255.255.256", - output: "", - pass: false, - }, - } - - for _, test := range tests { - ip, err := sockaddr.NewIPAddr(test.input) - switch { - case err == nil && test.pass, - err != nil && !test.pass: - - default: - t.Errorf("expected %s's success to be %t", test.input, test.pass) - } - - if !test.pass { - continue - } - - ipStr := ip.String() - if ipStr != test.output { - t.Errorf("Expected %q to match %q", test.input, test.output, ipStr) - } - - } -} - -func TestIPAttrs(t *testing.T) { - const expectedIPAttrs = 11 - ipAttrs := sockaddr.IPAttrs() - if len(ipAttrs) != expectedIPAttrs { - t.Fatalf("wrong number of args") - } -} - -func TestUniqueIfAddrsBy(t *testing.T) { - tests := []struct { - name string - ifAddrs sockaddr.IfAddrs - fail bool - selector string - expected []string - }{ - { - name: "address", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPAddr("203.0.113.0/24"), - Interface: net.Interface{ - Name: "abc0", - }, - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPAddr("203.0.113.0/24"), - Interface: net.Interface{ - Name: "abc0", - }, - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPAddr("10.2.3.4"), - Interface: net.Interface{ - Name: "foo1", - }, - }, - }, - selector: "address", - expected: []string{"203.0.113.0/24 {0 0 abc0 0}", "10.2.3.4 {0 0 foo1 0}"}, - }, - { - name: "name", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPAddr("::1"), - Interface: net.Interface{ - Name: "lo0", - }, - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPAddr("fe80::1"), - Interface: net.Interface{ - Name: "lo0", - }, - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPAddr("127.0.0.1"), - Interface: net.Interface{ - Name: "foo1", - }, - }, - }, - selector: "name", - expected: []string{"::1 {0 0 lo0 0}", "127.0.0.1 {0 0 foo1 0}"}, - }, - { - name: "invalid", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{}, - }, - fail: true, - selector: "goozfraba", - expected: []string{}, - }, - } - - for i, test := range tests { - if test.name == "" { - t.Fatalf("test %d must have a name", i) - } - t.Run(test.name, func(t *testing.T) { - - uniqueAddrs, err := sockaddr.UniqueIfAddrsBy(test.selector, test.ifAddrs) - switch { - case !test.fail && err != nil: - t.Fatalf("%s: failed unexpectedly: %v", test.name, err) - case test.fail && err == nil: - t.Fatalf("%s: failed to throw an error", test.name) - case test.fail && err != nil: - // expected test failure - return - } - - if len(uniqueAddrs) != len(test.expected) { - t.Fatalf("%s: failed uniquify by attribute %s", test.name, test.selector) - } - - for i := 0; i < len(uniqueAddrs); i++ { - got := uniqueAddrs[i].String() - if got != test.expected[i] { - t.Fatalf("%s: expected %q got %q", test.name, test.expected[i], got) - } - } - - }) - } -} - -func TestJoinIfAddrsBy(t *testing.T) { - tests := []struct { - name string - ifAddrs sockaddr.IfAddrs - fail bool - selector string - joinStr string - expected string - }{ - { - name: "address", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPAddr("203.0.113.0/24"), - Interface: net.Interface{ - Name: "abc0", - }, - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPAddr("203.0.113.1"), - Interface: net.Interface{ - Name: "abc0", - }, - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPAddr("10.2.3.4"), - Interface: net.Interface{ - Name: "foo1", - }, - }, - }, - selector: "address", - joinStr: " ", - expected: "203.0.113.0 203.0.113.1 10.2.3.4", - }, - { - name: "name", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPAddr("::1"), - Interface: net.Interface{ - Name: "lo0", - }, - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPAddr("fe80::1"), - Interface: net.Interface{ - Name: "foo0", - }, - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPAddr("127.0.0.1"), - Interface: net.Interface{ - Name: "bar2", - }, - }, - }, - selector: "name", - joinStr: "-/-", - expected: "lo0-/-foo0-/-bar2", - }, - { - name: "invalid", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPAddr("127.0.0.1"), - Interface: net.Interface{ - Name: "bar2", - }, - }, - }, - fail: true, - selector: "goozfraba", - expected: "", - }, - } - - for i, test := range tests { - if test.name == "" { - t.Fatalf("test %d must have a name", i) - } - t.Run(test.name, func(t *testing.T) { - - result, err := sockaddr.JoinIfAddrs(test.selector, test.joinStr, test.ifAddrs) - switch { - case !test.fail && err != nil: - t.Fatalf("%s: failed unexpectedly: %v", test.name, err) - case test.fail && err == nil: - t.Fatalf("%s: failed to throw an error", test.name) - case test.fail && err != nil: - // expected test failure - return - } - - if result != test.expected { - t.Fatalf("%s: expected %q got %q", test.name, test.expected, result) - } - - }) - } -} - -func TestLimitOffset(t *testing.T) { - tests := []struct { - name string - ifAddrs sockaddr.IfAddrs - limit uint - offset int - fail bool - expected sockaddr.IfAddrs - }{ - { - name: "basic limit offset", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPAddr("203.0.113.0/24")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPAddr("203.0.113.1")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPAddr("203.0.113.2")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPAddr("203.0.113.3")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPAddr("203.0.113.4")}, - }, - limit: 2, - offset: 1, - expected: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPAddr("203.0.113.1")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPAddr("203.0.113.2")}, - }, - }, - { - name: "negative offset with limit", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPAddr("203.0.113.0/24")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPAddr("203.0.113.1")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPAddr("203.0.113.2")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPAddr("203.0.113.3")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPAddr("203.0.113.4")}, - }, - limit: 2, - offset: -3, - expected: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPAddr("203.0.113.2")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPAddr("203.0.113.3")}, - }, - }, - { - name: "large limit", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPAddr("203.0.113.0/24")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPAddr("203.0.113.1")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPAddr("203.0.113.2")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPAddr("203.0.113.3")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPAddr("203.0.113.4")}, - }, - limit: 100, - offset: 3, - expected: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPAddr("203.0.113.3")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPAddr("203.0.113.4")}, - }, - }, - { - name: "bigger offset than size", - ifAddrs: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPAddr("203.0.113.0/24")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPAddr("203.0.113.1")}, - }, - fail: true, - limit: 1, - offset: 3, - }, - } - - for i, test := range tests { - if test.name == "" { - t.Fatalf("test %d must have a name", i) - } - t.Run(test.name, func(t *testing.T) { - - offsetResults, err := sockaddr.OffsetIfAddrs(test.offset, test.ifAddrs) - switch { - case !test.fail && err != nil: - t.Fatalf("%s: failed unexpectedly: %v", test.name, err) - case test.fail && err == nil: - t.Fatalf("%s: failed to throw an error", test.name) - case test.fail && err != nil: - // expected test failure - return - } - - limitResults, err := sockaddr.LimitIfAddrs(test.limit, offsetResults) - switch { - case !test.fail && err != nil: - t.Fatalf("%s: failed unexpectedly: %v", test.name, err) - case test.fail && err == nil: - t.Fatalf("%s: failed to throw an error", test.name) - case test.fail && err != nil: - // expected test failure - return - } - - if len(test.expected) != len(limitResults) { - t.Fatalf("bad") - } - - for i := 0; i < len(test.expected); i++ { - if !reflect.DeepEqual(limitResults[i], test.expected[i]) { - t.Errorf("objects in ordered limit") - } - } - }) - } -} - -func TestSortIfBy(t *testing.T) { - tests := []struct { - name string - sortStr string - in sockaddr.IfAddrs - out sockaddr.IfAddrs - fail bool - }{ - { - name: "sort address", - sortStr: "address", - in: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.3")}, - }, - out: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.3")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4")}, - }, - }, - { - name: "sort +address", - sortStr: "+address", - in: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.3")}, - }, - out: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.3")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4")}, - }, - }, - { - name: "sort -address", - sortStr: "-address", - in: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.3")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4")}, - }, - out: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.3")}, - }, - }, - { - // NOTE(seanc@): This test requires macOS, or at least a computer where - // en0 has the default route. - name: "sort default", - sortStr: "default", - in: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.4"), - Interface: net.Interface{Name: ifNameWithDefault}, - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.3"), - Interface: net.Interface{Name: "other0"}, - }, - }, - out: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.4"), - Interface: net.Interface{Name: ifNameWithDefault}, - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.3"), - Interface: net.Interface{Name: "other0"}, - }, - }, - }, - { - // NOTE(seanc@): This test requires macOS, or at least a computer where - // en0 has the default route. - name: "sort +default", - sortStr: "+default", - in: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.4"), - Interface: net.Interface{Name: "other0"}, - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.3"), - Interface: net.Interface{Name: ifNameWithDefault}, - }, - }, - out: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.3"), - Interface: net.Interface{Name: ifNameWithDefault}, - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.4"), - Interface: net.Interface{Name: "other0"}, - }, - }, - }, - { - name: "sort -default", - sortStr: "-default", - in: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.3"), - Interface: net.Interface{Name: ifNameWithDefault}, - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.4"), - Interface: net.Interface{Name: "other0"}, - }, - }, - out: sockaddr.IfAddrs{ - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.4"), - Interface: net.Interface{Name: "other0"}, - }, - sockaddr.IfAddr{ - SockAddr: sockaddr.MustIPv4Addr("1.2.3.3"), - Interface: net.Interface{Name: ifNameWithDefault}, - }, - }, - }, - { - name: "sort name", - sortStr: "name", - in: sockaddr.IfAddrs{ - sockaddr.IfAddr{Interface: net.Interface{Name: "foo"}}, - sockaddr.IfAddr{Interface: net.Interface{Name: "bar"}}, - }, - out: sockaddr.IfAddrs{ - sockaddr.IfAddr{Interface: net.Interface{Name: "bar"}}, - sockaddr.IfAddr{Interface: net.Interface{Name: "foo"}}, - }, - }, - { - name: "sort +name", - sortStr: "+name", - in: sockaddr.IfAddrs{ - sockaddr.IfAddr{Interface: net.Interface{Name: "foo"}}, - sockaddr.IfAddr{Interface: net.Interface{Name: "bar"}}, - }, - out: sockaddr.IfAddrs{ - sockaddr.IfAddr{Interface: net.Interface{Name: "bar"}}, - sockaddr.IfAddr{Interface: net.Interface{Name: "foo"}}, - }, - }, - { - name: "sort -name", - sortStr: "-name", - in: sockaddr.IfAddrs{ - sockaddr.IfAddr{Interface: net.Interface{Name: "bar"}}, - sockaddr.IfAddr{Interface: net.Interface{Name: "foo"}}, - }, - out: sockaddr.IfAddrs{ - sockaddr.IfAddr{Interface: net.Interface{Name: "foo"}}, - sockaddr.IfAddr{Interface: net.Interface{Name: "bar"}}, - }, - }, - { - name: "sort port", - sortStr: "port", - in: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4:80")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv6Addr("[::1]:53")}, - }, - out: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv6Addr("[::1]:53")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4:80")}, - }, - }, - { - name: "sort +port", - sortStr: "+port", - in: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4:80")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv6Addr("[::1]:53")}, - }, - out: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv6Addr("[::1]:53")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4:80")}, - }, - }, - { - name: "sort -port", - sortStr: "-port", - in: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv6Addr("[::1]:53")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4:80")}, - }, - out: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4:80")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv6Addr("[::1]:53")}, - }, - }, - { - name: "sort private", - sortStr: "private", - in: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4:80")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("192.168.1.1")}, - }, - out: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("192.168.1.1")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4:80")}, - }, - }, - { - name: "sort +private", - sortStr: "+private", - in: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4:80")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("192.168.1.1")}, - }, - out: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("192.168.1.1")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4:80")}, - }, - }, - { - name: "sort -private", - sortStr: "-private", - in: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("192.168.1.1")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4:80")}, - }, - out: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4:80")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("192.168.1.1")}, - }, - }, - { - name: "sort size", - sortStr: "size", - in: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("192.168.1.1/27")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4:80")}, - }, - out: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("192.168.1.1/27")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4:80")}, - }, - }, - { - name: "sort +size", - sortStr: "+size", - in: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("192.168.1.1/27")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4:80")}, - }, - out: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("192.168.1.1/27")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4:80")}, - }, - }, - { - name: "sort -size", - sortStr: "-size", - in: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("192.168.1.1/27")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4:80")}, - }, - out: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4:80")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("192.168.1.1/27")}, - }, - }, - { - name: "sort type", - sortStr: "type", - in: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv6Addr("::1")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("192.168.1.1/27")}, - }, - out: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("192.168.1.1/27")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv6Addr("::1")}, - }, - }, - { - name: "sort +type", - sortStr: "+type", - in: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv6Addr("::1")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("192.168.1.1/27")}, - }, - out: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("192.168.1.1/27")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv6Addr("::1")}, - }, - }, - { - name: "sort -type", - sortStr: "-type", - in: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv6Addr("::1")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4:80")}, - }, - out: sockaddr.IfAddrs{ - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv6Addr("::1")}, - sockaddr.IfAddr{SockAddr: sockaddr.MustIPv4Addr("1.2.3.4:80")}, - }, - }, - { - name: "sort invalid", - sortStr: "ENOENT", - fail: true, - }, - } - - for i, test := range tests { - if test.name == "" { - t.Fatalf("test %i needs a name", i) - } - - t.Run(test.name, func(t *testing.T) { - sorted, err := sockaddr.SortIfBy(test.sortStr, test.in) - if err != nil && !test.fail { - t.Fatalf("%s: sort failed: %v", test.name, err) - } - - if len(test.in) != len(sorted) { - t.Fatalf("wrong len") - } - - for i := 0; i < len(sorted); i++ { - if !reflect.DeepEqual(sorted[i], test.out[i]) { - t.Errorf("wrong sort order: %d %v %v", i, sorted[i], test.out[i]) - } - } - }) - } -} |