Parcourir la source

[2093] add RBNode<T>::getAbsoluteLabelSequence()

Jelte Jansen il y a 12 ans
Parent
commit
94d72340d2
2 fichiers modifiés avec 47 ajouts et 0 suppressions
  1. 19 0
      src/lib/datasrc/rbtree.h
  2. 28 0
      src/lib/datasrc/tests/rbtree_unittest.cc

+ 19 - 0
src/lib/datasrc/rbtree.h

@@ -221,6 +221,10 @@ public:
         return (dns::LabelSequence(getLabelsData()));
         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.
     /// \brief Return the data stored in this node.
     ///
     ///
     /// You should not delete the data, it is handled by shared pointers.
     /// You should not delete the data, it is handled by shared pointers.
@@ -503,6 +507,21 @@ RBNode<T>::getUpperNode() const {
 }
 }
 
 
 template <typename T>
 template <typename T>
+isc::dns::LabelSequence
+RBNode<T>::getAbsoluteLabelSequence(
+    uint8_t buf[isc::dns::LabelSequence::MAX_SERIALIZED_LENGTH]) const
+{
+    isc::dns::LabelSequence result(getLabels(), buf);
+    const RBNode<T>* upper = getUpperNode();
+    while (upper != NULL) {
+        result.extend(upper->getLabels(), buf);
+        upper = upper->getUpperNode();
+    }
+
+    return (isc::dns::LabelSequence(result));
+}
+
+template <typename T>
 const RBNode<T>*
 const RBNode<T>*
 RBNode<T>::abstractSuccessor(typename RBNode<T>::RBNodePtr RBNode<T>::*left,
 RBNode<T>::abstractSuccessor(typename RBNode<T>::RBNodePtr RBNode<T>::*left,
                              typename RBNode<T>::RBNodePtr RBNode<T>::*right)
                              typename RBNode<T>::RBNodePtr RBNode<T>::*right)

+ 28 - 0
src/lib/datasrc/tests/rbtree_unittest.cc

@@ -988,4 +988,32 @@ TEST_F(RBTreeTest, root) {
               root.find(Name("example.com"), &crbtnode));
               root.find(Name("example.com"), &crbtnode));
     EXPECT_EQ(rbtnode, 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<int>::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());
+    }
+}
+
 }
 }