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_;
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();
}
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)));
}
};
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) {