}
TEST_F(ZoneTableTest, addZone) {
- EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname1));
- EXPECT_EQ(result::EXIST, zone_table->addZone(mem_sgmt_, zname1));
+ // Normal successful case.
+ const ZoneTable::AddResult result1 =
+ zone_table->addZone(mem_sgmt_, zname1);
+ EXPECT_EQ(result::SUCCESS, result1.code);
+
+ // Duplicate add doesn't replace the existing data.
+ EXPECT_EQ(result::EXIST, zone_table->addZone(mem_sgmt_, zname1).code);
+ EXPECT_EQ(result1.zone_data,
+ zone_table->addZone(mem_sgmt_, zname1).zone_data);
// names are compared in a case insensitive manner.
EXPECT_EQ(result::EXIST, zone_table->addZone(mem_sgmt_,
- Name("EXAMPLE.COM")));
+ Name("EXAMPLE.COM")).code);
// Add some more different ones. Should just succeed.
- EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname2));
- EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname3));
+ EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname2).code);
+ EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname3).code);
// Have the memory segment throw an exception in extending the internal
// tree. It still shouldn't cause memory leak (which would be detected
}
TEST_F(ZoneTableTest, DISABLED_removeZone) {
- EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname1));
- EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname2));
- EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname3));
+ EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname1).code);
+ EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname2).code);
+ EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname3).code);
EXPECT_EQ(result::SUCCESS, zone_table->removeZone(Name("example.net")));
EXPECT_EQ(result::NOTFOUND, zone_table->removeZone(Name("example.net")));
}
TEST_F(ZoneTableTest, DISABLED_findZone) {
- EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname1));
- EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname2));
- EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname3));
+ EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname1).code);
+ EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname2).code);
+ EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname3).code);
EXPECT_EQ(result::SUCCESS, zone_table->findZone(Name("example.com")).code);
EXPECT_EQ(Name("example.com"),
// make sure the partial match is indeed the longest match by adding
// a zone with a shorter origin and query again.
- EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, Name("com")));
+ EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_,
+ Name("com")).code);
EXPECT_EQ(Name("example.com"),
zone_table->findZone(Name("www.example.com")).zone->getOrigin());
}
mem_sgmt.deallocate(ztable, sizeof(ZoneTable));
}
-result::Result
+ZoneTable::AddResult
ZoneTable::addZone(util::MemorySegment& mem_sgmt, const Name& zone_name) {
// Create a new ZoneData instance first. If the specified name already
// exists in the table, the new data will soon be destroyed, but we want
// Is it empty? We either just created it or it might be nonterminal
if (node->isEmpty()) {
- node->setData(mem_sgmt, holder.release());
- return (result::SUCCESS);
+ node->setData(mem_sgmt, holder.get());
+ return (AddResult(result::SUCCESS, holder.release()));
} else { // There's something there already
- return (result::EXIST);
+ return (AddResult(result::EXIST, node->getData()));
}
}
/// corresponding struct and interfaces of \c MemoryDataSrc.
class ZoneTable {
private:
+ // The deleter for the zone data stored in the table.
struct ZoneDataDeleter {
ZoneDataDeleter() {}
void operator()(util::MemorySegment& mem_sgmt,
typedef DomainTreeNode<ZoneData, ZoneDataDeleter> ZoneTableNode;
public:
+ struct AddResult {
+ AddResult(result::Result param_code, ZoneData* param_zone_data) :
+ code(param_code), zone_data(param_zone_data)
+ {}
+ const result::Result code;
+ ZoneData* const zone_data;
+ };
struct FindResult {
FindResult(result::Result param_code, const ZoneFinderPtr param_zone) :
code(param_code), zone(param_zone)
/// added to the zone table.
/// \return \c result::EXIST The zone table already contains
/// zone of the same origin.
- result::Result addZone(util::MemorySegment& mem_sgmt,
- const dns::Name& zone_name);
+ AddResult addZone(util::MemorySegment& mem_sgmt,
+ const dns::Name& zone_name);
/// Remove a \c Zone of the given origin name from the \c ZoneTable.
///