network_test.go raw
1 package addrmgr_test
2
3 import (
4 "net"
5 "testing"
6
7 "github.com/p9c/p9/pkg/addrmgr"
8 "github.com/p9c/p9/pkg/wire"
9 )
10
11 // TestIPTypes ensures the various functions which determine the type of an IP address based on RFCs work as intended.
12 func TestIPTypes(t *testing.T) {
13 type ipTest struct {
14 in wire.NetAddress
15 rfc1918 bool
16 rfc2544 bool
17 rfc3849 bool
18 rfc3927 bool
19 rfc3964 bool
20 rfc4193 bool
21 rfc4380 bool
22 rfc4843 bool
23 rfc4862 bool
24 rfc5737 bool
25 rfc6052 bool
26 rfc6145 bool
27 rfc6598 bool
28 local bool
29 valid bool
30 routable bool
31 }
32 newIPTest := func(ip string, rfc1918, rfc2544, rfc3849, rfc3927, rfc3964,
33 rfc4193, rfc4380, rfc4843, rfc4862, rfc5737, rfc6052, rfc6145, rfc6598,
34 local, valid, routable bool,
35 ) ipTest {
36 nip := net.ParseIP(ip)
37 na := *wire.NewNetAddressIPPort(nip, 11047, wire.SFNodeNetwork)
38 test := ipTest{na, rfc1918, rfc2544, rfc3849, rfc3927, rfc3964, rfc4193, rfc4380,
39 rfc4843, rfc4862, rfc5737, rfc6052, rfc6145, rfc6598, local, valid, routable,
40 }
41 return test
42 }
43 tests := []ipTest{
44 newIPTest("10.255.255.255", true, false, false, false, false, false,
45 false, false, false, false, false, false, false, false, true, false,
46 ),
47 newIPTest("192.168.0.1", true, false, false, false, false, false,
48 false, false, false, false, false, false, false, false, true, false,
49 ),
50 newIPTest("172.31.255.1", true, false, false, false, false, false,
51 false, false, false, false, false, false, false, false, true, false,
52 ),
53 newIPTest("172.32.1.1", false, false, false, false, false, false, false, false,
54 false, false, false, false, false, false, true, true,
55 ),
56 newIPTest("169.254.250.120", false, false, false, true, false, false,
57 false, false, false, false, false, false, false, false, true, false,
58 ),
59 newIPTest("0.0.0.0", false, false, false, false, false, false, false,
60 false, false, false, false, false, false, true, false, false,
61 ),
62 newIPTest("255.255.255.255", false, false, false, false, false, false,
63 false, false, false, false, false, false, false, false, false, false,
64 ),
65 newIPTest("127.0.0.1", false, false, false, false, false, false,
66 false, false, false, false, false, false, false, true, true, false,
67 ),
68 newIPTest("fd00:dead::1", false, false, false, false, false, true,
69 false, false, false, false, false, false, false, false, true, false,
70 ),
71 newIPTest("2001::1", false, false, false, false, false, false,
72 true, false, false, false, false, false, false, false, true, true,
73 ),
74 newIPTest("2001:10:abcd::1:1", false, false, false, false, false, false,
75 false, true, false, false, false, false, false, false, true, false,
76 ),
77 newIPTest("fe80::1", false, false, false, false, false, false,
78 false, false, true, false, false, false, false, false, true, false,
79 ),
80 newIPTest("fe80:1::1", false, false, false, false, false, false,
81 false, false, false, false, false, false, false, false, true, true,
82 ),
83 newIPTest("64:ff9b::1", false, false, false, false, false, false,
84 false, false, false, false, true, false, false, false, true, true,
85 ),
86 newIPTest("::ffff:abcd:ef12:1", false, false, false, false, false, false,
87 false, false, false, false, false, false, false, false, true, true,
88 ),
89 newIPTest("::1", false, false, false, false, false, false, false, false,
90 false, false, false, false, false, true, true, false,
91 ),
92 newIPTest("198.18.0.1", false, true, false, false, false, false, false,
93 false, false, false, false, false, false, false, true, false,
94 ),
95 newIPTest("100.127.255.1", false, false, false, false, false, false, false,
96 false, false, false, false, false, true, false, true, false,
97 ),
98 newIPTest("203.0.113.1", false, false, false, false, false, false, false,
99 false, false, false, false, false, false, false, true, false,
100 ),
101 }
102 t.Logf("Running %d tests", len(tests))
103 for _, test := range tests {
104 if rv := addrmgr.IsRFC1918(&test.in); rv != test.rfc1918 {
105 t.Errorf("IsRFC1918 %s\n got: %v want: %v", test.in.IP, rv, test.rfc1918)
106 }
107 if rv := addrmgr.IsRFC3849(&test.in); rv != test.rfc3849 {
108 t.Errorf("IsRFC3849 %s\n got: %v want: %v", test.in.IP, rv, test.rfc3849)
109 }
110 if rv := addrmgr.IsRFC3927(&test.in); rv != test.rfc3927 {
111 t.Errorf("IsRFC3927 %s\n got: %v want: %v", test.in.IP, rv, test.rfc3927)
112 }
113 if rv := addrmgr.IsRFC3964(&test.in); rv != test.rfc3964 {
114 t.Errorf("IsRFC3964 %s\n got: %v want: %v", test.in.IP, rv, test.rfc3964)
115 }
116 if rv := addrmgr.IsRFC4193(&test.in); rv != test.rfc4193 {
117 t.Errorf("IsRFC4193 %s\n got: %v want: %v", test.in.IP, rv, test.rfc4193)
118 }
119 if rv := addrmgr.IsRFC4380(&test.in); rv != test.rfc4380 {
120 t.Errorf("IsRFC4380 %s\n got: %v want: %v", test.in.IP, rv, test.rfc4380)
121 }
122 if rv := addrmgr.IsRFC4843(&test.in); rv != test.rfc4843 {
123 t.Errorf("IsRFC4843 %s\n got: %v want: %v", test.in.IP, rv, test.rfc4843)
124 }
125 if rv := addrmgr.IsRFC4862(&test.in); rv != test.rfc4862 {
126 t.Errorf("IsRFC4862 %s\n got: %v want: %v", test.in.IP, rv, test.rfc4862)
127 }
128 if rv := addrmgr.IsRFC6052(&test.in); rv != test.rfc6052 {
129 t.Errorf("isRFC6052 %s\n got: %v want: %v", test.in.IP, rv, test.rfc6052)
130 }
131 if rv := addrmgr.IsRFC6145(&test.in); rv != test.rfc6145 {
132 t.Errorf("IsRFC1918 %s\n got: %v want: %v", test.in.IP, rv, test.rfc6145)
133 }
134 if rv := addrmgr.IsLocal(&test.in); rv != test.local {
135 t.Errorf("IsLocal %s\n got: %v want: %v", test.in.IP, rv, test.local)
136 }
137 if rv := addrmgr.IsValid(&test.in); rv != test.valid {
138 t.Errorf("IsValid %s\n got: %v want: %v", test.in.IP, rv, test.valid)
139 }
140 if rv := addrmgr.IsRoutable(&test.in); rv != test.routable {
141 t.Errorf("IsRoutable %s\n got: %v want: %v", test.in.IP, rv, test.routable)
142 }
143 }
144 }
145
146 // TestGroupKey tests the GroupKey function to ensure it properly groups various IP addresses.
147 func TestGroupKey(t *testing.T) {
148 tests := []struct {
149 name string
150 ip string
151 expected string
152 }{
153 // Local addresses.
154 {name: "ipv4 localhost", ip: "127.0.0.1", expected: "local"},
155 {name: "ipv6 localhost", ip: "::1", expected: "local"},
156 {name: "ipv4 zero", ip: "0.0.0.0", expected: "local"},
157 {name: "ipv4 first octet zero", ip: "0.1.2.3", expected: "local"},
158 // Unroutable addresses.
159 {name: "ipv4 invalid bcast", ip: "255.255.255.255", expected: "unroutable"},
160 {name: "ipv4 rfc1918 10/8", ip: "10.1.2.3", expected: "unroutable"},
161 {name: "ipv4 rfc1918 172.16/12", ip: "172.16.1.2", expected: "unroutable"},
162 {name: "ipv4 rfc1918 192.168/16", ip: "192.168.1.2", expected: "unroutable"},
163 {name: "ipv6 rfc3849 2001:db8::/32", ip: "2001:db8::1234", expected: "unroutable"},
164 {name: "ipv4 rfc3927 169.254/16", ip: "169.254.1.2", expected: "unroutable"},
165 {name: "ipv6 rfc4193 fc00::/7", ip: "fc00::1234", expected: "unroutable"},
166 {name: "ipv6 rfc4843 2001:10::/28", ip: "2001:10::1234", expected: "unroutable"},
167 {name: "ipv6 rfc4862 fe80::/64", ip: "fe80::1234", expected: "unroutable"},
168 // IPv4 normal.
169 {name: "ipv4 normal class a", ip: "12.1.2.3", expected: "12.1.0.0"},
170 {name: "ipv4 normal class b", ip: "173.1.2.3", expected: "173.1.0.0"},
171 {name: "ipv4 normal class c", ip: "196.1.2.3", expected: "196.1.0.0"},
172 // IPv6/IPv4 translations.
173 {name: "ipv6 rfc3964 with ipv4 encap", ip: "2002:0c01:0203::", expected: "12.1.0.0"},
174 {name: "ipv6 rfc4380 toredo ipv4", ip: "2001:0:1234::f3fe:fdfc", expected: "12.1.0.0"},
175 {name: "ipv6 rfc6052 well-known prefix with ipv4", ip: "64:ff9b::0c01:0203", expected: "12.1.0.0"},
176 {name: "ipv6 rfc6145 translated ipv4", ip: "::ffff:0:0c01:0203", expected: "12.1.0.0"},
177 // Tor.
178 {name: "ipv6 tor onioncat", ip: "fd87:d87e:eb43:1234::5678", expected: "tor:2"},
179 {name: "ipv6 tor onioncat 2", ip: "fd87:d87e:eb43:1245::6789", expected: "tor:2"},
180 {name: "ipv6 tor onioncat 3", ip: "fd87:d87e:eb43:1345::6789", expected: "tor:3"},
181 // IPv6 normal.
182 {name: "ipv6 normal", ip: "2602:100::1", expected: "2602:100::"},
183 {name: "ipv6 normal 2", ip: "2602:0100::1234", expected: "2602:100::"},
184 {name: "ipv6 hurricane electric", ip: "2001:470:1f10:a1::2", expected: "2001:470:1000::"},
185 {name: "ipv6 hurricane electric 2", ip: "2001:0470:1f10:a1::2", expected: "2001:470:1000::"},
186 }
187 for i, test := range tests {
188 nip := net.ParseIP(test.ip)
189 na := *wire.NewNetAddressIPPort(nip, 11047, wire.SFNodeNetwork)
190 if key := addrmgr.GroupKey(&na); key != test.expected {
191 t.Errorf("TestGroupKey #%d (%s): unexpected group key "+
192 "- got '%s', want '%s'", i, test.name,
193 key, test.expected,
194 )
195 }
196 }
197 }
198