|
@@ -16,6 +16,8 @@
|
|
|
|
|
|
#include <exceptions/exceptions.h>
|
|
#include <exceptions/exceptions.h>
|
|
|
|
|
|
|
|
+#include <util/memory_segment_local.h>
|
|
|
|
+
|
|
#include <dns/name.h>
|
|
#include <dns/name.h>
|
|
#include <dns/rrclass.h>
|
|
#include <dns/rrclass.h>
|
|
#include <dns/rrset.h>
|
|
#include <dns/rrset.h>
|
|
@@ -54,31 +56,61 @@ const size_t Name::MAX_LABELS;
|
|
*/
|
|
*/
|
|
|
|
|
|
namespace {
|
|
namespace {
|
|
|
|
+class TreeHolder {
|
|
|
|
+public:
|
|
|
|
+ TreeHolder(util::MemorySegment& mem_sgmt, RBTree<int>* tree) :
|
|
|
|
+ mem_sgmt_(mem_sgmt), tree_(tree)
|
|
|
|
+ {}
|
|
|
|
+ ~TreeHolder() {
|
|
|
|
+ RBTree<int>::destroy(mem_sgmt_, tree_);
|
|
|
|
+ }
|
|
|
|
+ RBTree<int>* get() { return (tree_); }
|
|
|
|
+private:
|
|
|
|
+ util::MemorySegment& mem_sgmt_;
|
|
|
|
+ RBTree<int>* tree_;
|
|
|
|
+};
|
|
|
|
+
|
|
class RBTreeTest : public::testing::Test {
|
|
class RBTreeTest : public::testing::Test {
|
|
protected:
|
|
protected:
|
|
- RBTreeTest() : rbtree_expose_empty_node(true), crbtnode(NULL) {
|
|
|
|
|
|
+ RBTreeTest() :
|
|
|
|
+ rbtree_holder_(mem_sgmt_, RBTree<int>::create(mem_sgmt_)),
|
|
|
|
+ rbtree_expose_empty_node_holder_(mem_sgmt_,
|
|
|
|
+ RBTree<int>::create(mem_sgmt_, true)),
|
|
|
|
+ rbtree(*rbtree_holder_.get()),
|
|
|
|
+ rbtree_expose_empty_node(*rbtree_expose_empty_node_holder_.get()),
|
|
|
|
+ crbtnode(NULL)
|
|
|
|
+ {
|
|
const char* const domain_names[] = {
|
|
const char* const domain_names[] = {
|
|
"c", "b", "a", "x.d.e.f", "z.d.e.f", "g.h", "i.g.h", "o.w.y.d.e.f",
|
|
"c", "b", "a", "x.d.e.f", "z.d.e.f", "g.h", "i.g.h", "o.w.y.d.e.f",
|
|
"j.z.d.e.f", "p.w.y.d.e.f", "q.w.y.d.e.f", "k.g.h"};
|
|
"j.z.d.e.f", "p.w.y.d.e.f", "q.w.y.d.e.f", "k.g.h"};
|
|
int name_count = sizeof(domain_names) / sizeof(domain_names[0]);
|
|
int name_count = sizeof(domain_names) / sizeof(domain_names[0]);
|
|
for (int i = 0; i < name_count; ++i) {
|
|
for (int i = 0; i < name_count; ++i) {
|
|
- rbtree.insert(Name(domain_names[i]), &rbtnode);
|
|
|
|
|
|
+ rbtree.insert(mem_sgmt_, Name(domain_names[i]), &rbtnode);
|
|
rbtnode->setData(RBNode<int>::NodeDataPtr(new int(i + 1)));
|
|
rbtnode->setData(RBNode<int>::NodeDataPtr(new int(i + 1)));
|
|
|
|
|
|
- rbtree_expose_empty_node.insert(Name(domain_names[i]), &rbtnode);
|
|
|
|
|
|
+ rbtree_expose_empty_node.insert(mem_sgmt_, Name(domain_names[i]),
|
|
|
|
+ &rbtnode);
|
|
rbtnode->setData(RBNode<int>::NodeDataPtr(new int(i + 1)));
|
|
rbtnode->setData(RBNode<int>::NodeDataPtr(new int(i + 1)));
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- RBTree<int> rbtree;
|
|
|
|
- RBTree<int> rbtree_expose_empty_node;
|
|
|
|
|
|
+ util::MemorySegmentLocal mem_sgmt_;
|
|
|
|
+ TreeHolder rbtree_holder_;
|
|
|
|
+ TreeHolder rbtree_expose_empty_node_holder_;
|
|
|
|
+ RBTree<int>& rbtree;
|
|
|
|
+ RBTree<int>& rbtree_expose_empty_node;
|
|
RBNode<int>* rbtnode;
|
|
RBNode<int>* rbtnode;
|
|
const RBNode<int>* crbtnode;
|
|
const RBNode<int>* crbtnode;
|
|
};
|
|
};
|
|
|
|
|
|
-TEST_F(RBTreeTest, getNodeCount) {
|
|
|
|
|
|
+TEST_F(RBTreeTest, nodeCount) {
|
|
EXPECT_EQ(14, rbtree.getNodeCount());
|
|
EXPECT_EQ(14, rbtree.getNodeCount());
|
|
|
|
+
|
|
|
|
+ // Delete all nodes, then the count should be set to 0. This also tests
|
|
|
|
+ // the behavior of deleteAllNodes().
|
|
|
|
+ rbtree.deleteAllNodes(mem_sgmt_);
|
|
|
|
+ EXPECT_EQ(0, rbtree.getNodeCount());
|
|
}
|
|
}
|
|
|
|
|
|
TEST_F(RBTreeTest, setGetData) {
|
|
TEST_F(RBTreeTest, setGetData) {
|
|
@@ -87,64 +119,92 @@ TEST_F(RBTreeTest, setGetData) {
|
|
}
|
|
}
|
|
|
|
|
|
TEST_F(RBTreeTest, insertNames) {
|
|
TEST_F(RBTreeTest, insertNames) {
|
|
- EXPECT_EQ(RBTree<int>::ALREADYEXISTS, rbtree.insert(Name("d.e.f"),
|
|
|
|
|
|
+ EXPECT_EQ(RBTree<int>::ALREADYEXISTS, rbtree.insert(mem_sgmt_,
|
|
|
|
+ Name("d.e.f"),
|
|
&rbtnode));
|
|
&rbtnode));
|
|
EXPECT_EQ(Name("d.e.f"), rbtnode->getName());
|
|
EXPECT_EQ(Name("d.e.f"), rbtnode->getName());
|
|
EXPECT_EQ(14, rbtree.getNodeCount());
|
|
EXPECT_EQ(14, rbtree.getNodeCount());
|
|
|
|
|
|
//insert not exist node
|
|
//insert not exist node
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(Name("."), &rbtnode));
|
|
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(mem_sgmt_, Name("."),
|
|
|
|
+ &rbtnode));
|
|
EXPECT_EQ(Name("."), rbtnode->getName());
|
|
EXPECT_EQ(Name("."), rbtnode->getName());
|
|
EXPECT_EQ(15, rbtree.getNodeCount());
|
|
EXPECT_EQ(15, rbtree.getNodeCount());
|
|
|
|
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(Name("example.com"), &rbtnode));
|
|
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(mem_sgmt_,
|
|
|
|
+ Name("example.com"),
|
|
|
|
+ &rbtnode));
|
|
EXPECT_EQ(16, rbtree.getNodeCount());
|
|
EXPECT_EQ(16, rbtree.getNodeCount());
|
|
rbtnode->setData(RBNode<int>::NodeDataPtr(new int(12)));
|
|
rbtnode->setData(RBNode<int>::NodeDataPtr(new int(12)));
|
|
|
|
|
|
// return ALREADYEXISTS, since node "example.com" already has been explicitly inserted
|
|
// return ALREADYEXISTS, since node "example.com" already has been explicitly inserted
|
|
- EXPECT_EQ(RBTree<int>::ALREADYEXISTS, rbtree.insert(Name("example.com"), &rbtnode));
|
|
|
|
|
|
+ EXPECT_EQ(RBTree<int>::ALREADYEXISTS, rbtree.insert(mem_sgmt_,
|
|
|
|
+ Name("example.com"),
|
|
|
|
+ &rbtnode));
|
|
EXPECT_EQ(16, rbtree.getNodeCount());
|
|
EXPECT_EQ(16, rbtree.getNodeCount());
|
|
|
|
|
|
// split the node "d.e.f"
|
|
// split the node "d.e.f"
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(Name("k.e.f"), &rbtnode));
|
|
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(mem_sgmt_, Name("k.e.f"),
|
|
|
|
+ &rbtnode));
|
|
EXPECT_EQ(Name("k"), rbtnode->getName());
|
|
EXPECT_EQ(Name("k"), rbtnode->getName());
|
|
EXPECT_EQ(18, rbtree.getNodeCount());
|
|
EXPECT_EQ(18, rbtree.getNodeCount());
|
|
|
|
|
|
// split the node "g.h"
|
|
// split the node "g.h"
|
|
- EXPECT_EQ(RBTree<int>::ALREADYEXISTS, rbtree.insert(Name("h"), &rbtnode));
|
|
|
|
|
|
+ EXPECT_EQ(RBTree<int>::ALREADYEXISTS, rbtree.insert(mem_sgmt_, Name("h"),
|
|
|
|
+ &rbtnode));
|
|
EXPECT_EQ(Name("h"), rbtnode->getName());
|
|
EXPECT_EQ(Name("h"), rbtnode->getName());
|
|
EXPECT_EQ(19, rbtree.getNodeCount());
|
|
EXPECT_EQ(19, rbtree.getNodeCount());
|
|
|
|
|
|
// add child domain
|
|
// add child domain
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(Name("m.p.w.y.d.e.f"), &rbtnode));
|
|
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(mem_sgmt_,
|
|
|
|
+ Name("m.p.w.y.d.e.f"),
|
|
|
|
+ &rbtnode));
|
|
EXPECT_EQ(Name("m"), rbtnode->getName());
|
|
EXPECT_EQ(Name("m"), rbtnode->getName());
|
|
EXPECT_EQ(20, rbtree.getNodeCount());
|
|
EXPECT_EQ(20, rbtree.getNodeCount());
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(Name("n.p.w.y.d.e.f"), &rbtnode));
|
|
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(mem_sgmt_,
|
|
|
|
+ Name("n.p.w.y.d.e.f"),
|
|
|
|
+ &rbtnode));
|
|
EXPECT_EQ(Name("n"), rbtnode->getName());
|
|
EXPECT_EQ(Name("n"), rbtnode->getName());
|
|
EXPECT_EQ(21, rbtree.getNodeCount());
|
|
EXPECT_EQ(21, rbtree.getNodeCount());
|
|
|
|
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(Name("l.a"), &rbtnode));
|
|
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(mem_sgmt_, Name("l.a"),
|
|
|
|
+ &rbtnode));
|
|
EXPECT_EQ(Name("l"), rbtnode->getName());
|
|
EXPECT_EQ(Name("l"), rbtnode->getName());
|
|
EXPECT_EQ(22, rbtree.getNodeCount());
|
|
EXPECT_EQ(22, rbtree.getNodeCount());
|
|
|
|
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(Name("r.d.e.f"), &rbtnode));
|
|
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(Name("s.d.e.f"), &rbtnode));
|
|
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(mem_sgmt_, Name("r.d.e.f"),
|
|
|
|
+ &rbtnode));
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(mem_sgmt_, Name("s.d.e.f"),
|
|
|
|
+ &rbtnode));
|
|
EXPECT_EQ(24, rbtree.getNodeCount());
|
|
EXPECT_EQ(24, rbtree.getNodeCount());
|
|
|
|
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(Name("h.w.y.d.e.f"), &rbtnode));
|
|
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(mem_sgmt_,
|
|
|
|
+ Name("h.w.y.d.e.f"),
|
|
|
|
+ &rbtnode));
|
|
|
|
|
|
// add more nodes one by one to cover leftRotate and rightRotate
|
|
// add more nodes one by one to cover leftRotate and rightRotate
|
|
- EXPECT_EQ(RBTree<int>::ALREADYEXISTS, rbtree.insert(Name("f"), &rbtnode));
|
|
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(Name("m"), &rbtnode));
|
|
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(Name("nm"), &rbtnode));
|
|
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(Name("om"), &rbtnode));
|
|
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(Name("k"), &rbtnode));
|
|
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(Name("l"), &rbtnode));
|
|
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(Name("fe"), &rbtnode));
|
|
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(Name("ge"), &rbtnode));
|
|
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(Name("i"), &rbtnode));
|
|
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(Name("ae"), &rbtnode));
|
|
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(Name("n"), &rbtnode));
|
|
|
|
|
|
+ EXPECT_EQ(RBTree<int>::ALREADYEXISTS, rbtree.insert(mem_sgmt_, Name("f"),
|
|
|
|
+ &rbtnode));
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(mem_sgmt_, Name("m"),
|
|
|
|
+ &rbtnode));
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(mem_sgmt_, Name("nm"),
|
|
|
|
+ &rbtnode));
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(mem_sgmt_, Name("om"),
|
|
|
|
+ &rbtnode));
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(mem_sgmt_, Name("k"),
|
|
|
|
+ &rbtnode));
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(mem_sgmt_, Name("l"),
|
|
|
|
+ &rbtnode));
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(mem_sgmt_, Name("fe"),
|
|
|
|
+ &rbtnode));
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(mem_sgmt_, Name("ge"),
|
|
|
|
+ &rbtnode));
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(mem_sgmt_, Name("i"),
|
|
|
|
+ &rbtnode));
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(mem_sgmt_, Name("ae"),
|
|
|
|
+ &rbtnode));
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(mem_sgmt_, Name("n"),
|
|
|
|
+ &rbtnode));
|
|
}
|
|
}
|
|
|
|
|
|
TEST_F(RBTreeTest, findName) {
|
|
TEST_F(RBTreeTest, findName) {
|
|
@@ -187,7 +247,8 @@ TEST_F(RBTreeTest, findError) {
|
|
}
|
|
}
|
|
|
|
|
|
TEST_F(RBTreeTest, flags) {
|
|
TEST_F(RBTreeTest, flags) {
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(Name("flags.example"),
|
|
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(mem_sgmt_,
|
|
|
|
+ Name("flags.example"),
|
|
&rbtnode));
|
|
&rbtnode));
|
|
|
|
|
|
// by default, flags are all off
|
|
// by default, flags are all off
|
|
@@ -218,7 +279,8 @@ testCallback(const RBNode<int>&, bool* callack_checker) {
|
|
|
|
|
|
TEST_F(RBTreeTest, callback) {
|
|
TEST_F(RBTreeTest, callback) {
|
|
// by default callback isn't enabled
|
|
// by default callback isn't enabled
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(Name("callback.example"),
|
|
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(mem_sgmt_,
|
|
|
|
+ Name("callback.example"),
|
|
&rbtnode));
|
|
&rbtnode));
|
|
rbtnode->setData(RBNode<int>::NodeDataPtr(new int(1)));
|
|
rbtnode->setData(RBNode<int>::NodeDataPtr(new int(1)));
|
|
EXPECT_FALSE(rbtnode->getFlag(RBNode<int>::FLAG_CALLBACK));
|
|
EXPECT_FALSE(rbtnode->getFlag(RBNode<int>::FLAG_CALLBACK));
|
|
@@ -233,12 +295,14 @@ TEST_F(RBTreeTest, callback) {
|
|
rbtnode->setFlag(RBNode<int>::FLAG_CALLBACK);
|
|
rbtnode->setFlag(RBNode<int>::FLAG_CALLBACK);
|
|
// add more levels below and above the callback node for partial match.
|
|
// add more levels below and above the callback node for partial match.
|
|
RBNode<int>* subrbtnode;
|
|
RBNode<int>* subrbtnode;
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(Name("sub.callback.example"),
|
|
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, rbtree.insert(mem_sgmt_,
|
|
|
|
+ Name("sub.callback.example"),
|
|
&subrbtnode));
|
|
&subrbtnode));
|
|
subrbtnode->setData(RBNode<int>::NodeDataPtr(new int(2)));
|
|
subrbtnode->setData(RBNode<int>::NodeDataPtr(new int(2)));
|
|
RBNode<int>* parentrbtnode;
|
|
RBNode<int>* parentrbtnode;
|
|
- EXPECT_EQ(RBTree<int>::ALREADYEXISTS, rbtree.insert(Name("example"),
|
|
|
|
- &parentrbtnode));
|
|
|
|
|
|
+ EXPECT_EQ(RBTree<int>::ALREADYEXISTS, rbtree.insert(mem_sgmt_,
|
|
|
|
+ Name("example"),
|
|
|
|
+ &parentrbtnode));
|
|
// the chilld/parent nodes shouldn't "inherit" the callback flag.
|
|
// the chilld/parent nodes shouldn't "inherit" the callback flag.
|
|
// "rbtnode" may be invalid due to the insertion, so we need to re-find
|
|
// "rbtnode" may be invalid due to the insertion, so we need to re-find
|
|
// it.
|
|
// it.
|
|
@@ -275,9 +339,11 @@ TEST_F(RBTreeTest, chainLevel) {
|
|
|
|
|
|
// insert one node to the tree and find it. there should be exactly
|
|
// insert one node to the tree and find it. there should be exactly
|
|
// one level in the chain.
|
|
// one level in the chain.
|
|
- RBTree<int> tree(true);
|
|
|
|
|
|
+ TreeHolder tree_holder(mem_sgmt_, RBTree<int>::create(mem_sgmt_, true));
|
|
|
|
+ RBTree<int>& tree(*tree_holder.get());
|
|
Name node_name(Name::ROOT_NAME());
|
|
Name node_name(Name::ROOT_NAME());
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, tree.insert(node_name, &rbtnode));
|
|
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, tree.insert(mem_sgmt_, node_name,
|
|
|
|
+ &rbtnode));
|
|
EXPECT_EQ(RBTree<int>::EXACTMATCH,
|
|
EXPECT_EQ(RBTree<int>::EXACTMATCH,
|
|
tree.find(node_name, &crbtnode, chain));
|
|
tree.find(node_name, &crbtnode, chain));
|
|
EXPECT_EQ(1, chain.getLevelCount());
|
|
EXPECT_EQ(1, chain.getLevelCount());
|
|
@@ -299,7 +365,8 @@ TEST_F(RBTreeTest, chainLevel) {
|
|
*/
|
|
*/
|
|
for (unsigned int i = 2; i <= Name::MAX_LABELS; ++i) {
|
|
for (unsigned int i = 2; i <= Name::MAX_LABELS; ++i) {
|
|
node_name = Name("a.").concatenate(node_name);
|
|
node_name = Name("a.").concatenate(node_name);
|
|
- EXPECT_EQ(RBTree<int>::SUCCESS, tree.insert(node_name, &rbtnode));
|
|
|
|
|
|
+ EXPECT_EQ(RBTree<int>::SUCCESS, tree.insert(mem_sgmt_, node_name,
|
|
|
|
+ &rbtnode));
|
|
RBTreeNodeChain<int> found_chain;
|
|
RBTreeNodeChain<int> found_chain;
|
|
EXPECT_EQ(RBTree<int>::EXACTMATCH,
|
|
EXPECT_EQ(RBTree<int>::EXACTMATCH,
|
|
tree.find(node_name, &crbtnode, found_chain));
|
|
tree.find(node_name, &crbtnode, found_chain));
|
|
@@ -542,7 +609,8 @@ TEST_F(RBTreeTest, previousNode) {
|
|
{
|
|
{
|
|
SCOPED_TRACE("Lookup in empty tree");
|
|
SCOPED_TRACE("Lookup in empty tree");
|
|
// Just check it doesn't crash, etc.
|
|
// Just check it doesn't crash, etc.
|
|
- RBTree<int> empty_tree;
|
|
|
|
|
|
+ TreeHolder tree_holder(mem_sgmt_, RBTree<int>::create(mem_sgmt_));
|
|
|
|
+ RBTree<int>& empty_tree(*tree_holder.get());
|
|
EXPECT_EQ(RBTree<int>::NOTFOUND,
|
|
EXPECT_EQ(RBTree<int>::NOTFOUND,
|
|
empty_tree.find(Name("x"), &node, node_path));
|
|
empty_tree.find(Name("x"), &node, node_path));
|
|
EXPECT_EQ(static_cast<void*>(NULL), node);
|
|
EXPECT_EQ(static_cast<void*>(NULL), node);
|
|
@@ -586,7 +654,8 @@ TEST_F(RBTreeTest, getLastComparedNode) {
|
|
EXPECT_EQ(static_cast<void*>(NULL), chain.getLastComparedNode());
|
|
EXPECT_EQ(static_cast<void*>(NULL), chain.getLastComparedNode());
|
|
|
|
|
|
// A search for an empty tree should result in no 'last compared', too.
|
|
// A search for an empty tree should result in no 'last compared', too.
|
|
- RBTree<int> empty_tree;
|
|
|
|
|
|
+ TreeHolder tree_holder(mem_sgmt_, RBTree<int>::create(mem_sgmt_));
|
|
|
|
+ RBTree<int>& empty_tree(*tree_holder.get());
|
|
EXPECT_EQ(RBTree<int>::NOTFOUND,
|
|
EXPECT_EQ(RBTree<int>::NOTFOUND,
|
|
empty_tree.find(Name("a"), &crbtnode, chain));
|
|
empty_tree.find(Name("a"), &crbtnode, chain));
|
|
EXPECT_EQ(static_cast<void*>(NULL), chain.getLastComparedNode());
|
|
EXPECT_EQ(static_cast<void*>(NULL), chain.getLastComparedNode());
|
|
@@ -731,9 +800,10 @@ TEST_F(RBTreeTest, swap) {
|
|
size_t count1(rbtree.getNodeCount());
|
|
size_t count1(rbtree.getNodeCount());
|
|
|
|
|
|
// Create second one and store state
|
|
// Create second one and store state
|
|
- RBTree<int> tree2;
|
|
|
|
|
|
+ TreeHolder tree_holder(mem_sgmt_, RBTree<int>::create(mem_sgmt_));
|
|
|
|
+ RBTree<int>& tree2(*tree_holder.get());
|
|
RBNode<int>* node;
|
|
RBNode<int>* node;
|
|
- tree2.insert(Name("second"), &node);
|
|
|
|
|
|
+ tree2.insert(mem_sgmt_, Name("second"), &node);
|
|
std::ostringstream str2;
|
|
std::ostringstream str2;
|
|
tree2.dumpTree(str2);
|
|
tree2.dumpTree(str2);
|
|
|
|
|
|
@@ -757,8 +827,9 @@ TEST_F(RBTreeTest, swap) {
|
|
// any domain names should be considered a subdomain of it), so it makes
|
|
// any domain names should be considered a subdomain of it), so it makes
|
|
// sense to test cases with the root zone explicitly.
|
|
// sense to test cases with the root zone explicitly.
|
|
TEST_F(RBTreeTest, root) {
|
|
TEST_F(RBTreeTest, root) {
|
|
- RBTree<int> root;
|
|
|
|
- root.insert(Name::ROOT_NAME(), &rbtnode);
|
|
|
|
|
|
+ TreeHolder tree_holder(mem_sgmt_, RBTree<int>::create(mem_sgmt_));
|
|
|
|
+ RBTree<int>& root(*tree_holder.get());
|
|
|
|
+ root.insert(mem_sgmt_, Name::ROOT_NAME(), &rbtnode);
|
|
rbtnode->setData(RBNode<int>::NodeDataPtr(new int(1)));
|
|
rbtnode->setData(RBNode<int>::NodeDataPtr(new int(1)));
|
|
|
|
|
|
EXPECT_EQ(RBTree<int>::EXACTMATCH,
|
|
EXPECT_EQ(RBTree<int>::EXACTMATCH,
|
|
@@ -770,7 +841,7 @@ TEST_F(RBTreeTest, root) {
|
|
|
|
|
|
// Insert a new name that better matches the query name. find() should
|
|
// Insert a new name that better matches the query name. find() should
|
|
// find the better one.
|
|
// find the better one.
|
|
- root.insert(Name("com"), &rbtnode);
|
|
|
|
|
|
+ root.insert(mem_sgmt_, Name("com"), &rbtnode);
|
|
rbtnode->setData(RBNode<int>::NodeDataPtr(new int(2)));
|
|
rbtnode->setData(RBNode<int>::NodeDataPtr(new int(2)));
|
|
EXPECT_EQ(RBTree<int>::PARTIALMATCH,
|
|
EXPECT_EQ(RBTree<int>::PARTIALMATCH,
|
|
root.find(Name("example.com"), &crbtnode));
|
|
root.find(Name("example.com"), &crbtnode));
|
|
@@ -778,8 +849,10 @@ TEST_F(RBTreeTest, root) {
|
|
|
|
|
|
// Perform the same tests for the tree that allows matching against empty
|
|
// Perform the same tests for the tree that allows matching against empty
|
|
// nodes.
|
|
// nodes.
|
|
- RBTree<int> root_emptyok(true);
|
|
|
|
- root_emptyok.insert(Name::ROOT_NAME(), &rbtnode);
|
|
|
|
|
|
+ TreeHolder tree_holder_emptyok(mem_sgmt_,
|
|
|
|
+ RBTree<int>::create(mem_sgmt_, true));
|
|
|
|
+ RBTree<int>& root_emptyok(*tree_holder_emptyok.get());
|
|
|
|
+ root_emptyok.insert(mem_sgmt_, Name::ROOT_NAME(), &rbtnode);
|
|
EXPECT_EQ(RBTree<int>::EXACTMATCH,
|
|
EXPECT_EQ(RBTree<int>::EXACTMATCH,
|
|
root_emptyok.find(Name::ROOT_NAME(), &crbtnode));
|
|
root_emptyok.find(Name::ROOT_NAME(), &crbtnode));
|
|
EXPECT_EQ(rbtnode, crbtnode);
|
|
EXPECT_EQ(rbtnode, crbtnode);
|
|
@@ -787,7 +860,7 @@ TEST_F(RBTreeTest, root) {
|
|
root_emptyok.find(Name("example.com"), &crbtnode));
|
|
root_emptyok.find(Name("example.com"), &crbtnode));
|
|
EXPECT_EQ(rbtnode, crbtnode);
|
|
EXPECT_EQ(rbtnode, crbtnode);
|
|
|
|
|
|
- root.insert(Name("com"), &rbtnode);
|
|
|
|
|
|
+ root.insert(mem_sgmt_, Name("com"), &rbtnode);
|
|
EXPECT_EQ(RBTree<int>::PARTIALMATCH,
|
|
EXPECT_EQ(RBTree<int>::PARTIALMATCH,
|
|
root.find(Name("example.com"), &crbtnode));
|
|
root.find(Name("example.com"), &crbtnode));
|
|
EXPECT_EQ(rbtnode, crbtnode);
|
|
EXPECT_EQ(rbtnode, crbtnode);
|