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
) {
63 memset(&a
, 0, sizeof(a
));
64 memset(&b
, 0, sizeof(b
));
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
.match(local
));
169 BOOST_CHECK(!nm
.match(remote
));
171 Netmask
nm6("fe80::92fb:a6ff:fe4a:51da/64");
172 BOOST_CHECK(nm6
.match("fe80::92fb:a6ff:fe4a:51db"));
173 BOOST_CHECK(!nm6
.match("fe81::92fb:a6ff:fe4a:51db"));
175 Netmask
nmp("130.161.252.29/32");
176 BOOST_CHECK(nmp
.match(remote
));
178 Netmask
nmp6("fe80::92fb:a6ff:fe4a:51da/128");
179 BOOST_CHECK(nmp6
.match("fe80::92fb:a6ff:fe4a:51da"));
180 BOOST_CHECK(!nmp6
.match("fe81::92fb:a6ff:fe4a:51db"));
182 Netmask
all("0.0.0.0/0");
183 BOOST_CHECK(all
.match(local
) && all
.match(remote
));
185 Netmask
all6("::/0");
186 BOOST_CHECK(all6
.match("::1") && all6
.match("fe80::92fb:a6ff:fe4a:51da"));
189 BOOST_AUTO_TEST_CASE(test_NetmaskGroup
) {
193 ng
.addMask("10.0.1.0");
194 BOOST_CHECK(ng
.match(ComboAddress("10.0.1.0")));
195 ng
.toMasks("127.0.0.0/8, 10.0.0.0/24");
196 BOOST_CHECK(ng
.match(ComboAddress("127.0.0.1")));
197 BOOST_CHECK(ng
.match(ComboAddress("10.0.0.3")));
198 BOOST_CHECK(ng
.match(ComboAddress("10.0.1.0")));
199 BOOST_CHECK(!ng
.match(ComboAddress("128.1.2.3")));
200 BOOST_CHECK(!ng
.match(ComboAddress("10.0.1.1")));
201 BOOST_CHECK(!ng
.match(ComboAddress("::1")));
203 BOOST_CHECK(ng
.match(ComboAddress("::1")));
204 BOOST_CHECK(!ng
.match(ComboAddress("::2")));
205 ng
.addMask("fe80::/16");
206 BOOST_CHECK(ng
.match(ComboAddress("fe80::1")));
207 BOOST_CHECK(!ng
.match(ComboAddress("fe81::1")));
208 BOOST_CHECK_EQUAL(ng
.toString(), "10.0.1.0/32, 127.0.0.0/8, 10.0.0.0/24, ::1/128, fe80::/16");
210 /* negative entries using the explicit flag */
211 ng
.addMask("172.16.0.0/16", true);
212 BOOST_CHECK(ng
.match(ComboAddress("172.16.1.1")));
213 BOOST_CHECK(ng
.match(ComboAddress("172.16.4.50")));
214 ng
.addMask("172.16.4.0/24", false);
215 BOOST_CHECK(ng
.match(ComboAddress("172.16.1.1")));
216 BOOST_CHECK(!ng
.match(ComboAddress("172.16.4.50")));
217 ng
.addMask("fe80::/24", false);
218 BOOST_CHECK(!ng
.match(ComboAddress("fe80::1")));
219 BOOST_CHECK(!ng
.match(ComboAddress("fe81::1")));
220 /* not in fe80::/24 but in fe80::/16, should match */
221 BOOST_CHECK(ng
.match(ComboAddress("fe80:0100::1")));
223 /* negative entries using '!' */
224 BOOST_CHECK(ng
.match(ComboAddress("172.16.10.80")));
225 ng
.addMask("!172.16.10.0/24");
226 BOOST_CHECK(!ng
.match(ComboAddress("172.16.10.80")));
227 ng
.addMask("2001:db8::/32");
228 ng
.addMask("!2001:db8::/64");
229 BOOST_CHECK(!ng
.match(ComboAddress("2001:db8::1")));
230 /* not in 2001:db8::/64 but in 2001:db8::/32, should match */
231 BOOST_CHECK(ng
.match(ComboAddress("2001:db8:1::1")));
233 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");
237 /* this time using Netmask objects instead of strings */
239 ng
.addMask(Netmask("10.0.1.0"));
240 BOOST_CHECK(ng
.match(ComboAddress("10.0.1.0")));
241 ng
.addMask(Netmask("127.0.0.0/8"));
242 ng
.addMask(Netmask("10.0.0.0/24"));
243 BOOST_CHECK(ng
.match(ComboAddress("127.0.0.1")));
244 BOOST_CHECK(ng
.match(ComboAddress("10.0.0.3")));
245 BOOST_CHECK(ng
.match(ComboAddress("10.0.1.0")));
246 BOOST_CHECK(!ng
.match(ComboAddress("128.1.2.3")));
247 BOOST_CHECK(!ng
.match(ComboAddress("10.0.1.1")));
248 BOOST_CHECK(!ng
.match(ComboAddress("::1")));
249 ng
.addMask(Netmask("::1"));
250 BOOST_CHECK(ng
.match(ComboAddress("::1")));
251 BOOST_CHECK(!ng
.match(ComboAddress("::2")));
252 ng
.addMask(Netmask("fe80::/16"));
253 BOOST_CHECK(ng
.match(ComboAddress("fe80::1")));
254 BOOST_CHECK(!ng
.match(ComboAddress("fe81::1")));
255 BOOST_CHECK_EQUAL(ng
.toString(), "10.0.1.0/32, 127.0.0.0/8, 10.0.0.0/24, ::1/128, fe80::/16");
257 /* negative entries using the explicit flag */
258 ng
.addMask(Netmask("172.16.0.0/16"), true);
259 BOOST_CHECK(ng
.match(ComboAddress("172.16.1.1")));
260 BOOST_CHECK(ng
.match(ComboAddress("172.16.4.50")));
261 ng
.addMask(Netmask("172.16.4.0/24"), false);
262 BOOST_CHECK(ng
.match(ComboAddress("172.16.1.1")));
263 BOOST_CHECK(!ng
.match(ComboAddress("172.16.4.50")));
264 ng
.addMask("fe80::/24", false);
265 BOOST_CHECK(!ng
.match(ComboAddress("fe80::1")));
266 BOOST_CHECK(!ng
.match(ComboAddress("fe81::1")));
267 /* not in fe80::/24 but in fe80::/16, should match */
268 BOOST_CHECK(ng
.match(ComboAddress("fe80:0100::1")));
270 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");
275 BOOST_AUTO_TEST_SUITE_END()