From: Mukund Sivaraman Date: Thu, 16 Jan 2014 06:12:49 +0000 (+0530) Subject: [2539] Implement getSOA() in InMemoryClient iterator X-Git-Tag: bind10-1.2.0beta1-release~74^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=48da2e4e8966ecf8258e4e818f7aa5223e969abe;p=thirdparty%2Fkea.git [2539] Implement getSOA() in InMemoryClient iterator --- diff --git a/src/lib/datasrc/memory/memory_client.cc b/src/lib/datasrc/memory/memory_client.cc index 0b0c827a8c..3b57325483 100644 --- a/src/lib/datasrc/memory/memory_client.cc +++ b/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))); } }; diff --git a/src/lib/datasrc/tests/memory/memory_client_unittest.cc b/src/lib/datasrc/tests/memory/memory_client_unittest.cc index 73862e3a8c..7644a1e8cf 100644 --- a/src/lib/datasrc/tests/memory/memory_client_unittest.cc +++ b/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(it->getCurrent())); + + EXPECT_EQ(71, soa.getSerial().getValue()); + EXPECT_EQ(3600, soa.getMinimum()); } TEST_F(MemoryClientTest, addEmptyRRsetThrows) {