BIND 10 trac2995, updated. d2846e4ecf8679ec53b2cd16e543b7b2488f2692 [2995] Initial implementation of lease6_select hook (segfaults for now)

BIND 10 source code commits bind10-changes at lists.isc.org
Wed Jun 26 16:49:20 UTC 2013


The branch, trac2995 has been updated
       via  d2846e4ecf8679ec53b2cd16e543b7b2488f2692 (commit)
      from  ef242ca52d93c62bfc2ef42260ebf5069d31cde5 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit d2846e4ecf8679ec53b2cd16e543b7b2488f2692
Author: Tomek Mrugalski <tomasz at isc.org>
Date:   Wed Jun 26 18:49:09 2013 +0200

    [2995] Initial implementation of lease6_select hook (segfaults for now)

-----------------------------------------------------------------------

Summary of changes:
 src/lib/dhcpsrv/tests/alloc_engine_unittest.cc |  128 +++++++++++++++++++++++-
 1 file changed, 127 insertions(+), 1 deletion(-)

-----------------------------------------------------------------------
diff --git a/src/lib/dhcpsrv/tests/alloc_engine_unittest.cc b/src/lib/dhcpsrv/tests/alloc_engine_unittest.cc
index 26721be..0d24393 100644
--- a/src/lib/dhcpsrv/tests/alloc_engine_unittest.cc
+++ b/src/lib/dhcpsrv/tests/alloc_engine_unittest.cc
@@ -25,7 +25,9 @@
 
 #include <dhcpsrv/tests/test_utils.h>
 
-#include <hooks/callout_handle.h>
+#include <hooks/server_hooks.h>
+#include <hooks/callout_manager.h>
+#include <hooks/hooks_manager.h>
 
 #include <boost/shared_ptr.hpp>
 #include <boost/scoped_ptr.hpp>
@@ -110,6 +112,10 @@ public:
 
     ~AllocEngine6Test() {
         factory_.destroy();
+
+        // Remove all registered hook points (it must be done even for tests that
+        // do not use hooks as the base class - Dhcpv6Srv registers hooks
+        ServerHooks::getServerHooks().reset();
     }
 
     DuidPtr duid_;            ///< client-identifier (value used in tests)
@@ -178,6 +184,10 @@ public:
 
     ~AllocEngine4Test() {
         factory_.destroy();
+
+        // Remove all registered hook points (it must be done even for tests that
+        // do not use hooks as the base class - Dhcpv6Srv registers hooks
+        ServerHooks::getServerHooks().reset();
     }
 
     ClientIdPtr clientid_;    ///< Client-identifier (value used in tests)
@@ -1024,4 +1034,120 @@ TEST_F(AllocEngine4Test, renewLease4) {
     detailCompareLease(lease, from_mgr);
 }
 
+class HookAllocEngine6Test : public AllocEngine6Test {
+public:
+    HookAllocEngine6Test() {
+        resetCalloutBuffers();
+
+        // Initialize Hooks Manager
+        vector<string> libraries; // no libraries at this time
+        HooksManager::getHooksManager().loadLibraries(libraries);
+
+        EXPECT_NO_THROW(HooksManager::getCalloutManager()->setLibraryIndex(0));
+    }
+
+    ~HookAllocEngine6Test() {
+
+    }
+
+    void resetCalloutBuffers() {
+        callback_name_ = string("");
+        callback_subnet6_.reset();
+        callback_fake_allocation_ = false;
+        callback_lease6_.reset();
+        callback_argument_names_.clear();
+        callback_addr_original_ = IOAddress("::");
+        callback_addr_updated_ = IOAddress("::");
+    }
+
+    /// callback that stores received callout name and received values
+    static int
+    lease6_select_callout(CalloutHandle& callout_handle) {
+        callback_name_ = string("lease6_select");
+
+        callout_handle.getArgument("subnet6", callback_subnet6_);
+        callout_handle.getArgument("fake_allocation", callback_fake_allocation_);
+        callout_handle.getArgument("lease6", callback_lease6_);
+
+        callback_addr_original_ = callback_lease6_->addr_;
+
+        callback_argument_names_ = callout_handle.getArgumentNames();
+        return (0);
+    }
+
+    /// callback that picks a different lease
+    static int
+    lease6_select_different_callout(CalloutHandle& callout_handle) {
+
+        lease6_select_callout(callout_handle);
+
+        callback_name_ = string("lease6_select");
+
+        Lease6Ptr lease;
+        callout_handle.getArgument("lease6", lease);
+
+        callback_addr_updated_ = IOAddress("2001:db8::abcd");
+        lease->addr_ = callback_addr_updated_;
+
+        return (0);
+    }
+
+    static IOAddress callback_addr_original_;
+    static IOAddress callback_addr_updated_;
+
+    static string callback_name_;
+    static Subnet6Ptr callback_subnet6_;
+    static Lease6Ptr callback_lease6_;
+    static bool callback_fake_allocation_;
+    static vector<string> callback_argument_names_;
+};
+
+IOAddress HookAllocEngine6Test::callback_addr_original_("::");
+IOAddress HookAllocEngine6Test::callback_addr_updated_("::");
+string HookAllocEngine6Test::callback_name_;
+Subnet6Ptr HookAllocEngine6Test::callback_subnet6_;
+Lease6Ptr HookAllocEngine6Test::callback_lease6_;
+bool HookAllocEngine6Test::callback_fake_allocation_;
+vector<string> HookAllocEngine6Test::callback_argument_names_;
+
+
+// This test checks if the simple allocation can succeed
+TEST_F(HookAllocEngine6Test, lease6_select) {
+    boost::scoped_ptr<AllocEngine> engine;
+    ASSERT_NO_THROW(engine.reset(new AllocEngine(AllocEngine::ALLOC_ITERATIVE, 100)));
+    ASSERT_TRUE(engine);
+
+    // Install pkt6_receive_callout
+
+    ASSERT_TRUE(HooksManager::getCalloutManager());
+
+    EXPECT_NO_THROW(HooksManager::getCalloutManager()->registerCallout("lease6_select",
+                                                                       lease6_select_callout));
+
+    Lease6Ptr lease = engine->allocateAddress6(subnet_, duid_, iaid_, IOAddress("::"),
+                                               false, CalloutHandlePtr());
+    // Check that we got a lease
+    ASSERT_TRUE(lease);
+
+    // Do all checks on the lease
+    checkLease6(lease);
+
+    // Check that the lease is indeed in LeaseMgr
+    Lease6Ptr from_mgr = LeaseMgrFactory::instance().getLease6(lease->addr_);
+    ASSERT_TRUE(from_mgr);
+
+    // Check that callouts were indeed called
+    EXPECT_EQ(callback_name_, "subnet6_select");
+
+    // Now check that the lease in LeaseMgr has the same parameters
+    ASSERT_TRUE(callback_lease6_);
+    detailCompareLease(callback_lease6_, from_mgr);
+
+    ASSERT_TRUE(callback_subnet6_);
+    EXPECT_EQ(subnet_->toText(), callback_subnet6_->toText());
+
+    EXPECT_EQ(callback_fake_allocation_, false);
+}
+
+
 }; // End of anonymous namespace



More information about the bind10-changes mailing list