summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/hashicorp/go-sockaddr/sockaddrs_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/hashicorp/go-sockaddr/sockaddrs_test.go')
-rw-r--r--vendor/github.com/hashicorp/go-sockaddr/sockaddrs_test.go338
1 files changed, 338 insertions, 0 deletions
diff --git a/vendor/github.com/hashicorp/go-sockaddr/sockaddrs_test.go b/vendor/github.com/hashicorp/go-sockaddr/sockaddrs_test.go
new file mode 100644
index 000000000..118cf5b1e
--- /dev/null
+++ b/vendor/github.com/hashicorp/go-sockaddr/sockaddrs_test.go
@@ -0,0 +1,338 @@
+package sockaddr_test
+
+import (
+ "fmt"
+ "math/rand"
+ "testing"
+
+ "github.com/hashicorp/consul/lib"
+ "github.com/hashicorp/go-sockaddr"
+)
+
+func init() {
+ lib.SeedMathRand()
+}
+
+// NOTE: A number of these code paths are exercised in template/ and
+// cmd/sockaddr/
+
+// sockAddrStringInputs allows for easy test creation by developers.
+// Parallel arrays of string inputs are converted to their SockAddr
+// equivalents for use by unit tests.
+type sockAddrStringInputs []struct {
+ inputAddrs []string
+ sortedAddrs []string
+ sortedTypes []sockaddr.SockAddrType
+ sortFuncs []sockaddr.CmpAddrFunc
+ numIPv4Inputs int
+ numIPv6Inputs int
+ numUnixInputs int
+}
+
+func convertToSockAddrs(t *testing.T, inputs []string) sockaddr.SockAddrs {
+ sockAddrs := make(sockaddr.SockAddrs, 0, len(inputs))
+ for i, input := range inputs {
+ sa, err := sockaddr.NewSockAddr(input)
+ if err != nil {
+ t.Fatalf("[%d] Invalid SockAddr input for %+q: %v", i, input, err)
+ }
+ sockAddrs = append(sockAddrs, sa)
+ }
+
+ return sockAddrs
+}
+
+// shuffleStrings randomly shuffles the list of strings
+func shuffleStrings(list []string) {
+ for i := range list {
+ j := rand.Intn(i + 1)
+ list[i], list[j] = list[j], list[i]
+ }
+}
+
+func TestSockAddr_SockAddrs_AscAddress(t *testing.T) {
+ testInputs := sockAddrStringInputs{
+ { // testNum: 0
+ sortFuncs: []sockaddr.CmpAddrFunc{
+ sockaddr.AscAddress,
+ },
+ numIPv4Inputs: 9,
+ numIPv6Inputs: 1,
+ numUnixInputs: 0,
+ inputAddrs: []string{
+ "10.0.0.0/8",
+ "172.16.1.3/12",
+ "128.95.120.2:53",
+ "128.95.120.2/32",
+ "192.168.0.0/16",
+ "128.95.120.1/32",
+ "192.168.1.10/24",
+ "128.95.120.2:8600",
+ "240.0.0.1/4",
+ "::",
+ },
+ sortedAddrs: []string{
+ "10.0.0.0/8",
+ "128.95.120.1/32",
+ "128.95.120.2:53",
+ "128.95.120.2/32",
+ "128.95.120.2:8600",
+ "172.16.1.3/12",
+ "192.168.0.0/16",
+ "192.168.1.10/24",
+ "240.0.0.1/4",
+ "::",
+ },
+ },
+ }
+
+ for idx, test := range testInputs {
+ t.Run(fmt.Sprintf("%d", idx), func(t *testing.T) {
+ shuffleStrings(test.inputAddrs)
+ inputSockAddrs := convertToSockAddrs(t, test.inputAddrs)
+ sas := convertToSockAddrs(t, test.sortedAddrs)
+ sortedIPv4Addrs, nonIPv4Addrs := sas.FilterByType(sockaddr.TypeIPv4)
+ if l := len(sortedIPv4Addrs); l != test.numIPv4Inputs {
+ t.Fatal("[%d] Missing IPv4Addrs: expected %d, received %d", idx, test.numIPv4Inputs, l)
+ }
+ if len(nonIPv4Addrs) != test.numIPv6Inputs+test.numUnixInputs {
+ t.Fatal("[%d] Non-IPv4 Address in input", idx)
+ }
+
+ // Copy inputAddrs so we can manipulate it. wtb const.
+ sockAddrs := append(sockaddr.SockAddrs(nil), inputSockAddrs...)
+ filteredAddrs, _ := sockAddrs.FilterByType(sockaddr.TypeIPv4)
+ sockaddr.OrderedAddrBy(test.sortFuncs...).Sort(filteredAddrs)
+ ipv4SockAddrs, nonIPv4s := filteredAddrs.FilterByType(sockaddr.TypeIPv4)
+ if len(nonIPv4s) != 0 {
+ t.Fatalf("[%d] bad", idx)
+ }
+
+ for i, ipv4SockAddr := range ipv4SockAddrs {
+ ipv4Addr := sockaddr.ToIPv4Addr(ipv4SockAddr)
+ sortedIPv4Addr := sockaddr.ToIPv4Addr(sortedIPv4Addrs[i])
+ if ipv4Addr.Address != sortedIPv4Addr.Address {
+ t.Errorf("[%d/%d] Sort equality failed: expected %s, received %s", idx, i, sortedIPv4Addrs[i], ipv4Addr)
+ }
+ }
+ })
+ }
+}
+
+func TestSockAddr_SockAddrs_AscPrivate(t *testing.T) {
+ testInputs := []struct {
+ sortFuncs []sockaddr.CmpAddrFunc
+ inputAddrs []string
+ sortedAddrs []string
+ }{
+ { // testNum: 0
+ sortFuncs: []sockaddr.CmpAddrFunc{
+ sockaddr.AscType,
+ sockaddr.AscPrivate,
+ sockaddr.AscAddress,
+ sockaddr.AscType,
+ sockaddr.AscAddress,
+ sockaddr.AscPort,
+ },
+ inputAddrs: []string{
+ "10.0.0.0/8",
+ "172.16.1.3/12",
+ "192.168.0.0/16",
+ "192.168.0.0/16",
+ "192.168.1.10/24",
+ "128.95.120.1/32",
+ "128.95.120.2/32",
+ "128.95.120.2:53",
+ "128.95.120.2:8600",
+ "240.0.0.1/4",
+ "::",
+ },
+ sortedAddrs: []string{
+ "10.0.0.0/8",
+ "172.16.1.3/12",
+ "192.168.0.0/16",
+ "192.168.0.0/16",
+ "192.168.1.10/24",
+ "240.0.0.1/4",
+ "128.95.120.1/32",
+ "128.95.120.2/32",
+ // "128.95.120.2:53",
+ // "128.95.120.2:8600",
+ // "::",
+ },
+ },
+ {
+ sortFuncs: []sockaddr.CmpAddrFunc{
+ sockaddr.AscType,
+ sockaddr.AscPrivate,
+ sockaddr.AscAddress,
+ },
+ inputAddrs: []string{
+ "1.2.3.4:53",
+ "192.168.1.2",
+ "/tmp/foo",
+ "[cc::1]:8600",
+ "[::1]:53",
+ },
+ sortedAddrs: []string{
+ "/tmp/foo",
+ "192.168.1.2",
+ "1.2.3.4:53",
+ "[::1]:53",
+ "[cc::1]:8600",
+ },
+ },
+ {
+ sortFuncs: []sockaddr.CmpAddrFunc{
+ sockaddr.AscType,
+ sockaddr.AscPrivate,
+ sockaddr.AscAddress,
+ },
+ inputAddrs: []string{
+ "/tmp/foo",
+ "/tmp/bar",
+ "1.2.3.4",
+ },
+ sortedAddrs: []string{
+ "/tmp/bar",
+ "/tmp/foo",
+ "1.2.3.4",
+ },
+ },
+ }
+
+ for idx, test := range testInputs {
+ t.Run(fmt.Sprintf("%d", idx), func(t *testing.T) {
+ sortedAddrs := convertToSockAddrs(t, test.sortedAddrs)
+
+ inputAddrs := append([]string(nil), test.inputAddrs...)
+ shuffleStrings(inputAddrs)
+ inputSockAddrs := convertToSockAddrs(t, inputAddrs)
+
+ sockaddr.OrderedAddrBy(test.sortFuncs...).Sort(inputSockAddrs)
+
+ for i, sockAddr := range sortedAddrs {
+ if !sockAddr.Equal(inputSockAddrs[i]) {
+ t.Logf("Input Addrs:\t%+v", inputAddrs)
+ t.Logf("Sorted Addrs:\t%+v", inputSockAddrs)
+ t.Logf("Expected Addrs:\t%+v", test.sortedAddrs)
+ t.Fatalf("[%d/%d] Sort AscType/AscAddress failed: expected %+q, received %+q", idx, i, sockAddr, inputSockAddrs[i])
+ }
+ }
+ })
+ }
+}
+
+func TestSockAddr_SockAddrs_AscPort(t *testing.T) {
+ testInputs := []struct {
+ name string
+ sortFuncs []sockaddr.CmpAddrFunc
+ inputAddrs []string
+ sortedAddrs []string
+ }{
+ {
+ name: "simple port test",
+ sortFuncs: []sockaddr.CmpAddrFunc{
+ sockaddr.AscPort,
+ sockaddr.AscType,
+ },
+ inputAddrs: []string{
+ "1.2.3.4:53",
+ "/tmp/foo",
+ "[::1]:53",
+ },
+ sortedAddrs: []string{
+ "/tmp/foo",
+ "1.2.3.4:53",
+ "[::1]:53",
+ },
+ },
+ {
+ name: "simple port test",
+ sortFuncs: []sockaddr.CmpAddrFunc{
+ sockaddr.AscPort,
+ sockaddr.AscType,
+ },
+ inputAddrs: []string{
+ "1.2.3.4:53",
+ "/tmp/foo",
+ },
+ sortedAddrs: []string{
+ "/tmp/foo",
+ "1.2.3.4:53",
+ },
+ },
+ }
+
+ for idx, test := range testInputs {
+ t.Run(test.name, func(t *testing.T) {
+ sortedAddrs := convertToSockAddrs(t, test.sortedAddrs)
+
+ inputAddrs := append([]string(nil), test.inputAddrs...)
+ shuffleStrings(inputAddrs)
+ inputSockAddrs := convertToSockAddrs(t, inputAddrs)
+
+ sockaddr.OrderedAddrBy(test.sortFuncs...).Sort(inputSockAddrs)
+
+ for i, sockAddr := range sortedAddrs {
+ if !sockAddr.Equal(inputSockAddrs[i]) {
+ t.Logf("Input Addrs:\t%+v", inputAddrs)
+ t.Logf("Sorted Addrs:\t%+v", inputSockAddrs)
+ t.Logf("Expected Addrs:\t%+v", test.sortedAddrs)
+ t.Fatalf("[%d/%d] Sort AscType/AscAddress failed: expected %+q, received %+q", idx, i, sockAddr, inputSockAddrs[i])
+ }
+ }
+ })
+ }
+}
+
+func TestSockAddr_SockAddrs_AscType(t *testing.T) {
+ testInputs := sockAddrStringInputs{
+ { // testNum: 0
+ sortFuncs: []sockaddr.CmpAddrFunc{
+ sockaddr.AscType,
+ },
+ inputAddrs: []string{
+ "10.0.0.0/8",
+ "172.16.1.3/12",
+ "128.95.120.2:53",
+ "::",
+ "128.95.120.2/32",
+ "192.168.0.0/16",
+ "128.95.120.1/32",
+ "192.168.1.10/24",
+ "128.95.120.2:8600",
+ "240.0.0.1/4",
+ },
+ sortedTypes: []sockaddr.SockAddrType{
+ sockaddr.TypeIPv4,
+ sockaddr.TypeIPv4,
+ sockaddr.TypeIPv4,
+ sockaddr.TypeIPv4,
+ sockaddr.TypeIPv4,
+ sockaddr.TypeIPv4,
+ sockaddr.TypeIPv4,
+ sockaddr.TypeIPv4,
+ sockaddr.TypeIPv4,
+ sockaddr.TypeIPv6,
+ },
+ },
+ }
+
+ for idx, test := range testInputs {
+ t.Run(fmt.Sprintf("%d", idx), func(t *testing.T) {
+ shuffleStrings(test.inputAddrs)
+
+ inputSockAddrs := convertToSockAddrs(t, test.inputAddrs)
+ sortedAddrs := convertToSockAddrs(t, test.sortedAddrs)
+
+ sockaddr.OrderedAddrBy(test.sortFuncs...).Sort(inputSockAddrs)
+
+ for i, sockAddr := range sortedAddrs {
+ if sockAddr.Type() != sortedAddrs[i].Type() {
+ t.Errorf("[%d/%d] Sort AscType failed: expected %+q, received %+q", idx, i, sortedAddrs[i], sockAddr)
+ }
+ }
+ })
+ }
+}