github.com/jaredpalmer/terraform@v1.1.0-alpha20210908.0.20210911170307-88705c943a03/internal/ipaddr/ip_test.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package ipaddr 6 7 import ( 8 stdnet "net" 9 "reflect" 10 "testing" 11 ) 12 13 // 14 // Lean on the standard net lib as much as possible. 15 // 16 type IPMask = stdnet.IPMask 17 18 var IPv4Mask = stdnet.IPv4Mask 19 20 var parseIPTests = []struct { 21 in string 22 out IP 23 }{ 24 {"127.0.1.2", IPv4(127, 0, 1, 2)}, 25 {"127.0.0.1", IPv4(127, 0, 0, 1)}, 26 {"127.001.002.003", IPv4(127, 1, 2, 3)}, 27 {"127.007.008.009", IPv4(127, 7, 8, 9)}, 28 {"127.010.020.030", IPv4(127, 10, 20, 30)}, 29 {"::ffff:127.1.2.3", IPv4(127, 1, 2, 3)}, 30 {"::ffff:127.001.002.003", IPv4(127, 1, 2, 3)}, 31 {"::ffff:127.007.008.009", IPv4(127, 7, 8, 9)}, 32 {"::ffff:127.010.020.030", IPv4(127, 10, 20, 30)}, 33 {"::ffff:7f01:0203", IPv4(127, 1, 2, 3)}, 34 {"0:0:0:0:0000:ffff:127.1.2.3", IPv4(127, 1, 2, 3)}, 35 {"0:0:0:0:000000:ffff:127.1.2.3", IPv4(127, 1, 2, 3)}, 36 {"0:0:0:0::ffff:127.1.2.3", IPv4(127, 1, 2, 3)}, 37 38 {"2001:4860:0:2001::68", IP{0x20, 0x01, 0x48, 0x60, 0, 0, 0x20, 0x01, 0, 0, 0, 0, 0, 0, 0x00, 0x68}}, 39 {"2001:4860:0000:2001:0000:0000:0000:0068", IP{0x20, 0x01, 0x48, 0x60, 0, 0, 0x20, 0x01, 0, 0, 0, 0, 0, 0, 0x00, 0x68}}, 40 41 {"-0.0.0.0", nil}, 42 {"0.-1.0.0", nil}, 43 {"0.0.-2.0", nil}, 44 {"0.0.0.-3", nil}, 45 {"127.0.0.256", nil}, 46 {"abc", nil}, 47 {"123:", nil}, 48 {"fe80::1%lo0", nil}, 49 {"fe80::1%911", nil}, 50 {"", nil}, 51 {"a1:a2:a3:a4::b1:b2:b3:b4", nil}, // Issue 6628 52 // 53 // NOTE: These correct failures were added for go-1.17, but are a 54 // backwards-incompatible change for Terraform users, who might have 55 // already written modules using leading zeroes. 56 // 57 //{"127.001.002.003", nil}, 58 //{"::ffff:127.001.002.003", nil}, 59 //{"123.000.000.000", nil}, 60 //{"1.2..4", nil}, 61 //{"0123.0.0.1", nil}, 62 } 63 64 func TestParseIP(t *testing.T) { 65 for _, tt := range parseIPTests { 66 if out := ParseIP(tt.in); !reflect.DeepEqual(out, tt.out) { 67 t.Errorf("ParseIP(%q) = %v, want %v", tt.in, out, tt.out) 68 } 69 } 70 } 71 72 var parseCIDRTests = []struct { 73 in string 74 ip IP 75 net *IPNet 76 err error 77 }{ 78 {"135.104.0.0/32", IPv4(135, 104, 0, 0), &IPNet{IP: IPv4(135, 104, 0, 0), Mask: IPv4Mask(255, 255, 255, 255)}, nil}, 79 {"0.0.0.0/24", IPv4(0, 0, 0, 0), &IPNet{IP: IPv4(0, 0, 0, 0), Mask: IPv4Mask(255, 255, 255, 0)}, nil}, 80 {"135.104.0.0/24", IPv4(135, 104, 0, 0), &IPNet{IP: IPv4(135, 104, 0, 0), Mask: IPv4Mask(255, 255, 255, 0)}, nil}, 81 {"135.104.0.1/32", IPv4(135, 104, 0, 1), &IPNet{IP: IPv4(135, 104, 0, 1), Mask: IPv4Mask(255, 255, 255, 255)}, nil}, 82 {"135.104.0.1/24", IPv4(135, 104, 0, 1), &IPNet{IP: IPv4(135, 104, 0, 0), Mask: IPv4Mask(255, 255, 255, 0)}, nil}, 83 {"127.000.000.001/32", IPv4(127, 0, 0, 1), &IPNet{IP: IPv4(127, 0, 0, 1), Mask: IPv4Mask(255, 255, 255, 255)}, nil}, 84 {"127.007.008.009/32", IPv4(127, 7, 8, 9), &IPNet{IP: IPv4(127, 7, 8, 9), Mask: IPv4Mask(255, 255, 255, 255)}, nil}, 85 {"127.010.020.030/32", IPv4(127, 10, 20, 30), &IPNet{IP: IPv4(127, 10, 20, 30), Mask: IPv4Mask(255, 255, 255, 255)}, nil}, 86 {"::1/128", ParseIP("::1"), &IPNet{IP: ParseIP("::1"), Mask: IPMask(ParseIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))}, nil}, 87 {"abcd:2345::/127", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe"))}, nil}, 88 {"abcd:2345::/65", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff:ffff:ffff:8000::"))}, nil}, 89 {"abcd:2345::/64", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff:ffff:ffff::"))}, nil}, 90 {"abcd:2345::/63", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff:ffff:fffe::"))}, nil}, 91 {"abcd:2345::/33", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff:8000::"))}, nil}, 92 {"abcd:2345::/32", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff::"))}, nil}, 93 {"abcd:2344::/31", ParseIP("abcd:2344::"), &IPNet{IP: ParseIP("abcd:2344::"), Mask: IPMask(ParseIP("ffff:fffe::"))}, nil}, 94 {"abcd:2300::/24", ParseIP("abcd:2300::"), &IPNet{IP: ParseIP("abcd:2300::"), Mask: IPMask(ParseIP("ffff:ff00::"))}, nil}, 95 {"abcd:2345::/24", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2300::"), Mask: IPMask(ParseIP("ffff:ff00::"))}, nil}, 96 {"2001:DB8::/48", ParseIP("2001:DB8::"), &IPNet{IP: ParseIP("2001:DB8::"), Mask: IPMask(ParseIP("ffff:ffff:ffff::"))}, nil}, 97 {"2001:DB8::1/48", ParseIP("2001:DB8::1"), &IPNet{IP: ParseIP("2001:DB8::"), Mask: IPMask(ParseIP("ffff:ffff:ffff::"))}, nil}, 98 {"192.168.1.1/255.255.255.0", nil, nil, &ParseError{Type: "CIDR address", Text: "192.168.1.1/255.255.255.0"}}, 99 {"192.168.1.1/35", nil, nil, &ParseError{Type: "CIDR address", Text: "192.168.1.1/35"}}, 100 {"2001:db8::1/-1", nil, nil, &ParseError{Type: "CIDR address", Text: "2001:db8::1/-1"}}, 101 {"2001:db8::1/-0", nil, nil, &ParseError{Type: "CIDR address", Text: "2001:db8::1/-0"}}, 102 {"-0.0.0.0/32", nil, nil, &ParseError{Type: "CIDR address", Text: "-0.0.0.0/32"}}, 103 {"0.-1.0.0/32", nil, nil, &ParseError{Type: "CIDR address", Text: "0.-1.0.0/32"}}, 104 {"0.0.-2.0/32", nil, nil, &ParseError{Type: "CIDR address", Text: "0.0.-2.0/32"}}, 105 {"0.0.0.-3/32", nil, nil, &ParseError{Type: "CIDR address", Text: "0.0.0.-3/32"}}, 106 {"0.0.0.0/-0", nil, nil, &ParseError{Type: "CIDR address", Text: "0.0.0.0/-0"}}, 107 // 108 // NOTE: Theis correct failure was added for go-1.17, but is a 109 // backwards-incompatible change for Terraform users, who might have 110 // already written modules using leading zeroes. 111 // 112 //{"127.000.000.001/32", nil, nil, &ParseError{Type: "CIDR address", Text: "127.000.000.001/32"}}, 113 {"", nil, nil, &ParseError{Type: "CIDR address", Text: ""}}, 114 } 115 116 func TestParseCIDR(t *testing.T) { 117 for _, tt := range parseCIDRTests { 118 ip, net, err := ParseCIDR(tt.in) 119 if !reflect.DeepEqual(err, tt.err) { 120 t.Errorf("ParseCIDR(%q) = %v, %v; want %v, %v", tt.in, ip, net, tt.ip, tt.net) 121 } 122 if err == nil && (!tt.ip.Equal(ip) || !tt.net.IP.Equal(net.IP) || !reflect.DeepEqual(net.Mask, tt.net.Mask)) { 123 t.Errorf("ParseCIDR(%q) = %v, {%v, %v}; want %v, {%v, %v}", tt.in, ip, net.IP, net.Mask, tt.ip, tt.net.IP, tt.net.Mask) 124 } 125 } 126 }