]>
Commit | Line | Data |
---|---|---|
7156682c | 1 | #define BOOST_TEST_DYN_LINK |
2 | #define BOOST_TEST_NO_MAIN | |
870a0fe4 AT |
3 | #ifdef HAVE_CONFIG_H |
4 | #include "config.h" | |
5 | #endif | |
7156682c | 6 | #include <boost/test/unit_test.hpp> |
22779196 | 7 | #include <bitset> |
7156682c | 8 | #include "iputils.hh" |
9 | ||
10 | using namespace boost; | |
11 | ||
12 | BOOST_AUTO_TEST_SUITE(iputils_hh) | |
13 | ||
14 | BOOST_AUTO_TEST_CASE(test_ComboAddress) { | |
15 | ComboAddress local("127.0.0.1", 53); | |
16 | BOOST_CHECK(local==local); | |
17 | BOOST_CHECK_EQUAL(local.sin4.sin_family, AF_INET); | |
18 | BOOST_CHECK_EQUAL(local.sin4.sin_port, htons(53)); | |
19 | BOOST_CHECK_EQUAL(local.sin4.sin_addr.s_addr, htonl(0x7f000001UL)); | |
20 | ||
21 | ComboAddress remote("130.161.33.15", 53); | |
22 | BOOST_CHECK(!(local == remote)); | |
75e7e2a0 | 23 | BOOST_CHECK_EQUAL(remote.sin4.sin_port, htons(53)); |
24 | ||
25 | ComboAddress withport("213.244.168.210:53"); | |
26 | BOOST_CHECK_EQUAL(withport.sin4.sin_port, htons(53)); | |
27 | ||
28 | ComboAddress withportO("213.244.168.210:53", 5300); | |
29 | BOOST_CHECK_EQUAL(withportO.sin4.sin_port, htons(53)); | |
30 | ||
31 | withport = ComboAddress("[::]:53"); | |
32 | BOOST_CHECK_EQUAL(withport.sin4.sin_port, htons(53)); | |
33 | ||
34 | withport = ComboAddress("[::]:5300", 53); | |
35 | BOOST_CHECK_EQUAL(withport.sin4.sin_port, htons(5300)); | |
c9ff7d54 PL |
36 | |
37 | // Verify that 2 'empty' ComboAddresses are equal, used in syncres.hh to | |
38 | // signal auth-zones | |
39 | ComboAddress a = ComboAddress(); | |
40 | ComboAddress b = ComboAddress(); | |
41 | BOOST_CHECK(a == b); | |
bb6f86bd PL |
42 | |
43 | // Verify that 2 ComboAddresses are not the same | |
44 | ComboAddress c = ComboAddress("127.0.0.1:53"); | |
45 | ComboAddress d = ComboAddress("127.0.0.1:52"); | |
46 | ComboAddress e = ComboAddress("127.0.0.2:53"); | |
47 | ||
48 | BOOST_CHECK(a != c); | |
49 | BOOST_CHECK(c != d); | |
50 | BOOST_CHECK(c != e); | |
51 | BOOST_CHECK(d != e); | |
52 | BOOST_CHECK(!(a != b)); | |
5b4ed369 PL |
53 | |
54 | // Verify that we don't allow invalid port numbers | |
55 | BOOST_CHECK_THROW(ComboAddress("127.0.0.1:70000"), PDNSException); // Port no. too high | |
56 | BOOST_CHECK_THROW(ComboAddress("127.0.0.1:-6"), PDNSException); // Port no. too low | |
57 | BOOST_CHECK_THROW(ComboAddress("[::1]:70000"), PDNSException); // Port no. too high | |
58 | BOOST_CHECK_THROW(ComboAddress("[::1]:-6"), PDNSException); // Port no. too low | |
7156682c | 59 | } |
60 | ||
5f15ee47 | 61 | BOOST_AUTO_TEST_CASE(test_ComboAddressCompare) { |
62 | ComboAddress a, b; | |
63 | memset(&a, 0, sizeof(a)); | |
64 | memset(&b, 0, sizeof(b)); | |
65 | BOOST_CHECK(!(a<b)); | |
66 | BOOST_CHECK(!(a>b)); | |
67 | } | |
68 | ||
22779196 | 69 | BOOST_AUTO_TEST_CASE(test_ComboAddressTruncate) { |
70 | ComboAddress ca4("130.161.252.29"); | |
71 | ca4.truncate(24); | |
72 | BOOST_CHECK_EQUAL(ca4.toString(), "130.161.252.0"); | |
73 | ca4.truncate(16); | |
74 | BOOST_CHECK_EQUAL(ca4.toString(), "130.161.0.0"); | |
75 | ||
76 | ||
77 | ||
78 | ca4 = ComboAddress("130.161.252.29"); | |
79 | ComboAddress orig(ca4); | |
80 | for(int n=32; n; --n) { | |
81 | ca4.truncate(n); | |
82 | ||
83 | uint32_t p; | |
84 | memcpy(&p, (char*)&ca4.sin4.sin_addr.s_addr, 4); | |
85 | std::bitset<32> result(htonl(p)); | |
86 | ||
87 | memcpy(&p, (char*)&orig.sin4.sin_addr.s_addr, 4); | |
88 | std::bitset<32> manual(htonl(p)); | |
89 | ||
90 | auto tokill=32-n; | |
91 | for(int i =0; i< tokill; ++i) | |
92 | manual.set(i, 0); | |
93 | ||
94 | BOOST_CHECK_EQUAL(result, manual); | |
95 | } | |
96 | ||
97 | ca4 = ComboAddress("130.161.252.29"); | |
98 | ca4.truncate(31); | |
99 | BOOST_CHECK_EQUAL(ca4.toString(), "130.161.252.28"); | |
100 | ||
101 | ca4.truncate(30); | |
102 | BOOST_CHECK_EQUAL(ca4.toString(), "130.161.252.28"); | |
103 | ||
104 | ca4.truncate(29); | |
105 | BOOST_CHECK_EQUAL(ca4.toString(), "130.161.252.24"); | |
106 | ||
107 | ca4.truncate(23); | |
108 | BOOST_CHECK_EQUAL(ca4.toString(), "130.161.252.0"); | |
109 | ||
110 | ca4.truncate(22); | |
111 | BOOST_CHECK_EQUAL(ca4.toString(), "130.161.252.0"); | |
112 | ||
113 | ca4.truncate(21); | |
114 | BOOST_CHECK_EQUAL(ca4.toString(), "130.161.248.0"); | |
115 | ||
116 | ComboAddress ca6("2001:888:2000:1d::2"); | |
117 | ca6.truncate(120); | |
118 | BOOST_CHECK_EQUAL(ca6.toString(), "2001:888:2000:1d::"); | |
119 | ca6.truncate(64); | |
120 | BOOST_CHECK_EQUAL(ca6.toString(), "2001:888:2000:1d::"); | |
121 | ca6.truncate(72); // 0102 304 0506 78 | |
122 | BOOST_CHECK_EQUAL(ca6.toString(), "2001:888:2000:1d::"); | |
123 | ca6.truncate(56); | |
124 | BOOST_CHECK_EQUAL(ca6.toString(), "2001:888:2000::"); | |
125 | ca6.truncate(48); | |
126 | BOOST_CHECK_EQUAL(ca6.toString(), "2001:888:2000::"); | |
127 | ca6.truncate(32); | |
128 | BOOST_CHECK_EQUAL(ca6.toString(), "2001:888::"); | |
129 | ca6.truncate(16); | |
130 | BOOST_CHECK_EQUAL(ca6.toString(), "2001::"); | |
131 | ca6.truncate(8); | |
132 | BOOST_CHECK_EQUAL(ca6.toString(), "2000::"); | |
133 | ||
134 | ||
135 | orig=ca6=ComboAddress("2001:888:2000:1d::2"); | |
136 | for(int n=128; n; --n) { | |
137 | ca6.truncate(n); | |
138 | ||
139 | std::bitset<128> result, manual; | |
140 | for(int i=0; i < 16; ++i) { | |
141 | result<<=8; | |
142 | result|= std::bitset<128>(*((unsigned char*)&ca6.sin6.sin6_addr.s6_addr + i)); | |
143 | ||
144 | manual<<=8; | |
145 | manual|= std::bitset<128>(*((unsigned char*)&orig.sin6.sin6_addr.s6_addr + i)); | |
146 | } | |
147 | ||
148 | auto tokill=128-n; | |
149 | for(int i =0; i< tokill; ++i) | |
150 | manual.set(i, 0); | |
151 | ||
152 | BOOST_CHECK_EQUAL(result, manual); | |
153 | } | |
ca12836d | 154 | } |
155 | ||
22779196 | 156 | |
ca12836d | 157 | BOOST_AUTO_TEST_CASE(test_Mapping) |
158 | { | |
159 | ComboAddress lh("::1"); | |
160 | BOOST_CHECK_EQUAL(lh.toString(), "::1"); | |
22779196 | 161 | } |
162 | ||
60af67b8 | 163 | BOOST_AUTO_TEST_CASE(test_Netmask) { |
164 | ComboAddress local("127.0.0.1", 53); | |
165 | ComboAddress remote("130.161.252.29", 53); | |
166 | ||
167 | Netmask nm("127.0.0.1/24"); | |
7f3e6acd | 168 | BOOST_CHECK(nm.getBits() == 24); |
60af67b8 | 169 | BOOST_CHECK(nm.match(local)); |
170 | BOOST_CHECK(!nm.match(remote)); | |
7f3e6acd RG |
171 | BOOST_CHECK(nm.isIpv4()); |
172 | BOOST_CHECK(!nm.isIpv6()); | |
60af67b8 | 173 | |
174 | Netmask nm6("fe80::92fb:a6ff:fe4a:51da/64"); | |
7f3e6acd | 175 | BOOST_CHECK(nm6.getBits() == 64); |
60af67b8 | 176 | BOOST_CHECK(nm6.match("fe80::92fb:a6ff:fe4a:51db")); |
177 | BOOST_CHECK(!nm6.match("fe81::92fb:a6ff:fe4a:51db")); | |
7f3e6acd RG |
178 | BOOST_CHECK(!nm6.isIpv4()); |
179 | BOOST_CHECK(nm6.isIpv6()); | |
60af67b8 | 180 | |
181 | Netmask nmp("130.161.252.29/32"); | |
182 | BOOST_CHECK(nmp.match(remote)); | |
183 | ||
184 | Netmask nmp6("fe80::92fb:a6ff:fe4a:51da/128"); | |
185 | BOOST_CHECK(nmp6.match("fe80::92fb:a6ff:fe4a:51da")); | |
186 | BOOST_CHECK(!nmp6.match("fe81::92fb:a6ff:fe4a:51db")); | |
187 | ||
188 | Netmask all("0.0.0.0/0"); | |
189 | BOOST_CHECK(all.match(local) && all.match(remote)); | |
190 | ||
191 | Netmask all6("::/0"); | |
192 | BOOST_CHECK(all6.match("::1") && all6.match("fe80::92fb:a6ff:fe4a:51da")); | |
7f3e6acd RG |
193 | |
194 | Netmask fromCombo1(ComboAddress("192.0.2.1:53"), 32); | |
195 | Netmask fromCombo2(ComboAddress("192.0.2.1:54"), 32); | |
196 | BOOST_CHECK(fromCombo1 == fromCombo2); | |
197 | BOOST_CHECK(fromCombo1.match("192.0.2.1")); | |
198 | BOOST_CHECK(fromCombo1.match(ComboAddress("192.0.2.1:80"))); | |
199 | BOOST_CHECK(fromCombo1.getNetwork() == ComboAddress("192.0.2.1")); | |
200 | BOOST_CHECK(fromCombo1.getMaskedNetwork() == ComboAddress("192.0.2.1")); | |
201 | ||
202 | Netmask nm25("192.0.2.255/25"); | |
203 | BOOST_CHECK(nm25.getBits() == 25); | |
204 | BOOST_CHECK(nm25.getNetwork() == ComboAddress("192.0.2.255")); | |
205 | BOOST_CHECK(nm25.getMaskedNetwork() == ComboAddress("192.0.2.128")); | |
60af67b8 | 206 | } |
207 | ||
208 | BOOST_AUTO_TEST_CASE(test_NetmaskGroup) { | |
41a3f756 RG |
209 | |
210 | { | |
211 | NetmaskGroup ng; | |
212 | ng.addMask("10.0.1.0"); | |
213 | BOOST_CHECK(ng.match(ComboAddress("10.0.1.0"))); | |
214 | ng.toMasks("127.0.0.0/8, 10.0.0.0/24"); | |
215 | BOOST_CHECK(ng.match(ComboAddress("127.0.0.1"))); | |
216 | BOOST_CHECK(ng.match(ComboAddress("10.0.0.3"))); | |
217 | BOOST_CHECK(ng.match(ComboAddress("10.0.1.0"))); | |
218 | BOOST_CHECK(!ng.match(ComboAddress("128.1.2.3"))); | |
219 | BOOST_CHECK(!ng.match(ComboAddress("10.0.1.1"))); | |
220 | BOOST_CHECK(!ng.match(ComboAddress("::1"))); | |
221 | ng.addMask("::1"); | |
222 | BOOST_CHECK(ng.match(ComboAddress("::1"))); | |
223 | BOOST_CHECK(!ng.match(ComboAddress("::2"))); | |
224 | ng.addMask("fe80::/16"); | |
225 | BOOST_CHECK(ng.match(ComboAddress("fe80::1"))); | |
226 | BOOST_CHECK(!ng.match(ComboAddress("fe81::1"))); | |
227 | BOOST_CHECK_EQUAL(ng.toString(), "10.0.1.0/32, 127.0.0.0/8, 10.0.0.0/24, ::1/128, fe80::/16"); | |
228 | ||
229 | /* negative entries using the explicit flag */ | |
230 | ng.addMask("172.16.0.0/16", true); | |
231 | BOOST_CHECK(ng.match(ComboAddress("172.16.1.1"))); | |
232 | BOOST_CHECK(ng.match(ComboAddress("172.16.4.50"))); | |
233 | ng.addMask("172.16.4.0/24", false); | |
234 | BOOST_CHECK(ng.match(ComboAddress("172.16.1.1"))); | |
235 | BOOST_CHECK(!ng.match(ComboAddress("172.16.4.50"))); | |
236 | ng.addMask("fe80::/24", false); | |
237 | BOOST_CHECK(!ng.match(ComboAddress("fe80::1"))); | |
238 | BOOST_CHECK(!ng.match(ComboAddress("fe81::1"))); | |
239 | /* not in fe80::/24 but in fe80::/16, should match */ | |
240 | BOOST_CHECK(ng.match(ComboAddress("fe80:0100::1"))); | |
241 | ||
242 | /* negative entries using '!' */ | |
243 | BOOST_CHECK(ng.match(ComboAddress("172.16.10.80"))); | |
244 | ng.addMask("!172.16.10.0/24"); | |
245 | BOOST_CHECK(!ng.match(ComboAddress("172.16.10.80"))); | |
246 | ng.addMask("2001:db8::/32"); | |
247 | ng.addMask("!2001:db8::/64"); | |
248 | BOOST_CHECK(!ng.match(ComboAddress("2001:db8::1"))); | |
249 | /* not in 2001:db8::/64 but in 2001:db8::/32, should match */ | |
250 | BOOST_CHECK(ng.match(ComboAddress("2001:db8:1::1"))); | |
251 | ||
252 | BOOST_CHECK_EQUAL(ng.toString(), "10.0.1.0/32, 127.0.0.0/8, 10.0.0.0/24, ::1/128, fe80::/16, 172.16.0.0/16, !172.16.4.0/24, !fe80::/24, !172.16.10.0/24, 2001:db8::/32, !2001:db8::/64"); | |
253 | } | |
254 | ||
255 | { | |
256 | /* this time using Netmask objects instead of strings */ | |
257 | NetmaskGroup ng; | |
258 | ng.addMask(Netmask("10.0.1.0")); | |
259 | BOOST_CHECK(ng.match(ComboAddress("10.0.1.0"))); | |
260 | ng.addMask(Netmask("127.0.0.0/8")); | |
261 | ng.addMask(Netmask("10.0.0.0/24")); | |
262 | BOOST_CHECK(ng.match(ComboAddress("127.0.0.1"))); | |
263 | BOOST_CHECK(ng.match(ComboAddress("10.0.0.3"))); | |
264 | BOOST_CHECK(ng.match(ComboAddress("10.0.1.0"))); | |
265 | BOOST_CHECK(!ng.match(ComboAddress("128.1.2.3"))); | |
266 | BOOST_CHECK(!ng.match(ComboAddress("10.0.1.1"))); | |
267 | BOOST_CHECK(!ng.match(ComboAddress("::1"))); | |
268 | ng.addMask(Netmask("::1")); | |
269 | BOOST_CHECK(ng.match(ComboAddress("::1"))); | |
270 | BOOST_CHECK(!ng.match(ComboAddress("::2"))); | |
271 | ng.addMask(Netmask("fe80::/16")); | |
272 | BOOST_CHECK(ng.match(ComboAddress("fe80::1"))); | |
273 | BOOST_CHECK(!ng.match(ComboAddress("fe81::1"))); | |
274 | BOOST_CHECK_EQUAL(ng.toString(), "10.0.1.0/32, 127.0.0.0/8, 10.0.0.0/24, ::1/128, fe80::/16"); | |
275 | ||
276 | /* negative entries using the explicit flag */ | |
277 | ng.addMask(Netmask("172.16.0.0/16"), true); | |
278 | BOOST_CHECK(ng.match(ComboAddress("172.16.1.1"))); | |
279 | BOOST_CHECK(ng.match(ComboAddress("172.16.4.50"))); | |
280 | ng.addMask(Netmask("172.16.4.0/24"), false); | |
281 | BOOST_CHECK(ng.match(ComboAddress("172.16.1.1"))); | |
282 | BOOST_CHECK(!ng.match(ComboAddress("172.16.4.50"))); | |
283 | ng.addMask("fe80::/24", false); | |
284 | BOOST_CHECK(!ng.match(ComboAddress("fe80::1"))); | |
285 | BOOST_CHECK(!ng.match(ComboAddress("fe81::1"))); | |
286 | /* not in fe80::/24 but in fe80::/16, should match */ | |
287 | BOOST_CHECK(ng.match(ComboAddress("fe80:0100::1"))); | |
288 | ||
289 | BOOST_CHECK_EQUAL(ng.toString(), "10.0.1.0/32, 127.0.0.0/8, 10.0.0.0/24, ::1/128, fe80::/16, 172.16.0.0/16, !172.16.4.0/24, !fe80::/24"); | |
290 | } | |
60af67b8 | 291 | } |
292 | ||
293 | ||
7156682c | 294 | BOOST_AUTO_TEST_SUITE_END() |