if(children.empty()) { // speed up empty set
if(endNode)
return &d_value;
- return 0;
+ return nullptr;
}
- return lookup(name.getRawLabels());
+
+ auto result = lookup(name.getRawLabels());
+ if (result) {
+ return result;
+ }
+ return endNode ? &d_value : nullptr;
}
T* lookup(std::vector<std::string> labels) const
if(labels.empty()) { // optimization
if(endNode)
return &d_value;
- return 0;
+ return nullptr;
}
SuffixMatchTree smn(*labels.rbegin());
if(child == children.end()) {
if(endNode)
return &d_value;
- return 0;
+ return nullptr;
}
labels.pop_back();
- return child->lookup(labels);
+ auto result = child->lookup(labels);
+ if (result) {
+ return result;
+ }
+ return endNode ? &d_value : nullptr;
}
// Returns all end-nodes, fully qualified (not as separate labels)
BOOST_CHECK(smn.check(examplenet));
BOOST_CHECK(smn.check(net));
- // Remove .net and check that example.net still exists
+ // Remove .net and the root, and check that example.net still exists
+ smn.remove(g_rootdnsname);
smn.remove(net);
BOOST_CHECK_EQUAL(smn.check(net), false);
BOOST_CHECK(smn.check(examplenet));
+
+ smn.add(DNSName("fr."));
+ smn.add(DNSName("www.sub.domain.fr."));
+ // should not match www.sub.domain.fr. but should still match fr.
+ BOOST_CHECK(smn.check(DNSName("sub.domain.fr.")));
}
BOOST_AUTO_TEST_CASE(test_suffixmatch_tree) {
BOOST_REQUIRE(smt.lookup(net));
BOOST_CHECK_EQUAL(*smt.lookup(net), net);
- // Remove .net, and check that example.net remains
+ // Remove .net and the root, and check that example.net remains
+ smt.remove(g_rootdnsname);
smt.remove(net);
BOOST_CHECK(smt.lookup(net) == nullptr);
BOOST_CHECK_EQUAL(*smt.lookup(examplenet), examplenet);