]> git.ipfire.org Git - thirdparty/pdns.git/blame - pdns/test-iputils_hh.cc
Merge pull request #5461 from rgacogne/rec-cache-index
[thirdparty/pdns.git] / pdns / test-iputils_hh.cc
CommitLineData
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
10using namespace boost;
11
12BOOST_AUTO_TEST_SUITE(iputils_hh)
13
14BOOST_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 61BOOST_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 69BOOST_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 157BOOST_AUTO_TEST_CASE(test_Mapping)
158{
159 ComboAddress lh("::1");
160 BOOST_CHECK_EQUAL(lh.toString(), "::1");
22779196 161}
162
60af67b8 163BOOST_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
208BOOST_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 294BOOST_AUTO_TEST_SUITE_END()