]>
git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/test-nmtree.cc
1 #define BOOST_TEST_DYN_LINK
2 #define BOOST_TEST_NO_MAIN
6 #include <boost/test/unit_test.hpp>
10 using namespace boost
;
12 BOOST_AUTO_TEST_SUITE(test_nmtree
)
14 BOOST_AUTO_TEST_CASE(test_basic
) {
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;
20 BOOST_CHECK_EQUAL(nmt
.lookup(ComboAddress("213.244.168.210")), (void*)0);
21 auto found
=nmt
.lookup(ComboAddress("130.161.252.29"));
23 BOOST_CHECK_EQUAL(found
->second
, 0);
24 found
=nmt
.lookup(ComboAddress("130.161.180.1"));
26 BOOST_CHECK_EQUAL(found
->second
, 1);
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);
32 found
=nmt
.lookup(ComboAddress("130.145.180.1"));
34 BOOST_CHECK_EQUAL(found
->second
, 2);
37 BOOST_CHECK(!nmt
.lookup(ComboAddress("130.161.180.1")));
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);
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);
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
;
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
);
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);
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
;
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
);
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);
98 BOOST_AUTO_TEST_CASE(test_removal
) {
99 std::string prefix
= "192.";
100 NetmaskTree
<int> nmt(true);
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
;
110 BOOST_CHECK_EQUAL(nmt
.size(), count
);
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);
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
);
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);
133 BOOST_CHECK(result
== nullptr);
138 BOOST_CHECK_EQUAL(nmt
.size(), 0);
139 BOOST_CHECK(nmt
.empty());
142 BOOST_AUTO_TEST_SUITE_END()