]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[2539] Implement getSOA() in InMemoryClient iterator
authorMukund Sivaraman <muks@isc.org>
Thu, 16 Jan 2014 06:12:49 +0000 (11:42 +0530)
committerMukund Sivaraman <muks@isc.org>
Thu, 16 Jan 2014 06:25:16 +0000 (11:55 +0530)
src/lib/datasrc/memory/memory_client.cc
src/lib/datasrc/tests/memory/memory_client_unittest.cc

index 0b0c827a8ca9faea0813e36f87d0f183e5e84302..3b573254831887f42ee7aa64b060e96b5edb8697 100644 (file)
@@ -92,6 +92,7 @@ private:
     const RRClass rrclass_;
     const ZoneTree& tree_;
     const ZoneNode* node_;
+    const ZoneNode* origin_node_;
     // Only used when separate_rrs_ is true
     ConstRRsetPtr rrset_;
     RdataIteratorPtr rdata_iterator_;
@@ -120,6 +121,11 @@ public:
             isc_throw(Unexpected,
                       "In-memory zone corrupted, missing origin node");
         }
+
+       // Save the origin node as node_ will be modified during
+       // iteration
+       origin_node_ = node_;
+
         // Initialize the iterator if there's somewhere to point to
         if (node_ != NULL && node_->getData() != NULL) {
             set_node_ = node_->getData();
@@ -231,7 +237,23 @@ public:
     }
 
     virtual ConstRRsetPtr getSOA() const {
-        isc_throw(NotImplemented, "Not implemented");
+        // SOA will be at the origin node
+        if (!origin_node_) {
+            return (ConstRRsetPtr());
+        }
+
+        const RdataSet* origin_set = origin_node_->getData();
+        if (!origin_set) {
+            return (ConstRRsetPtr());
+        }
+
+        const RdataSet* soa = RdataSet::find(origin_set, RRType::SOA());
+        if (!soa) {
+            return (ConstRRsetPtr());
+        }
+
+        return (ConstRRsetPtr
+                (new TreeNodeRRset(rrclass_, origin_node_, soa, true)));
     }
 };
 
index 73862e3a8cb8c5e8652570f69adea3217773719d..7644a1e8cfb8ec965a0ce75ee8630c3b43611eb6 100644 (file)
@@ -774,13 +774,22 @@ TEST_F(MemoryClientTest, getIteratorSeparateSigned) {
     EXPECT_TRUE(seen_nsec3);
 }
 
-TEST_F(MemoryClientTest, getIteratorGetSOAThrowsNotImplemented) {
+TEST_F(MemoryClientTest, getIteratorGetSOA) {
     loadZoneIntoTable(*ztable_segment_, Name("example.org"), zclass_,
                       TEST_DATA_DIR "/example.org-empty.zone");
     ZoneIteratorPtr iterator(client_->getIterator(Name("example.org")));
 
-    // This method is not implemented.
-    EXPECT_THROW(iterator->getSOA(), isc::NotImplemented);
+    ConstRRsetPtr soa_rrset(iterator->getSOA());
+
+    ASSERT_EQ(RRType::SOA(), soa_rrset->getType());
+    ASSERT_EQ(1, soa_rrset->getRdataCount());
+
+    RdataIteratorPtr it(soa_rrset->getRdataIterator());
+    const generic::SOA& soa
+        (dynamic_cast<const generic::SOA&>(it->getCurrent()));
+
+    EXPECT_EQ(71, soa.getSerial().getValue());
+    EXPECT_EQ(3600, soa.getMinimum());
 }
 
 TEST_F(MemoryClientTest, addEmptyRRsetThrows) {