1 #define BOOST_TEST_DYN_LINK
2 #define BOOST_TEST_NO_MAIN
6 #include <boost/test/unit_test.hpp>
10 using namespace boost
;
12 BOOST_AUTO_TEST_SUITE(iputils_hh
)
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
));
21 ComboAddress
remote("130.161.33.15", 53);
22 BOOST_CHECK(!(local
== remote
));
23 BOOST_CHECK_EQUAL(remote
.sin4
.sin_port
, htons(53));
25 ComboAddress
withport("213.244.168.210:53");
26 BOOST_CHECK_EQUAL(withport
.sin4
.sin_port
, htons(53));
28 ComboAddress
withportO("213.244.168.210:53", 5300);
29 BOOST_CHECK_EQUAL(withportO
.sin4
.sin_port
, htons(53));
31 withport
= ComboAddress("[::]:53");
32 BOOST_CHECK_EQUAL(withport
.sin4
.sin_port
, htons(53));
34 withport
= ComboAddress("[::]:5300", 53);
35 BOOST_CHECK_EQUAL(withport
.sin4
.sin_port
, htons(5300));
37 // Verify that 2 'empty' ComboAddresses are equal, used in syncres.hh to
39 ComboAddress a
= ComboAddress();
40 ComboAddress b
= ComboAddress();
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");
52 BOOST_CHECK(!(a
!= b
));
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
61 BOOST_AUTO_TEST_CASE(test_ComboAddressCompare
) {
69 BOOST_AUTO_TEST_CASE(test_ComboAddressTruncate
) {
70 ComboAddress
ca4("130.161.252.29");
72 BOOST_CHECK_EQUAL(ca4
.toString(), "130.161.252.0");
74 BOOST_CHECK_EQUAL(ca4
.toString(), "130.161.0.0");
78 ca4
= ComboAddress("130.161.252.29");
79 ComboAddress
orig(ca4
);
80 for(int n
=32; n
; --n
) {
84 memcpy(&p
, (char*)&ca4
.sin4
.sin_addr
.s_addr
, 4);
85 std::bitset
<32> result(htonl(p
));
87 memcpy(&p
, (char*)&orig
.sin4
.sin_addr
.s_addr
, 4);
88 std::bitset
<32> manual(htonl(p
));
91 for(int i
=0; i
< tokill
; ++i
)
94 BOOST_CHECK_EQUAL(result
, manual
);
97 ca4
= ComboAddress("130.161.252.29");
99 BOOST_CHECK_EQUAL(ca4
.toString(), "130.161.252.28");
102 BOOST_CHECK_EQUAL(ca4
.toString(), "130.161.252.28");
105 BOOST_CHECK_EQUAL(ca4
.toString(), "130.161.252.24");
108 BOOST_CHECK_EQUAL(ca4
.toString(), "130.161.252.0");
111 BOOST_CHECK_EQUAL(ca4
.toString(), "130.161.252.0");
114 BOOST_CHECK_EQUAL(ca4
.toString(), "130.161.248.0");
116 ComboAddress
ca6("2001:888:2000:1d::2");
118 BOOST_CHECK_EQUAL(ca6
.toString(), "2001:888:2000:1d::");
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::");
124 BOOST_CHECK_EQUAL(ca6
.toString(), "2001:888:2000::");
126 BOOST_CHECK_EQUAL(ca6
.toString(), "2001:888:2000::");
128 BOOST_CHECK_EQUAL(ca6
.toString(), "2001:888::");
130 BOOST_CHECK_EQUAL(ca6
.toString(), "2001::");
132 BOOST_CHECK_EQUAL(ca6
.toString(), "2000::");
135 orig
=ca6
=ComboAddress("2001:888:2000:1d::2");
136 for(int n
=128; n
; --n
) {
139 std::bitset
<128> result
, manual
;
140 for(int i
=0; i
< 16; ++i
) {
142 result
|= std::bitset
<128>(*((unsigned char*)&ca6
.sin6
.sin6_addr
.s6_addr
+ i
));
145 manual
|= std::bitset
<128>(*((unsigned char*)&orig
.sin6
.sin6_addr
.s6_addr
+ i
));
149 for(int i
=0; i
< tokill
; ++i
)
152 BOOST_CHECK_EQUAL(result
, manual
);
157 BOOST_AUTO_TEST_CASE(test_Mapping
)
159 ComboAddress
lh("::1");
160 BOOST_CHECK_EQUAL(lh
.toString(), "::1");
163 BOOST_AUTO_TEST_CASE(test_Netmask
) {
164 ComboAddress
local("127.0.0.1", 53);
165 ComboAddress
remote("130.161.252.29", 53);
167 Netmask
nm("127.0.0.1/24");
168 BOOST_CHECK(nm
.getBits() == 24);
169 BOOST_CHECK(nm
.match(local
));
170 BOOST_CHECK(!nm
.match(remote
));
171 BOOST_CHECK(nm
.isIpv4());
172 BOOST_CHECK(!nm
.isIpv6());
174 Netmask
nm6("fe80::92fb:a6ff:fe4a:51da/64");
175 BOOST_CHECK(nm6
.getBits() == 64);
176 BOOST_CHECK(nm6
.match("fe80::92fb:a6ff:fe4a:51db"));
177 BOOST_CHECK(!nm6
.match("fe81::92fb:a6ff:fe4a:51db"));
178 BOOST_CHECK(!nm6
.isIpv4());
179 BOOST_CHECK(nm6
.isIpv6());
181 Netmask
nmp("130.161.252.29/32");
182 BOOST_CHECK(nmp
.match(remote
));
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"));
188 Netmask
all("0.0.0.0/0");
189 BOOST_CHECK(all
.match(local
) && all
.match(remote
));
191 Netmask
all6("::/0");
192 BOOST_CHECK(all6
.match("::1") && all6
.match("fe80::92fb:a6ff:fe4a:51da"));
195 Netmask
fromCombo1(ComboAddress("192.0.2.1:53"), 32);
196 Netmask
fromCombo2(ComboAddress("192.0.2.1:54"), 32);
197 BOOST_CHECK(fromCombo1
== fromCombo2
);
198 BOOST_CHECK(fromCombo1
.match("192.0.2.1"));
199 BOOST_CHECK(fromCombo1
.match(ComboAddress("192.0.2.1:80")));
200 BOOST_CHECK(fromCombo1
.getNetwork() == ComboAddress("192.0.2.1"));
201 BOOST_CHECK(fromCombo1
.getMaskedNetwork() == ComboAddress("192.0.2.1"));
203 Netmask
nm25("192.0.2.255/25");
204 BOOST_CHECK(nm25
.getBits() == 25);
205 BOOST_CHECK(nm25
.getNetwork() == ComboAddress("192.0.2.255"));
206 BOOST_CHECK(nm25
.getMaskedNetwork() == ComboAddress("192.0.2.128"));
208 /* Make sure that more specific Netmasks are lesser than less specific ones,
209 as this is very useful when matching. */
210 Netmask
specific32("192.0.0.0/32");
211 Netmask
specific24("192.0.0.0/24");
212 Netmask
specific16("192.0.0.0/16");
213 BOOST_CHECK(specific32
< specific24
);
214 BOOST_CHECK(specific24
> specific32
);
215 BOOST_CHECK(specific24
< specific16
);
216 BOOST_CHECK(specific16
> specific24
);
218 Netmask
sameMask1("192.0.0.0/16");
219 Netmask
sameMask2("192.0.0.1/16");
220 BOOST_CHECK(sameMask1
< sameMask2
);
221 BOOST_CHECK(sameMask2
> sameMask1
);
223 /* An empty Netmask should be larger than
225 Netmask empty
= Netmask();
226 Netmask
full("255.255.255.255/32");
227 BOOST_CHECK(empty
> all
);
228 BOOST_CHECK(all
< empty
);
229 BOOST_CHECK(empty
> full
);
230 BOOST_CHECK(full
< empty
);
233 BOOST_AUTO_TEST_CASE(test_NetmaskGroup
) {
237 ng
.addMask("10.0.1.0");
238 BOOST_CHECK(ng
.match(ComboAddress("10.0.1.0")));
239 ng
.toMasks("127.0.0.0/8, 10.0.0.0/24");
240 BOOST_CHECK(ng
.match(ComboAddress("127.0.0.1")));
241 BOOST_CHECK(ng
.match(ComboAddress("10.0.0.3")));
242 BOOST_CHECK(ng
.match(ComboAddress("10.0.1.0")));
243 BOOST_CHECK(!ng
.match(ComboAddress("128.1.2.3")));
244 BOOST_CHECK(!ng
.match(ComboAddress("10.0.1.1")));
245 BOOST_CHECK(!ng
.match(ComboAddress("::1")));
247 BOOST_CHECK(ng
.match(ComboAddress("::1")));
248 BOOST_CHECK(!ng
.match(ComboAddress("::2")));
249 ng
.addMask("fe80::/16");
250 BOOST_CHECK(ng
.match(ComboAddress("fe80::1")));
251 BOOST_CHECK(!ng
.match(ComboAddress("fe81::1")));
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");
254 /* negative entries using the explicit flag */
255 ng
.addMask("172.16.0.0/16", true);
256 BOOST_CHECK(ng
.match(ComboAddress("172.16.1.1")));
257 BOOST_CHECK(ng
.match(ComboAddress("172.16.4.50")));
258 ng
.addMask("172.16.4.0/24", false);
259 BOOST_CHECK(ng
.match(ComboAddress("172.16.1.1")));
260 BOOST_CHECK(!ng
.match(ComboAddress("172.16.4.50")));
261 ng
.addMask("fe80::/24", false);
262 BOOST_CHECK(!ng
.match(ComboAddress("fe80::1")));
263 BOOST_CHECK(!ng
.match(ComboAddress("fe81::1")));
264 /* not in fe80::/24 but in fe80::/16, should match */
265 BOOST_CHECK(ng
.match(ComboAddress("fe80:0100::1")));
267 /* negative entries using '!' */
268 BOOST_CHECK(ng
.match(ComboAddress("172.16.10.80")));
269 ng
.addMask("!172.16.10.0/24");
270 BOOST_CHECK(!ng
.match(ComboAddress("172.16.10.80")));
271 ng
.addMask("2001:db8::/32");
272 ng
.addMask("!2001:db8::/64");
273 BOOST_CHECK(!ng
.match(ComboAddress("2001:db8::1")));
274 /* not in 2001:db8::/64 but in 2001:db8::/32, should match */
275 BOOST_CHECK(ng
.match(ComboAddress("2001:db8:1::1")));
277 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");
281 /* this time using Netmask objects instead of strings */
283 ng
.addMask(Netmask("10.0.1.0"));
284 BOOST_CHECK(ng
.match(ComboAddress("10.0.1.0")));
285 ng
.addMask(Netmask("127.0.0.0/8"));
286 ng
.addMask(Netmask("10.0.0.0/24"));
287 BOOST_CHECK(ng
.match(ComboAddress("127.0.0.1")));
288 BOOST_CHECK(ng
.match(ComboAddress("10.0.0.3")));
289 BOOST_CHECK(ng
.match(ComboAddress("10.0.1.0")));
290 BOOST_CHECK(!ng
.match(ComboAddress("128.1.2.3")));
291 BOOST_CHECK(!ng
.match(ComboAddress("10.0.1.1")));
292 BOOST_CHECK(!ng
.match(ComboAddress("::1")));
293 ng
.addMask(Netmask("::1"));
294 BOOST_CHECK(ng
.match(ComboAddress("::1")));
295 BOOST_CHECK(!ng
.match(ComboAddress("::2")));
296 ng
.addMask(Netmask("fe80::/16"));
297 BOOST_CHECK(ng
.match(ComboAddress("fe80::1")));
298 BOOST_CHECK(!ng
.match(ComboAddress("fe81::1")));
299 BOOST_CHECK_EQUAL(ng
.toString(), "10.0.1.0/32, 127.0.0.0/8, 10.0.0.0/24, ::1/128, fe80::/16");
301 /* negative entries using the explicit flag */
302 ng
.addMask(Netmask("172.16.0.0/16"), true);
303 BOOST_CHECK(ng
.match(ComboAddress("172.16.1.1")));
304 BOOST_CHECK(ng
.match(ComboAddress("172.16.4.50")));
305 ng
.addMask(Netmask("172.16.4.0/24"), false);
306 BOOST_CHECK(ng
.match(ComboAddress("172.16.1.1")));
307 BOOST_CHECK(!ng
.match(ComboAddress("172.16.4.50")));
308 ng
.addMask("fe80::/24", false);
309 BOOST_CHECK(!ng
.match(ComboAddress("fe80::1")));
310 BOOST_CHECK(!ng
.match(ComboAddress("fe81::1")));
311 /* not in fe80::/24 but in fe80::/16, should match */
312 BOOST_CHECK(ng
.match(ComboAddress("fe80:0100::1")));
314 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");
319 BOOST_AUTO_TEST_SUITE_END()