]> git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/test-iputils_hh.cc
rec: Don't account chained queries more than once
[thirdparty/pdns.git] / pdns / test-iputils_hh.cc
1 #define BOOST_TEST_DYN_LINK
2 #define BOOST_TEST_NO_MAIN
3 #ifdef HAVE_CONFIG_H
4 #include "config.h"
5 #endif
6 #include <boost/test/unit_test.hpp>
7 #include <bitset>
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));
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));
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);
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));
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
59 }
60
61 BOOST_AUTO_TEST_CASE(test_ComboAddressCompare) {
62 ComboAddress a, b;
63 a.reset();
64 b.reset();
65 BOOST_CHECK(!(a<b));
66 BOOST_CHECK(!(a>b));
67 }
68
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 }
154 }
155
156
157 BOOST_AUTO_TEST_CASE(test_Mapping)
158 {
159 ComboAddress lh("::1");
160 BOOST_CHECK_EQUAL(lh.toString(), "::1");
161 }
162
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");
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());
173
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());
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"));
193
194
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"));
202
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"));
207
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);
217
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);
222
223 /* An empty Netmask should be larger than
224 every others. */
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);
231 }
232
233 BOOST_AUTO_TEST_CASE(test_NetmaskGroup) {
234
235 {
236 NetmaskGroup ng;
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")));
246 ng.addMask("::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");
253
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")));
266
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")));
276
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");
278 }
279
280 {
281 /* this time using Netmask objects instead of strings */
282 NetmaskGroup ng;
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");
300
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")));
313
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");
315 }
316 }
317
318
319 BOOST_AUTO_TEST_SUITE_END()