// forward declaration: in this header it's mostly an opaque type.
class ZoneData;
-namespace detail {
-template<class T, class C> class SegmentObjectHolder;
-}
-
/// \brief A conceptual table of authoritative zones.
///
/// This class is actually a simple wrapper for a \c DomainTree whose data is
/// \param zone_class The RR class of the zone. It must be the RR class
/// that is supposed to be associated to the zone table.
/// \param content This one should hold the zone content (the ZoneData).
- /// When it is added successfully, it is released from the holder.
+ /// The ownership is passed onto the zone table. Must not be null.
+ /// Must correspond to the name and class and must be allocated from
+ /// mem_sgmt.
/// \return \c result::SUCCESS If the zone is successfully
/// added to the zone table.
/// \return \c result::EXIST The zone table already contained
result::Result addZone(util::MemorySegment& mem_sgmt,
dns::RRClass zone_class,
const dns::Name& zone_name,
- detail::SegmentObjectHolder<ZoneData,
- isc::dns::RRClass>& content);
+ ZoneData* content);
/// Find a zone that best matches the given name in the \c ZoneTable.
///
}
TEST_F(ZoneTableTest, addZone) {
+ // It doesn't accept empty (NULL) zones
+ EXPECT_THROW(zone_table->addZone(mem_sgmt_, zclass_, zname1, NULL),
+ isc::BadValue);
+
SegmentObjectHolder<ZoneData, RRClass> holder1(
mem_sgmt_, ZoneData::create(mem_sgmt_, zname1), zclass_);
// Normal successful case.
EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zclass_,
- zname1, holder1));
+ zname1, holder1.release()));
// It got released by it
EXPECT_EQ(NULL, holder1.get());
SegmentObjectHolder<ZoneData, RRClass> holder2(
mem_sgmt_, ZoneData::create(mem_sgmt_, zname1), zclass_);
EXPECT_EQ(result::EXIST, zone_table->addZone(mem_sgmt_, zclass_,
- zname1, holder2));
+ zname1, holder2.release()));
// It releases this one even when we replace the old zone
EXPECT_EQ(NULL, holder2.get());
// names are compared in a case insensitive manner.
EXPECT_EQ(result::EXIST, zone_table->addZone(mem_sgmt_, zclass_,
Name("EXAMPLE.COM"),
- holder3));
+ holder3.release()));
// Add some more different ones. Should just succeed.
SegmentObjectHolder<ZoneData, RRClass> holder4(
mem_sgmt_, ZoneData::create(mem_sgmt_, zname2), zclass_);
EXPECT_EQ(result::SUCCESS,
- zone_table->addZone(mem_sgmt_, zclass_, zname2, holder4));
+ zone_table->addZone(mem_sgmt_, zclass_, zname2,
+ holder4.release()));
SegmentObjectHolder<ZoneData, RRClass> holder5(
mem_sgmt_, ZoneData::create(mem_sgmt_, zname3), zclass_);
EXPECT_EQ(result::SUCCESS,
- zone_table->addZone(mem_sgmt_, zclass_, zname3, holder5));
+ zone_table->addZone(mem_sgmt_, zclass_, zname3,
+ holder5.release()));
// Have the memory segment throw an exception in extending the internal
// tree. It still shouldn't cause memory leak (which would be detected
mem_sgmt_, ZoneData::create(mem_sgmt_, Name("example.org")), zclass_);
mem_sgmt_.setThrowCount(1);
EXPECT_THROW(zone_table->addZone(mem_sgmt_, zclass_, Name("example.org"),
- holder6),
+ holder6.release()),
std::bad_alloc);
}
mem_sgmt_, ZoneData::create(mem_sgmt_, zname1), zclass_);
ZoneData* zone_data = holder1.get();
EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zclass_, zname1,
- holder1));
+ holder1.release()));
SegmentObjectHolder<ZoneData, RRClass> holder2(
mem_sgmt_, ZoneData::create(mem_sgmt_, zname2), zclass_);
EXPECT_EQ(result::SUCCESS,
- zone_table->addZone(mem_sgmt_, zclass_, zname2, holder2));
+ zone_table->addZone(mem_sgmt_, zclass_, zname2,
+ holder2.release()));
SegmentObjectHolder<ZoneData, RRClass> holder3(
mem_sgmt_, ZoneData::create(mem_sgmt_, zname3), zclass_);
EXPECT_EQ(result::SUCCESS,
- zone_table->addZone(mem_sgmt_, zclass_, zname3, holder3));
+ zone_table->addZone(mem_sgmt_, zclass_, zname3,
+ holder3.release()));
const ZoneTable::FindResult find_result1 =
zone_table->findZone(Name("example.com"));
SegmentObjectHolder<ZoneData, RRClass> holder4(
mem_sgmt_, ZoneData::create(mem_sgmt_, Name("com")), zclass_);
EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zclass_,
- Name("com"), holder4));
+ Name("com"),
+ holder4.release()));
EXPECT_EQ(zone_data,
zone_table->findZone(Name("www.example.com")).zone_data);
}