]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[2100] return the created zone data from addZone.
authorJINMEI Tatuya <jinmei@isc.org>
Wed, 8 Aug 2012 23:48:36 +0000 (16:48 -0700)
committerJINMEI Tatuya <jinmei@isc.org>
Wed, 8 Aug 2012 23:48:36 +0000 (16:48 -0700)
src/lib/datasrc/memory/tests/zone_table_unittest.cc
src/lib/datasrc/memory/zone_table.cc
src/lib/datasrc/memory/zone_table.h

index 73f53c3225bd57fc8e0024d46a4b8c9e22927a52..3a978d3b645ddf8bfd2d2ff924ffa9a6c4729e79 100644 (file)
@@ -86,14 +86,21 @@ TEST_F(ZoneTableTest, create) {
 }
 
 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
@@ -104,18 +111,18 @@ TEST_F(ZoneTableTest, addZone) {
 }
 
 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"),
@@ -135,7 +142,8 @@ TEST_F(ZoneTableTest, DISABLED_findZone) {
 
     // 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());
 }
index c291b6ef9f87559e328a5efbaaf400bea7788203..660a0c76f15030ef0e20c50a4776024b08951c42 100644 (file)
@@ -70,7 +70,7 @@ ZoneTable::destroy(util::MemorySegment& mem_sgmt, ZoneTable* ztable) {
     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
@@ -96,10 +96,10 @@ ZoneTable::addZone(util::MemorySegment& mem_sgmt, const Name& zone_name) {
 
     // 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()));
     }
 }
 
index ed28f43d9266dadcbf400721be6cc76c47337193..59379a30ed8c5dfa37309e28d5d054c218b10e20 100644 (file)
@@ -46,6 +46,7 @@ class ZoneData;
 /// 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,
@@ -60,6 +61,13 @@ private:
     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)
@@ -123,8 +131,8 @@ public:
     /// 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.
     ///