]> git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/test-iputils_hh.cc
Merge pull request #4958 from paddg/patch-5
[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 memset(&a, 0, sizeof(a));
64 memset(&b, 0, sizeof(b));
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.match(local));
169 BOOST_CHECK(!nm.match(remote));
170
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"));
174
175 Netmask nmp("130.161.252.29/32");
176 BOOST_CHECK(nmp.match(remote));
177
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"));
181
182 Netmask all("0.0.0.0/0");
183 BOOST_CHECK(all.match(local) && all.match(remote));
184
185 Netmask all6("::/0");
186 BOOST_CHECK(all6.match("::1") && all6.match("fe80::92fb:a6ff:fe4a:51da"));
187 }
188
189 BOOST_AUTO_TEST_CASE(test_NetmaskGroup) {
190
191 {
192 NetmaskGroup ng;
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")));
202 ng.addMask("::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");
209
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")));
222
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")));
232
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");
234 }
235
236 {
237 /* this time using Netmask objects instead of strings */
238 NetmaskGroup ng;
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");
256
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")));
269
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");
271 }
272 }
273
274
275 BOOST_AUTO_TEST_SUITE_END()