|
@@ -22,6 +22,7 @@
|
|
|
#include <datasrc/result.h>
|
|
|
#include <datasrc/memory/zone_data.h>
|
|
|
#include <datasrc/memory/zone_table.h>
|
|
|
+#include <datasrc/memory/segment_object_holder.h>
|
|
|
|
|
|
#include <gtest/gtest.h>
|
|
|
|
|
@@ -30,6 +31,7 @@
|
|
|
using namespace isc::dns;
|
|
|
using namespace isc::datasrc;
|
|
|
using namespace isc::datasrc::memory;
|
|
|
+using namespace isc::datasrc::memory::detail;
|
|
|
|
|
|
namespace {
|
|
|
// Memory segment specified for tests. It normally behaves like a "local"
|
|
@@ -87,46 +89,89 @@ TEST_F(ZoneTableTest, create) {
|
|
|
}
|
|
|
|
|
|
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_);
|
|
|
+ const ZoneData* data1(holder1.get());
|
|
|
// Normal successful case.
|
|
|
- const ZoneTable::AddResult result1 =
|
|
|
- zone_table->addZone(mem_sgmt_, zclass_, zname1);
|
|
|
+ const ZoneTable::AddResult result1(zone_table->addZone(mem_sgmt_, zclass_,
|
|
|
+ zname1,
|
|
|
+ holder1.release()));
|
|
|
EXPECT_EQ(result::SUCCESS, result1.code);
|
|
|
+ EXPECT_EQ(NULL, result1.zone_data);
|
|
|
+ // It got released by it
|
|
|
+ EXPECT_EQ(NULL, holder1.get());
|
|
|
|
|
|
// Duplicate add doesn't replace the existing data.
|
|
|
- EXPECT_EQ(result::EXIST, zone_table->addZone(mem_sgmt_, zclass_,
|
|
|
- zname1).code);
|
|
|
- EXPECT_EQ(result1.zone_data,
|
|
|
- zone_table->addZone(mem_sgmt_, zclass_, zname1).zone_data);
|
|
|
+ SegmentObjectHolder<ZoneData, RRClass> holder2(
|
|
|
+ mem_sgmt_, ZoneData::create(mem_sgmt_, zname1), zclass_);
|
|
|
+ const ZoneTable::AddResult result2(zone_table->addZone(mem_sgmt_, zclass_,
|
|
|
+ zname1,
|
|
|
+ holder2.release()));
|
|
|
+ EXPECT_EQ(result::EXIST, result2.code);
|
|
|
+ // The old one gets out
|
|
|
+ EXPECT_EQ(data1, result2.zone_data);
|
|
|
+ // It releases this one even when we replace the old zone
|
|
|
+ EXPECT_EQ(NULL, holder2.get());
|
|
|
+ // We need to release the old one manually
|
|
|
+ ZoneData::destroy(mem_sgmt_, result2.zone_data, zclass_);
|
|
|
+
|
|
|
+ SegmentObjectHolder<ZoneData, RRClass> holder3(
|
|
|
+ mem_sgmt_, ZoneData::create(mem_sgmt_, Name("EXAMPLE.COM")),
|
|
|
+ zclass_);
|
|
|
// names are compared in a case insensitive manner.
|
|
|
- EXPECT_EQ(result::EXIST, zone_table->addZone(mem_sgmt_, zclass_,
|
|
|
- Name("EXAMPLE.COM")).code);
|
|
|
+ const ZoneTable::AddResult result3(zone_table->addZone(mem_sgmt_, zclass_,
|
|
|
+ Name("EXAMPLE.COM"),
|
|
|
+ holder3.release()));
|
|
|
+ EXPECT_EQ(result::EXIST, result3.code);
|
|
|
+ ZoneData::destroy(mem_sgmt_, result3.zone_data, zclass_);
|
|
|
// 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).code);
|
|
|
+ zone_table->addZone(mem_sgmt_, zclass_, zname2,
|
|
|
+ holder4.release()).code);
|
|
|
+ SegmentObjectHolder<ZoneData, RRClass> holder5(
|
|
|
+ mem_sgmt_, ZoneData::create(mem_sgmt_, zname3), zclass_);
|
|
|
EXPECT_EQ(result::SUCCESS,
|
|
|
- zone_table->addZone(mem_sgmt_, zclass_, zname3).code);
|
|
|
+ zone_table->addZone(mem_sgmt_, zclass_, zname3,
|
|
|
+ holder5.release()).code);
|
|
|
|
|
|
// Have the memory segment throw an exception in extending the internal
|
|
|
// tree. It still shouldn't cause memory leak (which would be detected
|
|
|
// in TearDown()).
|
|
|
- mem_sgmt_.setThrowCount(2);
|
|
|
- EXPECT_THROW(zone_table->addZone(mem_sgmt_, zclass_, Name("example.org")),
|
|
|
+ SegmentObjectHolder<ZoneData, RRClass> holder6(
|
|
|
+ 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.release()),
|
|
|
std::bad_alloc);
|
|
|
}
|
|
|
|
|
|
TEST_F(ZoneTableTest, findZone) {
|
|
|
- const ZoneTable::AddResult add_result1 =
|
|
|
- zone_table->addZone(mem_sgmt_, zclass_, zname1);
|
|
|
- EXPECT_EQ(result::SUCCESS, add_result1.code);
|
|
|
+ SegmentObjectHolder<ZoneData, RRClass> holder1(
|
|
|
+ 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.release()).code);
|
|
|
+ SegmentObjectHolder<ZoneData, RRClass> holder2(
|
|
|
+ mem_sgmt_, ZoneData::create(mem_sgmt_, zname2), zclass_);
|
|
|
EXPECT_EQ(result::SUCCESS,
|
|
|
- zone_table->addZone(mem_sgmt_, zclass_, zname2).code);
|
|
|
+ zone_table->addZone(mem_sgmt_, zclass_, zname2,
|
|
|
+ holder2.release()).code);
|
|
|
+ SegmentObjectHolder<ZoneData, RRClass> holder3(
|
|
|
+ mem_sgmt_, ZoneData::create(mem_sgmt_, zname3), zclass_);
|
|
|
EXPECT_EQ(result::SUCCESS,
|
|
|
- zone_table->addZone(mem_sgmt_, zclass_, zname3).code);
|
|
|
+ zone_table->addZone(mem_sgmt_, zclass_, zname3,
|
|
|
+ holder3.release()).code);
|
|
|
|
|
|
const ZoneTable::FindResult find_result1 =
|
|
|
zone_table->findZone(Name("example.com"));
|
|
|
EXPECT_EQ(result::SUCCESS, find_result1.code);
|
|
|
- EXPECT_EQ(add_result1.zone_data, find_result1.zone_data);
|
|
|
+ EXPECT_EQ(zone_data, find_result1.zone_data);
|
|
|
|
|
|
EXPECT_EQ(result::NOTFOUND,
|
|
|
zone_table->findZone(Name("example.org")).code);
|
|
@@ -137,14 +182,17 @@ TEST_F(ZoneTableTest, findZone) {
|
|
|
// and the code should be PARTIALMATCH.
|
|
|
EXPECT_EQ(result::PARTIALMATCH,
|
|
|
zone_table->findZone(Name("www.example.com")).code);
|
|
|
- EXPECT_EQ(add_result1.zone_data,
|
|
|
+ EXPECT_EQ(zone_data,
|
|
|
zone_table->findZone(Name("www.example.com")).zone_data);
|
|
|
|
|
|
// make sure the partial match is indeed the longest match by adding
|
|
|
// a zone with a shorter origin and query again.
|
|
|
+ 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")).code);
|
|
|
- EXPECT_EQ(add_result1.zone_data,
|
|
|
+ Name("com"),
|
|
|
+ holder4.release()).code);
|
|
|
+ EXPECT_EQ(zone_data,
|
|
|
zone_table->findZone(Name("www.example.com")).zone_data);
|
|
|
}
|
|
|
}
|