1
2
3
4
5 package net
6
7
8
9
10
11
12
13
14
15 import (
16 stdnet "net"
17 "reflect"
18 "testing"
19 )
20
21
22
23
24 type IPMask = stdnet.IPMask
25
26 var IPv4Mask = stdnet.IPv4Mask
27
28 var parseIPTests = []struct {
29 in string
30 out IP
31 }{
32 {"127.0.1.2", IPv4(127, 0, 1, 2)},
33 {"127.0.0.1", IPv4(127, 0, 0, 1)},
34 {"127.001.002.003", IPv4(127, 1, 2, 3)},
35 {"127.007.008.009", IPv4(127, 7, 8, 9)},
36 {"127.010.020.030", IPv4(127, 10, 20, 30)},
37 {"::ffff:127.1.2.3", IPv4(127, 1, 2, 3)},
38 {"::ffff:127.001.002.003", IPv4(127, 1, 2, 3)},
39 {"::ffff:127.007.008.009", IPv4(127, 7, 8, 9)},
40 {"::ffff:127.010.020.030", IPv4(127, 10, 20, 30)},
41 {"::ffff:7f01:0203", IPv4(127, 1, 2, 3)},
42 {"0:0:0:0:0000:ffff:127.1.2.3", IPv4(127, 1, 2, 3)},
43 {"0:0:0:0:000000:ffff:127.1.2.3", IPv4(127, 1, 2, 3)},
44 {"0:0:0:0::ffff:127.1.2.3", IPv4(127, 1, 2, 3)},
45
46 {"2001:4860:0:2001::68", IP{0x20, 0x01, 0x48, 0x60, 0, 0, 0x20, 0x01, 0, 0, 0, 0, 0, 0, 0x00, 0x68}},
47 {"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}},
48
49 {"-0.0.0.0", nil},
50 {"0.-1.0.0", nil},
51 {"0.0.-2.0", nil},
52 {"0.0.0.-3", nil},
53 {"127.0.0.256", nil},
54 {"abc", nil},
55 {"123:", nil},
56 {"fe80::1%lo0", nil},
57 {"fe80::1%911", nil},
58 {"", nil},
59 {"a1:a2:a3:a4::b1:b2:b3:b4", nil},
60
61
62
63
64
65
66
67
68
69
70
71
72 }
73
74 func TestParseIP(t *testing.T) {
75 for _, tt := range parseIPTests {
76 if out := ParseIP(tt.in); !reflect.DeepEqual(out, tt.out) {
77 t.Errorf("ParseIP(%q) = %v, want %v", tt.in, out, tt.out)
78 }
79 }
80 }
81
82 var parseCIDRTests = []struct {
83 in string
84 ip IP
85 net *IPNet
86 err error
87 }{
88 {"135.104.0.0/32", IPv4(135, 104, 0, 0), &IPNet{IP: IPv4(135, 104, 0, 0), Mask: IPv4Mask(255, 255, 255, 255)}, nil},
89 {"0.0.0.0/24", IPv4(0, 0, 0, 0), &IPNet{IP: IPv4(0, 0, 0, 0), Mask: IPv4Mask(255, 255, 255, 0)}, nil},
90 {"135.104.0.0/24", IPv4(135, 104, 0, 0), &IPNet{IP: IPv4(135, 104, 0, 0), Mask: IPv4Mask(255, 255, 255, 0)}, nil},
91 {"135.104.0.1/32", IPv4(135, 104, 0, 1), &IPNet{IP: IPv4(135, 104, 0, 1), Mask: IPv4Mask(255, 255, 255, 255)}, nil},
92 {"135.104.0.1/24", IPv4(135, 104, 0, 1), &IPNet{IP: IPv4(135, 104, 0, 0), Mask: IPv4Mask(255, 255, 255, 0)}, nil},
93
94 {"127.000.000.001/32", IPv4(127, 0, 0, 1), &IPNet{IP: IPv4(127, 0, 0, 1), Mask: IPv4Mask(255, 255, 255, 255)}, nil},
95 {"127.007.008.009/32", IPv4(127, 7, 8, 9), &IPNet{IP: IPv4(127, 7, 8, 9), Mask: IPv4Mask(255, 255, 255, 255)}, nil},
96 {"127.010.020.030/32", IPv4(127, 10, 20, 30), &IPNet{IP: IPv4(127, 10, 20, 30), Mask: IPv4Mask(255, 255, 255, 255)}, nil},
97 {"::1/128", ParseIP("::1"), &IPNet{IP: ParseIP("::1"), Mask: IPMask(ParseIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))}, nil},
98 {"abcd:2345::/127", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe"))}, nil},
99 {"abcd:2345::/65", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff:ffff:ffff:8000::"))}, nil},
100 {"abcd:2345::/64", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff:ffff:ffff::"))}, nil},
101 {"abcd:2345::/63", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff:ffff:fffe::"))}, nil},
102 {"abcd:2345::/33", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff:8000::"))}, nil},
103 {"abcd:2345::/32", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff::"))}, nil},
104 {"abcd:2344::/31", ParseIP("abcd:2344::"), &IPNet{IP: ParseIP("abcd:2344::"), Mask: IPMask(ParseIP("ffff:fffe::"))}, nil},
105 {"abcd:2300::/24", ParseIP("abcd:2300::"), &IPNet{IP: ParseIP("abcd:2300::"), Mask: IPMask(ParseIP("ffff:ff00::"))}, nil},
106 {"abcd:2345::/24", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2300::"), Mask: IPMask(ParseIP("ffff:ff00::"))}, nil},
107 {"2001:DB8::/48", ParseIP("2001:DB8::"), &IPNet{IP: ParseIP("2001:DB8::"), Mask: IPMask(ParseIP("ffff:ffff:ffff::"))}, nil},
108 {"2001:DB8::1/48", ParseIP("2001:DB8::1"), &IPNet{IP: ParseIP("2001:DB8::"), Mask: IPMask(ParseIP("ffff:ffff:ffff::"))}, nil},
109 {"192.168.1.1/255.255.255.0", nil, nil, &ParseError{Type: "CIDR address", Text: "192.168.1.1/255.255.255.0"}},
110 {"192.168.1.1/35", nil, nil, &ParseError{Type: "CIDR address", Text: "192.168.1.1/35"}},
111 {"2001:db8::1/-1", nil, nil, &ParseError{Type: "CIDR address", Text: "2001:db8::1/-1"}},
112 {"2001:db8::1/-0", nil, nil, &ParseError{Type: "CIDR address", Text: "2001:db8::1/-0"}},
113 {"-0.0.0.0/32", nil, nil, &ParseError{Type: "CIDR address", Text: "-0.0.0.0/32"}},
114 {"0.-1.0.0/32", nil, nil, &ParseError{Type: "CIDR address", Text: "0.-1.0.0/32"}},
115 {"0.0.-2.0/32", nil, nil, &ParseError{Type: "CIDR address", Text: "0.0.-2.0/32"}},
116 {"0.0.0.-3/32", nil, nil, &ParseError{Type: "CIDR address", Text: "0.0.0.-3/32"}},
117 {"0.0.0.0/-0", nil, nil, &ParseError{Type: "CIDR address", Text: "0.0.0.0/-0"}},
118
119
120 {"", nil, nil, &ParseError{Type: "CIDR address", Text: ""}},
121 }
122
123 func TestParseCIDR(t *testing.T) {
124 for _, tt := range parseCIDRTests {
125 ip, net, err := ParseCIDR(tt.in)
126 if !reflect.DeepEqual(err, tt.err) {
127 t.Errorf("ParseCIDR(%q) = %v, %v; want %v, %v", tt.in, ip, net, tt.ip, tt.net)
128 }
129 if err == nil && (!tt.ip.Equal(ip) || !tt.net.IP.Equal(net.IP) || !reflect.DeepEqual(net.Mask, tt.net.Mask)) {
130 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)
131 }
132 }
133 }
134
View as plain text