Browse Source

[2539] Implement getSOA() in InMemoryClient iterator

Mukund Sivaraman 11 years ago
parent
commit
48da2e4e89

+ 23 - 1
src/lib/datasrc/memory/memory_client.cc

@@ -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)));
     }
 };
 

+ 12 - 3
src/lib/datasrc/tests/memory/memory_client_unittest.cc

@@ -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) {