]> git.ipfire.org Git - thirdparty/pdns.git/blame - pdns/test-misc_hh.cc
Merge pull request #14021 from Habbie/auth-lua-join-whitespace
[thirdparty/pdns.git] / pdns / test-misc_hh.cc
CommitLineData
1c2d079d 1#ifndef BOOST_TEST_DYN_LINK
9bacbe09 2#define BOOST_TEST_DYN_LINK
1c2d079d
FM
3#endif
4
9bacbe09
PD
5#define BOOST_TEST_NO_MAIN
6
870a0fe4
AT
7#ifdef HAVE_CONFIG_H
8#include "config.h"
9#endif
9bacbe09 10#include <boost/test/unit_test.hpp>
8fb5b29a 11#include <boost/assign/list_of.hpp>
fa8fd4d2 12
8fb5b29a 13#include <boost/tuple/tuple.hpp>
ef3ee606 14
c6e47b32 15#include <arpa/inet.h>
ef3ee606
RG
16
17#include "dns.hh"
18#include "iputils.hh"
19#include "misc.hh"
20#include "utility.hh"
9bacbe09
PD
21
22using std::string;
23
c7f29d3e 24BOOST_AUTO_TEST_SUITE(test_misc_hh)
9bacbe09
PD
25typedef pair<std::string, uint16_t> typedns_t;
26
27BOOST_AUTO_TEST_CASE(test_CIStringCompare) {
232f0877
CH
28 set<std::string, CIStringCompare> nsset;
29 nsset.insert("abc");
30 nsset.insert("ns.example.com");
31 nsset.insert("");
32 nsset.insert("def");
33 nsset.insert("aBc");
34 nsset.insert("ns.example.com");
690b86b7 35 BOOST_CHECK_EQUAL(nsset.size(), 4U);
9bacbe09 36
232f0877
CH
37 ostringstream s;
38 for(set<std::string, CIStringCompare>::const_iterator i=nsset.begin();i!=nsset.end();++i) {
39 s<<"("<<*i<<")";
40 }
41 BOOST_CHECK_EQUAL(s.str(), "()(abc)(def)(ns.example.com)");
9bacbe09
PD
42}
43
44BOOST_AUTO_TEST_CASE(test_CIStringPairCompare) {
232f0877 45 set<typedns_t, CIStringPairCompare> nsset2;
e32a8d46
RP
46 nsset2.emplace("ns.example.com", 1);
47 nsset2.emplace("abc", 1);
48 nsset2.emplace("", 1);
49 nsset2.emplace("def", 1);
50 nsset2.emplace("abc", 2);
51 nsset2.emplace("abc", 1);
52 nsset2.emplace("ns.example.com", 0);
53 nsset2.emplace("abc", 2);
54 nsset2.emplace("ABC", 2);
690b86b7 55 BOOST_CHECK_EQUAL(nsset2.size(), 6U);
9bacbe09 56
232f0877
CH
57 ostringstream s;
58 for(set<typedns_t, CIStringPairCompare>::const_iterator i=nsset2.begin();i!=nsset2.end();++i) {
59 s<<"("<<i->first<<"|"<<i->second<<")";
60 }
61 BOOST_CHECK_EQUAL(s.str(), "(|1)(abc|1)(abc|2)(def|1)(ns.example.com|0)(ns.example.com|1)");
9bacbe09
PD
62}
63
8fb5b29a
KM
64BOOST_AUTO_TEST_CASE(test_pdns_ilexicographical_compare) {
65 typedef boost::tuple<const std::string, const std::string, bool> case_t;
66 typedef std::list<case_t> cases_t;
67
68 cases_t cases = boost::assign::list_of
69 (case_t(std::string(""), std::string(""), false))
70 (case_t(std::string(""), std::string("abc"), true))
71 (case_t(std::string("abc"), std::string(""), false))
72 (case_t(std::string("abc"), std::string("abcd"), true))
73 (case_t(std::string("abcd"), std::string("abc"), false))
74 (case_t(std::string("abd"), std::string("abc"), false))
75 (case_t(std::string("abc"), std::string("abd"), true))
76 (case_t(std::string("abc"), std::string("Abc"), false))
77 (case_t(std::string("Abc"), std::string("abc"), false))
78 ;
79
ef7cd021 80 for(const case_t& val : cases) {
8fb5b29a
KM
81 bool res;
82 res = pdns_ilexicographical_compare(val.get<0>(), val.get<1>());
83 BOOST_CHECK_EQUAL(res, val.get<2>());
84 }
85}
86
87BOOST_AUTO_TEST_CASE(test_pdns_iequals) {
88 typedef boost::tuple<const std::string, const std::string, bool> case_t;
89 typedef std::list<case_t> cases_t;
90
91 cases_t cases = boost::assign::list_of
92 (case_t(std::string(""), std::string(""), true))
93 (case_t(std::string(""), std::string("abc"), false))
94 (case_t(std::string("abc"), std::string(""), false))
95 (case_t(std::string("abc"), std::string("abcd"), false))
96 (case_t(std::string("abcd"), std::string("abc"), false))
97 (case_t(std::string("abd"), std::string("abc"), false))
98 (case_t(std::string("abc"), std::string("abd"), false))
99 (case_t(std::string("abc"), std::string("Abc"), true))
100 (case_t(std::string("Abc"), std::string("abc"), true))
101 ;
102
ef7cd021 103 for(const case_t& val : cases) {
8fb5b29a
KM
104 bool res;
105 res = pdns_iequals(val.get<0>(), val.get<1>());
106 BOOST_CHECK_EQUAL(res, val.get<2>());
107 }
108}
109
76cd6661 110BOOST_AUTO_TEST_CASE(test_stripDot) {
8fb5b29a
KM
111 BOOST_CHECK_EQUAL(stripDot("."), "");
112 BOOST_CHECK_EQUAL(stripDot(""), "");
113 BOOST_CHECK_EQUAL(stripDot("www.powerdns.com."), "www.powerdns.com");
114 BOOST_CHECK_EQUAL(stripDot("www.powerdns.com"), "www.powerdns.com");
76cd6661 115}
116
117BOOST_AUTO_TEST_CASE(test_labelReverse) {
7a59dc5a 118 BOOST_CHECK_EQUAL(DNSName("www.powerdns.com").labelReverse().toString(" ", false), "com powerdns www");
76cd6661 119}
120
76cd6661 121
1df6d212 122BOOST_AUTO_TEST_CASE(test_AtomicCounter) {
c3064e57 123 AtomicCounter ac(0);
76cd6661 124 ++ac;
125 ++ac;
690b86b7 126 BOOST_CHECK_EQUAL(ac, 2U);
76cd6661 127}
128
6e427101 129BOOST_AUTO_TEST_CASE(test_endianness) {
130 uint32_t i = 1;
131#if BYTE_ORDER == BIG_ENDIAN
132 BOOST_CHECK_EQUAL(i, htonl(i));
a34963a7 133#elif BYTE_ORDER == LITTLE_ENDIAN
6e427101 134 uint32_t j=0x01000000;
135 BOOST_CHECK_EQUAL(i, ntohl(j));
136#else
137 BOOST_FAIL("Did not detect endianness at all");
138#endif
139}
76cd6661 140
83e5035d 141BOOST_AUTO_TEST_CASE(test_ternary) {
142 int maxqps=1024;
143 BOOST_CHECK_EQUAL(defTer(maxqps, 16384), maxqps);
144 BOOST_CHECK_EQUAL(defTer(0, 16384), 16384);
145
146 int* qps=0;
147 BOOST_CHECK_EQUAL(*defTer(qps, &maxqps), 1024);
148}
149
ac84f00c
AT
150BOOST_AUTO_TEST_CASE(test_SimpleMatch) {
151 BOOST_CHECK_EQUAL(SimpleMatch("").match(std::string("")), true);
152 BOOST_CHECK_EQUAL(SimpleMatch("?").match(std::string("")), false);
153 BOOST_CHECK_EQUAL(SimpleMatch("*").match(std::string("")), true);
154
155 BOOST_CHECK_EQUAL(SimpleMatch("abc").match(std::string("abc")), true);
156 BOOST_CHECK_EQUAL(SimpleMatch("abc").match(std::string("ab")), false);
157 BOOST_CHECK_EQUAL(SimpleMatch("abc").match(std::string("bc")), false);
158
159 BOOST_CHECK_EQUAL(SimpleMatch("?").match(std::string("a")), true);
160 BOOST_CHECK_EQUAL(SimpleMatch("a?c").match(std::string("abc")), true);
161 BOOST_CHECK_EQUAL(SimpleMatch("a?c").match(std::string("ab")), false);
162 BOOST_CHECK_EQUAL(SimpleMatch("a?c").match(std::string("bc")), false);
163
164 BOOST_CHECK_EQUAL(SimpleMatch("*").match(std::string("*")), true);
165 BOOST_CHECK_EQUAL(SimpleMatch("a*c").match(std::string("abc")), true);
166 BOOST_CHECK_EQUAL(SimpleMatch("a*c").match(std::string("ab")), false);
167 BOOST_CHECK_EQUAL(SimpleMatch("a*c").match(std::string("bc")), false);
168
169 BOOST_CHECK_EQUAL(SimpleMatch("*").match(std::string("abcdefghj")), true);
170 BOOST_CHECK_EQUAL(SimpleMatch("*a").match(std::string("abca")), true);
171 BOOST_CHECK_EQUAL(SimpleMatch("*a").match(std::string("abcb")), false);
172 BOOST_CHECK_EQUAL(SimpleMatch("abc*").match(std::string("abcabcabcabacabac")), true);
173 BOOST_CHECK_EQUAL(SimpleMatch("abc*").match(std::string("abc")), true);
174}
175
9a363102
OM
176template<typename T> bool rfc1982check(T x, T y) {
177 return rfc1982LessThan(x, y);
178}
179
180BOOST_AUTO_TEST_CASE(test_rfc1982LessThan) {
181 // The test cases from rfc1982 section 5.2
182 BOOST_CHECK(rfc1982check<uint8_t>(0, 1));
183 BOOST_CHECK(rfc1982check<uint8_t>(0, 44));
184 BOOST_CHECK(rfc1982check<uint8_t>(0, 100));
185 BOOST_CHECK(rfc1982check<uint8_t>(44, 100));
186 BOOST_CHECK(rfc1982check<uint8_t>(100, 200));
187 BOOST_CHECK(rfc1982check<uint8_t>(200, 255));
188 BOOST_CHECK(rfc1982check<uint8_t>(255, 0));
189 BOOST_CHECK(rfc1982check<uint8_t>(255, 100));
190 BOOST_CHECK(rfc1982check<uint8_t>(200, 0));
191 BOOST_CHECK(rfc1982check<uint8_t>(200, 44));
192
193 BOOST_CHECK(rfc1982check<uint32_t>(0, 1));
194 BOOST_CHECK(rfc1982check<uint32_t>(UINT32_MAX-10, 1));
195 BOOST_CHECK(rfc1982check<uint32_t>(UINT32_MAX/2, UINT32_MAX-10));
196
197 BOOST_CHECK(rfc1982check<uint64_t>(0, 1));
198 BOOST_CHECK(rfc1982check<uint64_t>(UINT64_MAX-10, 1));
199 BOOST_CHECK(rfc1982check<uint64_t>(UINT64_MAX/2, UINT64_MAX-10));
200}
201
ef3ee606
RG
202BOOST_AUTO_TEST_CASE(test_reverse_name_to_ip)
203{
204 static const ComboAddress v4("192.0.2.1");
205 static const ComboAddress v6("2001:DB8::42");
206 BOOST_CHECK_EQUAL(reverseNameFromIP(v4).toString(), "1.2.0.192.in-addr.arpa.");
207 BOOST_CHECK_EQUAL(reverseNameFromIP(v6).toString(), "2.4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.");
208}
9bacbe09 209
f19c0ed4
AT
210BOOST_AUTO_TEST_CASE(test_getCarbonHostName)
211{
212 char buffer[4096];
213
214 BOOST_CHECK_EQUAL(gethostname(buffer, sizeof buffer), 0);
215 std::string my_hostname(buffer);
216 boost::replace_all(my_hostname, ".", "_");
217
218 std::string hostname = getCarbonHostName();
219 // ensure it matches what we get
220 BOOST_CHECK_EQUAL(my_hostname, hostname);
221 BOOST_CHECK_EQUAL(my_hostname.size(), hostname.size());
222}
223
4d71d796
PL
224BOOST_AUTO_TEST_CASE(test_parseRFC1035CharString)
225{
226 string in;
227 string out;
228 string expected;
229 size_t amount;
230
231 in = "foobar123";
232 amount = parseRFC1035CharString(in, out);
233 BOOST_CHECK_EQUAL(amount, in.size());
234 BOOST_CHECK_EQUAL(out, "foobar123");
235
236 in = "foobar123\\,bazquux456";
237 amount = parseRFC1035CharString(in, out);
238 BOOST_CHECK_EQUAL(amount, in.size());
239 BOOST_CHECK_EQUAL(out, "foobar123,bazquux456");
240
241 in = string("\"")+string(16262, 'A')+string("\"");
242 expected = string(16262, 'A');
243 amount = parseRFC1035CharString(in, out);
244 BOOST_CHECK_EQUAL(amount, in.size());
245 BOOST_CHECK_EQUAL(out, expected);
246
247 in = "hello\\044world\\002";
248 expected = "hello,world\x02";
249 amount = parseRFC1035CharString(in, out);
250 BOOST_CHECK_EQUAL(amount, in.size());
251 BOOST_CHECK_EQUAL(out, expected);
252
253 in = "\"hello\\044world\"";
254 expected = "hello,world";
255 amount = parseRFC1035CharString(in, out);
256 BOOST_CHECK_EQUAL(amount, in.size());
257 BOOST_CHECK_EQUAL(out, expected);
258
259 // Here we'll only read until the space
260 in = "hello world";
261 expected = "hello";
262 amount = parseRFC1035CharString(in, out);
17f6cb35 263 BOOST_CHECK_EQUAL(amount, 5U);
4d71d796
PL
264 BOOST_CHECK_EQUAL(out, expected);
265
266 // \032 is a space, but it is read because it is escaped
267 in = "hello\\032world";
268 expected = "hello world";
269 amount = parseRFC1035CharString(in, out);
270 BOOST_CHECK_EQUAL(amount, in.size());
271 BOOST_CHECK_EQUAL(out, expected);
272
273 in = "\"hello\\032world\"";
274 expected = "hello world";
275 amount = parseRFC1035CharString(in, out);
276 BOOST_CHECK_EQUAL(amount, in.size());
277 BOOST_CHECK_EQUAL(out, expected);
278
279 in = "\"hello\\032world XXXX\"";
280 expected = "hello world XXXX";
281 amount = parseRFC1035CharString(in, out);
282 BOOST_CHECK_EQUAL(amount, in.size());
283 BOOST_CHECK_EQUAL(out, expected);
e701f9d4
PL
284
285 // From draft-ietf-dnsop-svcb-https-03
286 expected = R"FOO(part1,part2,part3\,part4\\)FOO";
287 in = R"FOO("part1,part2,part3\\,part4\\\\)FOO";
288 amount = parseRFC1035CharString(in, out);
289 BOOST_CHECK_EQUAL(amount, in.size());
290 BOOST_CHECK_EQUAL(out, expected);
291
292 in = R"FOO(part1\,\p\a\r\t2\044part3\092,part4\092\\)FOO";
293 amount = parseRFC1035CharString(in, out);
294 BOOST_CHECK_EQUAL(amount, in.size());
295 BOOST_CHECK_EQUAL(out, expected);
4d71d796
PL
296}
297
78788348
PL
298BOOST_AUTO_TEST_CASE(test_parseSVCBValueList)
299{
300 vector<string> out;
301
e701f9d4
PL
302 // From draft-ietf-dnsop-svcb-https-03
303 vector<string> expected = {"part1", "part2", "part3,part4\\"};
304 parseSVCBValueList(R"FOO("part1,part2,part3\\,part4\\\\)FOO", out);
305 BOOST_CHECK_EQUAL(out.size(), expected.size());
306 BOOST_CHECK_EQUAL(out[0], expected[0]);
307 BOOST_CHECK_EQUAL(out[1], expected[1]);
308 BOOST_CHECK_EQUAL(out[2], expected[2]);
309
310 parseSVCBValueList(R"FOO(part1\,\p\a\r\t2\044part3\092,part4\092\\)FOO", out);
311 BOOST_CHECK_EQUAL(out.size(), expected.size());
312 BOOST_CHECK_EQUAL(out[0], expected[0]);
313 BOOST_CHECK_EQUAL(out[1], expected[1]);
314 BOOST_CHECK_EQUAL(out[2], expected[2]);
315
316 // Our tests
78788348 317 parseSVCBValueList("foobar123", out);
17f6cb35 318 BOOST_CHECK_EQUAL(out.size(), 1U);
78788348
PL
319 BOOST_CHECK_EQUAL(out[0], "foobar123");
320
321 parseSVCBValueList("h2,h3", out);
17f6cb35 322 BOOST_CHECK_EQUAL(out.size(), 2U);
78788348
PL
323 BOOST_CHECK_EQUAL(out[0], "h2");
324 BOOST_CHECK_EQUAL(out[1], "h3");
325
326 parseSVCBValueList("h2,h3-19,h3-20,h3-22", out);
17f6cb35 327 BOOST_CHECK_EQUAL(out.size(), 4U);
78788348
PL
328 BOOST_CHECK_EQUAL(out[0], "h2");
329 BOOST_CHECK_EQUAL(out[1], "h3-19");
330 BOOST_CHECK_EQUAL(out[2], "h3-20");
331 BOOST_CHECK_EQUAL(out[3], "h3-22");
332
333 parseSVCBValueList("foobar123,bazquux456", out);
17f6cb35 334 BOOST_CHECK_EQUAL(out.size(), 2U);
78788348
PL
335 BOOST_CHECK_EQUAL(out[0], "foobar123");
336 BOOST_CHECK_EQUAL(out[1], "bazquux456");
337
e701f9d4 338 parseSVCBValueList(R"FOO(foobar123\\,bazquux456)FOO", out);
17f6cb35 339 BOOST_CHECK_EQUAL(out.size(), 1U);
78788348
PL
340 BOOST_CHECK_EQUAL(out[0], "foobar123,bazquux456");
341
e701f9d4 342 parseSVCBValueList(R"FOO(foobar123\\\044bazquux456)FOO", out);
17f6cb35 343 BOOST_CHECK_EQUAL(out.size(), 1U);
78788348
PL
344 BOOST_CHECK_EQUAL(out[0], "foobar123,bazquux456");
345
346 // Again, but quoted
347 parseSVCBValueList("\"foobar123\"", out);
17f6cb35 348 BOOST_CHECK_EQUAL(out.size(), 1U);
78788348
PL
349 BOOST_CHECK_EQUAL(out[0], "foobar123");
350
351 parseSVCBValueList("\"foobar123,bazquux456\"", out);
17f6cb35 352 BOOST_CHECK_EQUAL(out.size(), 2U);
78788348
PL
353 BOOST_CHECK_EQUAL(out[0], "foobar123");
354 BOOST_CHECK_EQUAL(out[1], "bazquux456");
355
e701f9d4 356 parseSVCBValueList(R"FOO("foobar123\\,bazquux456")FOO", out);
17f6cb35 357 BOOST_CHECK_EQUAL(out.size(), 1U);
78788348
PL
358 BOOST_CHECK_EQUAL(out[0], "foobar123,bazquux456");
359
e701f9d4 360 parseSVCBValueList(R"FOO("foobar123\\\044bazquux456")FOO", out);
17f6cb35 361 BOOST_CHECK_EQUAL(out.size(), 1U);
78788348
PL
362 BOOST_CHECK_EQUAL(out[0], "foobar123,bazquux456");
363
364 // Quoted, with some whitespace
365 parseSVCBValueList("\"foobar123 \"", out);
17f6cb35 366 BOOST_CHECK_EQUAL(out.size(), 1U);
78788348
PL
367 BOOST_CHECK_EQUAL(out[0], "foobar123 ");
368
369 parseSVCBValueList("\"foobar123 blabla bla,baz quux456\"", out);
17f6cb35 370 BOOST_CHECK_EQUAL(out.size(), 2U);
78788348
PL
371 BOOST_CHECK_EQUAL(out[0], "foobar123 blabla bla");
372 BOOST_CHECK_EQUAL(out[1], "baz quux456");
373
374 parseSVCBValueList("\"foobar123,baz quux456\"", out);
17f6cb35 375 BOOST_CHECK_EQUAL(out.size(), 2U);
78788348
PL
376 BOOST_CHECK_EQUAL(out[0], "foobar123");
377 BOOST_CHECK_EQUAL(out[1], "baz quux456");
378
e701f9d4 379 parseSVCBValueList(R"FOO("foobar123 blabla bla\\,baz quux456")FOO", out);
17f6cb35 380 BOOST_CHECK_EQUAL(out.size(), 1U);
78788348
PL
381 BOOST_CHECK_EQUAL(out[0], "foobar123 blabla bla,baz quux456");
382
e701f9d4 383 parseSVCBValueList(R"FOO("foobar123 blabla bla\\\044baz quux456")FOO", out);
17f6cb35 384 BOOST_CHECK_EQUAL(out.size(), 1U);
78788348
PL
385 BOOST_CHECK_EQUAL(out[0], "foobar123 blabla bla,baz quux456");
386}
387
a02d0fa6
PL
388BOOST_AUTO_TEST_CASE(test_makeBytesFromHex) {
389 string out = makeBytesFromHex("1234567890abcdef");
390 BOOST_CHECK_EQUAL(out, "\x12\x34\x56\x78\x90\xab\xcd\xef");
391
392 BOOST_CHECK_THROW(makeBytesFromHex("123"), std::range_error);
50953de8
RG
393
394 BOOST_CHECK_THROW(makeBytesFromHex("1234GG"), std::range_error);
a02d0fa6
PL
395}
396
8c7a1b8a
RG
397BOOST_AUTO_TEST_CASE(test_makeHexDump) {
398 auto out = makeHexDump("\x12\x34\x56\x78\x90\xab\xcd\xef");
399 // there is a trailing white space by design
400 BOOST_CHECK_EQUAL(out, "12 34 56 78 90 ab cd ef ");
401}
402
b289a3bb
RG
403BOOST_AUTO_TEST_CASE(test_CleanSlashes) {
404 auto cleanSlashesWrapper = [](const char* str) {
405 std::string fullStr(str);
406 cleanSlashes(fullStr);
407 return fullStr;
408 };
27a80a09
RG
409 BOOST_CHECK_EQUAL(cleanSlashesWrapper(""), "");
410 BOOST_CHECK_EQUAL(cleanSlashesWrapper("/"), "/");
411 BOOST_CHECK_EQUAL(cleanSlashesWrapper("//"), "/");
b289a3bb
RG
412 BOOST_CHECK_EQUAL(cleanSlashesWrapper("/test"), "/test");
413 BOOST_CHECK_EQUAL(cleanSlashesWrapper("//test"), "/test");
414 BOOST_CHECK_EQUAL(cleanSlashesWrapper("///test"), "/test");
415 BOOST_CHECK_EQUAL(cleanSlashesWrapper("/test/"), "/test/");
416 BOOST_CHECK_EQUAL(cleanSlashesWrapper("//test/"), "/test/");
417 BOOST_CHECK_EQUAL(cleanSlashesWrapper("//test//"), "/test/");
418 BOOST_CHECK_EQUAL(cleanSlashesWrapper("///test//"), "/test/");
419 BOOST_CHECK_EQUAL(cleanSlashesWrapper("test///"), "test/");
420}
421
ef3ee606 422BOOST_AUTO_TEST_SUITE_END()