]> git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/test-nmtree.cc
consistently use test_ prefix for boost test suite names
[thirdparty/pdns.git] / pdns / test-nmtree.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(test_nmtree)
13
14 BOOST_AUTO_TEST_CASE(test_basic) {
15 NetmaskTree<int> nmt;
16 nmt.insert(Netmask("130.161.252.0/24")).second=0;
17 nmt.insert(Netmask("130.161.0.0/16")).second=1;
18 nmt.insert(Netmask("130.0.0.0/8")).second=2;
19
20 BOOST_CHECK_EQUAL(nmt.lookup(ComboAddress("213.244.168.210")), (void*)0);
21 auto found=nmt.lookup(ComboAddress("130.161.252.29"));
22 BOOST_CHECK(found);
23 BOOST_CHECK_EQUAL(found->second, 0);
24 found=nmt.lookup(ComboAddress("130.161.180.1"));
25 BOOST_CHECK(found);
26 BOOST_CHECK_EQUAL(found->second, 1);
27
28 BOOST_CHECK_EQUAL(nmt.lookup(ComboAddress("130.255.255.255"))->second, 2);
29 BOOST_CHECK_EQUAL(nmt.lookup(ComboAddress("130.161.252.255"))->second, 0);
30 BOOST_CHECK_EQUAL(nmt.lookup(ComboAddress("130.161.253.255"))->second, 1);
31
32 found=nmt.lookup(ComboAddress("130.145.180.1"));
33 BOOST_CHECK(found);
34 BOOST_CHECK_EQUAL(found->second, 2);
35
36 nmt.clear();
37 BOOST_CHECK(!nmt.lookup(ComboAddress("130.161.180.1")));
38
39 nmt.insert(Netmask("::1")).second=1;
40 nmt.insert(Netmask("::/0")).second=0;
41 nmt.insert(Netmask("fe80::/16")).second=2;
42 BOOST_CHECK_EQUAL(nmt.lookup(ComboAddress("130.161.253.255")), (void*)0);
43 BOOST_CHECK_EQUAL(nmt.lookup(ComboAddress("::2"))->second, 0);
44 BOOST_CHECK_EQUAL(nmt.lookup(ComboAddress("::ffff"))->second, 0);
45 BOOST_CHECK_EQUAL(nmt.lookup(ComboAddress("::1"))->second, 1);
46 BOOST_CHECK_EQUAL(nmt.lookup(ComboAddress("fe80::1"))->second, 2);
47 }
48
49 BOOST_AUTO_TEST_CASE(test_single) {
50 NetmaskTree<bool> nmt;
51 nmt.insert(Netmask("127.0.0.0/8")).second=1;
52 BOOST_CHECK_EQUAL(nmt.lookup(ComboAddress("127.0.0.1"))->second, 1);
53 }
54
55 BOOST_AUTO_TEST_CASE(test_scale) {
56 string start="192.168.";
57 NetmaskTree<int> works;
58 for(int i=0; i < 256; ++i) {
59 for(int j=0; j < 256; ++j) {
60 works.insert(Netmask(start+std::to_string(i)+"."+std::to_string(j))).second=i*j;
61 }
62 }
63
64 for(int i=0; i < 256; ++i) {
65 for(int j=0; j < 256; ++j) {
66 BOOST_CHECK_EQUAL(works.lookup(ComboAddress(start+std::to_string(i)+"."+std::to_string(j)))->second, i*j);
67 }
68 }
69
70 start="130.161.";
71 for(int i=0; i < 256; ++i) {
72 for(int j=0; j < 256; ++j) {
73 BOOST_CHECK_EQUAL(works.lookup(ComboAddress(start+std::to_string(i)+"."+std::to_string(j))), (void*)0);
74 }
75 }
76
77 start="2000:123:";
78 for(int i=0; i < 256; ++i) {
79 for(int j=0; j < 256; ++j) {
80 works.insert(Netmask(start+std::to_string(i)+":"+std::to_string(j)+"::/64")).second=i*j;
81 }
82 }
83
84 for(int i=0; i < 256; ++i) {
85 for(int j=0; j < 256; ++j) {
86 BOOST_CHECK_EQUAL(works.lookup(ComboAddress(start+std::to_string(i)+":"+std::to_string(j)+"::"+std::to_string(i)+":"+std::to_string(j)))->second, i*j);
87 }
88 }
89
90 start="2001:123:";
91 for(int i=0; i < 256; ++i) {
92 for(int j=0; j < 256; ++j) {
93 BOOST_CHECK_EQUAL(works.lookup(ComboAddress(start+std::to_string(i)+":"+std::to_string(j)+"::"+std::to_string(i)+":"+std::to_string(j))), (void*)0);
94 }
95 }
96 }
97
98 BOOST_AUTO_TEST_CASE(test_removal) {
99 std::string prefix = "192.";
100 NetmaskTree<int> nmt(true);
101
102 size_t count = 0;
103 for(unsigned int i = 0; i < 256; ++i) {
104 for(unsigned int j = 16; j <= 32; ++j) {
105 nmt.insert(Netmask(prefix + std::to_string(i) +".127.255/"+std::to_string(j))).second = j;
106 count++;
107 }
108 }
109
110 BOOST_CHECK_EQUAL(nmt.size(), count);
111
112 for(unsigned int i = 0; i < 256; ++i) {
113 ComboAddress key(prefix + std::to_string(i) + ".127.255");
114 const auto result = nmt.lookup(key);
115 BOOST_CHECK_EQUAL(result->first.getBits(), 32);
116 BOOST_CHECK_EQUAL(result->first.getMaskedNetwork().toString(), key.toString());
117 BOOST_CHECK_EQUAL(result->second, 32);
118 }
119
120 for(unsigned int i = 0; i < 256; ++i) {
121 for(unsigned int j = 32; j >= 16; --j) {
122 ComboAddress key(prefix + std::to_string(i) + ".127.255");
123 nmt.erase(Netmask(key, j));
124 const auto result = nmt.lookup(key);
125
126 if (j > 16) {
127 BOOST_REQUIRE(result != nullptr);
128 BOOST_CHECK_EQUAL(result->first.getBits(), j-1);
129 BOOST_CHECK_EQUAL(result->first.getMaskedNetwork().toString(), Netmask(key, j-1).getMaskedNetwork().toString());
130 BOOST_CHECK_EQUAL(result->second, j - 1);
131 }
132 else {
133 BOOST_CHECK(result == nullptr);
134 }
135 }
136 }
137
138 BOOST_CHECK_EQUAL(nmt.size(), 0);
139 BOOST_CHECK(nmt.empty());
140 }
141
142 BOOST_AUTO_TEST_SUITE_END()