Browse Source

Merge branch 'trac2539'

Mukund Sivaraman 11 years ago
parent
commit
469f80fa1e

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

@@ -90,6 +90,7 @@ private:
     ZoneChain chain_;
     const RdataSet* set_node_;
     const RRClass rrclass_;
+    ConstRRsetPtr soa_;
     const ZoneTree& tree_;
     const ZoneNode* node_;
     // Only used when separate_rrs_ is true
@@ -120,6 +121,18 @@ public:
             isc_throw(Unexpected,
                       "In-memory zone corrupted, missing origin node");
         }
+
+        if (node_) {
+            const RdataSet* origin_set = node_->getData();
+            if (origin_set) {
+                const RdataSet* soa_set = RdataSet::find(origin_set, RRType::SOA());
+                if (soa_set) {
+                    soa_ = ConstRRsetPtr (new TreeNodeRRset(rrclass_, node_,
+                                                            soa_set, true));
+                }
+            }
+        }
+
         // Initialize the iterator if there's somewhere to point to
         if (node_ != NULL && node_->getData() != NULL) {
             set_node_ = node_->getData();
@@ -231,7 +244,7 @@ public:
     }
 
     virtual ConstRRsetPtr getSOA() const {
-        isc_throw(NotImplemented, "Not implemented");
+        return (soa_);
     }
 };
 

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