#include <config/command_mgr.h>
#include <hooks/server_hooks.h>
#include <hooks/hooks_manager.h>
+#include <hooks/callout_manager.h>
#include <dhcpsrv/cfgmgr.h>
#include <dhcp/tests/iface_mgr_test_config.h>
#include <dhcp/option.h>
HooksManager::preCalloutsLibraryHandle().deregisterAllCallouts("lease4_release");
HooksManager::preCalloutsLibraryHandle().deregisterAllCallouts("lease4_decline");
+ CalloutManager::getSharedManager().reset();
delete srv_;
}
IfaceMgrTestConfig test_config(true);
IfaceMgr::instance().openSockets4();
+ // Libraries will be reloaded later
+ CalloutManager::getSharedManager().reset(new CalloutManager(0));
+
// Install a callout
EXPECT_NO_THROW(HooksManager::preCalloutsLibraryHandle().registerCallout(
"lease4_decline", lease4_decline_callout));
IfaceMgrTestConfig test_config(true);
IfaceMgr::instance().openSockets4();
+ // Libraries will be reloaded later
+ CalloutManager::getSharedManager().reset(new CalloutManager(0));
+
// Install a callout
EXPECT_NO_THROW(HooksManager::preCalloutsLibraryHandle().registerCallout(
"lease4_decline", lease4_decline_drop_callout));
#include <util/buffer.h>
#include <util/range_utilities.h>
#include <hooks/server_hooks.h>
+#include <hooks/callout_manager.h>
#include <dhcp6/tests/dhcp6_test_utils.h>
#include <dhcp6/tests/dhcp6_client.h>
// Clear static buffers
resetCalloutBuffers();
+
+ // Reset the hook system in its original state
+ HooksManager::unloadLibraries();
}
/// @brief destructor (deletes Dhcpv6Srv)
~HooksDhcpv6SrvTest() {
+
+ // Clear shared manager
+ CalloutManager::getSharedManager().reset();
+
}
/// @brief creates an option with specified option code
TEST_F(HooksDhcpv6SrvTest, basicLease6Decline) {
IfaceMgrTestConfig test_config(true);
+ // Libraries will be reloaded later
+ CalloutManager::getSharedManager().reset(new CalloutManager(0));
+
// Install lease6_decline callout
EXPECT_NO_THROW(HooksManager::preCalloutsLibraryHandle().registerCallout(
"lease6_decline", lease6_decline_callout));
}
// Test that the lease6_decline hook point can handle SKIP status.
-/// @todo: Reenable this once #5095 is fixed.
-TEST_F(HooksDhcpv6SrvTest, DISABLED_lease6DeclineSkip) {
+TEST_F(HooksDhcpv6SrvTest, lease6DeclineSkip) {
IfaceMgrTestConfig test_config(true);
+ // Libraries will be reloaded later
+ CalloutManager::getSharedManager().reset(new CalloutManager(0));
+
// Install lease6_decline callout. It will set the status to skip
EXPECT_NO_THROW(HooksManager::preCalloutsLibraryHandle().registerCallout(
"lease6_decline", lease6_decline_skip_callout));
TEST_F(HooksDhcpv6SrvTest, lease6DeclineDrop) {
IfaceMgrTestConfig test_config(true);
+ // Libraries will be reloaded later
+ CalloutManager::getSharedManager().reset(new CalloutManager(0));
+
// Install lease6_decline callout. It will set the status to skip
EXPECT_NO_THROW(HooksManager::preCalloutsLibraryHandle().registerCallout(
"lease6_decline", lease6_decline_drop_callout));
-// Copyright (C) 2013-2015 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2013-2016 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
namespace isc {
namespace hooks {
+boost::shared_ptr<CalloutManager> CalloutManager::shared_manager_;
+
// Constructor
CalloutManager::CalloutManager(int num_libraries)
: server_hooks_(ServerHooks::getServerHooks()),
-// Copyright (C) 2013-2015 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2013-2016 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
//@}
+ /// @brief Return the shared manager
+ ///
+ /// @return A reference to the shared manager
+ static boost::shared_ptr<CalloutManager>& getSharedManager() {
+ return (shared_manager_);
+ }
+
private:
/// @brief Check library index
///
/// Number of libraries.
int num_libraries_;
+
+ /// Shared manager to survive library reloads
+ static boost::shared_ptr<CalloutManager> shared_manager_;
};
} // namespace util
// The upshot of this is that it is therefore safe for the CalloutManager
// to be deleted after all associated libraries are deleted, hence this
// link (LibraryManager -> CalloutManager) is safe.
- callout_manager_.reset(new CalloutManager(library_names_.size()));
+ //
+ // To survive reloads an attempt to re-use the shared manager
+ // is performed when the list of library is empty.
+ if (library_names_.empty()) {
+ callout_manager_ = CalloutManager::getSharedManager();
+ }
+ if (!library_names_.empty() || !callout_manager_) {
+ callout_manager_.reset(new CalloutManager(library_names_.size()));
+ }
// Now iterate through the libraries are load them one by one. We'll
for (size_t i = 0; i < library_names_.size(); ++i) {