[svn] commit: r3928 - in /branches/trac441/src/lib/datasrc: memory_datasrc.cc tests/memory_datasrc_unittest.cc

BIND 10 source code commits bind10-changes at lists.isc.org
Tue Dec 21 11:05:40 UTC 2010


Author: vorner
Date: Tue Dec 21 11:05:39 2010
New Revision: 3928

Log:
Implement MemoryZone::load

And fix tests for it

Modified:
    branches/trac441/src/lib/datasrc/memory_datasrc.cc
    branches/trac441/src/lib/datasrc/tests/memory_datasrc_unittest.cc

Modified: branches/trac441/src/lib/datasrc/memory_datasrc.cc
==============================================================================
--- branches/trac441/src/lib/datasrc/memory_datasrc.cc (original)
+++ branches/trac441/src/lib/datasrc/memory_datasrc.cc Tue Dec 21 11:05:39 2010
@@ -15,9 +15,11 @@
 #include <map>
 #include <iostream>
 #include <boost/shared_ptr.hpp>
+#include <boost/bind.hpp>
 
 #include <dns/name.h>
 #include <dns/rrclass.h>
+#include <dns/masterload.h>
 
 #include <datasrc/memory_datasrc.h>
 #include <datasrc/rbtree.h>
@@ -183,6 +185,41 @@
             return (FindResult(NXDOMAIN, ConstRRsetPtr()));
         }
     }
+
+    struct Load {
+        Load(MemoryZone* zone) :
+            zone_(zone),
+            swap_(true)
+        {
+            tmp_tree_.swap(zone_->impl_->domains_);
+        }
+        ~ Load() {
+            if (swap_) {
+                tmp_tree_.swap(zone_->impl_->domains_);
+            }
+        }
+        void load(const string &filename) {
+            masterLoad(filename.c_str(), zone_->getOrigin(), zone_->getClass(),
+                boost::bind(&Load::add, this, _1));
+            swap_ = false;
+        }
+        void add(RRsetPtr set) {
+            switch (zone_->add(set)) {
+                case result::EXIST:
+                    isc_throw(dns::MasterLoadError, "Duplicate rrset: " <<
+                        set->toText());
+                case result::SUCCESS:
+                    return;
+                default:
+                    isc_throw(AssertError,
+                        "Unexpected result of MemoryZone::add");
+            }
+        }
+
+        MemoryZone *zone_;
+        DomainTree tmp_tree_;
+        bool swap_;
+    };
 };
 
 MemoryZone::MemoryZone(const RRClass& zone_class, const Name& origin) :
@@ -212,6 +249,17 @@
 result::Result
 MemoryZone::add(const ConstRRsetPtr& rrset) {
     return (impl_->add(rrset));
+}
+
+void
+xxx(Zone*, RRsetPtr) {
+
+}
+
+void
+MemoryZone::load(const string& filename) {
+    MemoryZoneImpl::Load load(this);
+    load.load(filename);
 }
 
 /// Implementation details for \c MemoryDataSrc hidden from the public

Modified: branches/trac441/src/lib/datasrc/tests/memory_datasrc_unittest.cc
==============================================================================
--- branches/trac441/src/lib/datasrc/tests/memory_datasrc_unittest.cc (original)
+++ branches/trac441/src/lib/datasrc/tests/memory_datasrc_unittest.cc Tue Dec 21 11:05:39 2010
@@ -171,15 +171,20 @@
      * \param check_answer Should a check against equality of the answer be
      *     done?
      * \param answer The expected rrset, if any should be returned.
+     * \param zone Check different MemoryZone object than zone_ (if NULL,
+     *     uses zone_)
      */
     void findTest(const Name& name, const RRType& rrtype, Zone::Result result,
         bool check_answer = true,
-        const ConstRRsetPtr& answer = ConstRRsetPtr())
+        const ConstRRsetPtr& answer = ConstRRsetPtr(), MemoryZone *zone = NULL)
     {
+        if (!zone) {
+            zone = &zone_;
+        }
         // The whole block is inside, because we need to check the result and
         // we can't assign to FindResult
         EXPECT_NO_THROW({
-            Zone::FindResult find_result(zone_.find(name, rrtype));
+            Zone::FindResult find_result(zone->find(name, rrtype));
             // Check it returns correct answers
             EXPECT_EQ(result, find_result.code);
             if (check_answer) {
@@ -255,7 +260,7 @@
 
     // This should delegate
     findTest(Name("a.subdomain.example.org"), RRType::MX(), Zone::DELEGATION,
-        rr_delegation_);
+        true, rr_delegation_);
 }
 
 TEST_F(MemoryZoneTest, load) {
@@ -264,16 +269,20 @@
     // Create correct zone
     MemoryZone rootzone(class_, Name("."));
     // Try putting something inside
-    EXPECT_NO_THROW(EXPECT_EQ(result::SUCCESS, zone_.add(rr_ns_aaaa_)));
+    EXPECT_NO_THROW(EXPECT_EQ(result::SUCCESS, rootzone.add(rr_ns_aaaa_)));
     // Load the zone. It should overwrite/remove the above RRset
     EXPECT_NO_THROW(rootzone.load(TEST_DATA_DIR "/root.zone"));
 
     // Now see there are some rrsets (we don't look inside, though)
-    findTest(Name("."), RRType::SOA(), Zone::SUCCESS, false);
-    findTest(Name("."), RRType::NS(), Zone::SUCCESS, false);
-    findTest(Name("a.root-servers.net."), RRType::A(), Zone::SUCCESS, false);
+    findTest(Name("."), RRType::SOA(), Zone::SUCCESS, false, ConstRRsetPtr(),
+        &rootzone);
+    findTest(Name("."), RRType::NS(), Zone::SUCCESS, false, ConstRRsetPtr(),
+        &rootzone);
+    findTest(Name("a.root-servers.net."), RRType::A(), Zone::SUCCESS, false,
+        ConstRRsetPtr(), &rootzone);
     // But this should no longer be here
-    findTest(ns_name_, RRType::AAAA(), Zone::NXDOMAIN, false);
-}
-
-}
+    findTest(ns_name_, RRType::AAAA(), Zone::NXDOMAIN, true, ConstRRsetPtr(),
+        &rootzone);
+}
+
+}




More information about the bind10-changes mailing list