From: Jelte Jansen Date: Mon, 30 Jul 2012 12:50:42 +0000 (+0200) Subject: [2093] add RBNode::getAbsoluteLabelSequence() X-Git-Tag: trac2351_base~137^2~3^2~7 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=94d72340d2f47c9e40de4acf7726dedf40f2c212;p=thirdparty%2Fkea.git [2093] add RBNode::getAbsoluteLabelSequence() --- diff --git a/src/lib/datasrc/rbtree.h b/src/lib/datasrc/rbtree.h index 38086db235..aa60e6440f 100644 --- a/src/lib/datasrc/rbtree.h +++ b/src/lib/datasrc/rbtree.h @@ -221,6 +221,10 @@ public: return (dns::LabelSequence(getLabelsData())); } + /// + isc::dns::LabelSequence getAbsoluteLabelSequence( + uint8_t buf[isc::dns::LabelSequence::MAX_SERIALIZED_LENGTH]) const; + /// \brief Return the data stored in this node. /// /// You should not delete the data, it is handled by shared pointers. @@ -502,6 +506,21 @@ RBNode::getUpperNode() const { return (current->getParent()); } +template +isc::dns::LabelSequence +RBNode::getAbsoluteLabelSequence( + uint8_t buf[isc::dns::LabelSequence::MAX_SERIALIZED_LENGTH]) const +{ + isc::dns::LabelSequence result(getLabels(), buf); + const RBNode* upper = getUpperNode(); + while (upper != NULL) { + result.extend(upper->getLabels(), buf); + upper = upper->getUpperNode(); + } + + return (isc::dns::LabelSequence(result)); +} + template const RBNode* RBNode::abstractSuccessor(typename RBNode::RBNodePtr RBNode::*left, diff --git a/src/lib/datasrc/tests/rbtree_unittest.cc b/src/lib/datasrc/tests/rbtree_unittest.cc index 1d08fed226..9ac0ff2d6c 100644 --- a/src/lib/datasrc/tests/rbtree_unittest.cc +++ b/src/lib/datasrc/tests/rbtree_unittest.cc @@ -988,4 +988,32 @@ TEST_F(RBTreeTest, root) { root.find(Name("example.com"), &crbtnode)); EXPECT_EQ(rbtnode, crbtnode); } + +TEST_F(RBTreeTest, getAbsoluteLabels) { + // The full absolute names of the nodes in the tree + 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", + "j.z.d.e.f", "p.w.y.d.e.f", "q.w.y.d.e.f", "k.g.h"}; + // The names of the nodes themselves, as they end up in the tree + const char* const first_labels[] = { + "c", "b", "a", "x", "z", "g.h", "i", "o", + "j", "p", "q", "k"}; + + int name_count = sizeof(domain_names) / sizeof(domain_names[0]); + uint8_t buf[LabelSequence::MAX_SERIALIZED_LENGTH]; + for (int i = 0; i < name_count; ++i) { + EXPECT_EQ(RBTree::EXACTMATCH, rbtree.find(Name(domain_names[i]), &crbtnode)); + + // First make sure the names themselves are not absolute + LabelSequence ls(crbtnode->getLabels()); + EXPECT_EQ(first_labels[i], ls.toText()); + EXPECT_FALSE(ls.isAbsolute()); + + // Now check the absolute names + LabelSequence abs_ls = crbtnode->getAbsoluteLabelSequence(buf); + EXPECT_EQ(Name(domain_names[i]).toText(), abs_ls.toText()); + EXPECT_TRUE(abs_ls.isAbsolute()); + } +} + }