|
@@ -48,8 +48,6 @@ public:
|
|
|
CommandMgr::instance().deregisterAll();
|
|
|
CommandMgr::instance().closeCommandSocket();
|
|
|
resetCalloutIndicators();
|
|
|
- HooksManager::preCalloutsLibraryHandle().deregisterAllCallouts(
|
|
|
- "control_command_receive");
|
|
|
}
|
|
|
|
|
|
/// @brief Returns socket path (using either hardcoded path or env variable)
|
|
@@ -67,9 +65,18 @@ public:
|
|
|
}
|
|
|
|
|
|
/// @brief Resets indicators related to callout invocation.
|
|
|
+ ///
|
|
|
+ /// It also removes any registered callouts.
|
|
|
static void resetCalloutIndicators() {
|
|
|
callout_name = "";
|
|
|
callout_argument_names.clear();
|
|
|
+
|
|
|
+ // Iterate over existing hook points and for each of them remove
|
|
|
+ // callouts registered.
|
|
|
+ std::vector<std::string> hooks = ServerHooks::getServerHooksPtr()->getHookNames();
|
|
|
+ for (auto h = hooks.cbegin(); h != hooks.cend(); ++h) {
|
|
|
+ HooksManager::preCalloutsLibraryHandle().deregisterAllCallouts(*h);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/// @brief A simple command handler that always returns an eror
|
|
@@ -92,76 +99,14 @@ public:
|
|
|
return (createAnswer(234, "text generated by hook handler"));
|
|
|
}
|
|
|
|
|
|
- /// @brief Test callback which stores callout name and passed arguments.
|
|
|
- ///
|
|
|
- /// This callout doesn't indicate that the command has been processed,
|
|
|
- /// allowing the Command Manager to process it.
|
|
|
- ///
|
|
|
- /// @param callout_handle Handle passed by the hooks framework.
|
|
|
- /// @return Always 0.
|
|
|
- static int
|
|
|
- control_command_receive_callout(CalloutHandle& callout_handle) {
|
|
|
- callout_name = "control_command_receive";
|
|
|
-
|
|
|
- ConstElementPtr response;
|
|
|
- callout_handle.setArgument("response", response);
|
|
|
-
|
|
|
- callout_argument_names = callout_handle.getArgumentNames();
|
|
|
- // Sort arguments alphabetically, so as we can access them on
|
|
|
- // expected positions and verify.
|
|
|
- std::sort(callout_argument_names.begin(), callout_argument_names.end());
|
|
|
- return (0);
|
|
|
- }
|
|
|
-
|
|
|
/// @brief Test callback which stores callout name and passed arguments and
|
|
|
/// which handles the command.
|
|
|
///
|
|
|
- /// This callout returns the skip status to indicate the the command has
|
|
|
- /// been handled.
|
|
|
- ///
|
|
|
/// @param callout_handle Handle passed by the hooks framework.
|
|
|
/// @return Always 0.
|
|
|
static int
|
|
|
control_command_receive_handle_callout(CalloutHandle& callout_handle) {
|
|
|
- callout_name = "control_command_receive";
|
|
|
-
|
|
|
- // Create a hooks specific command manager.
|
|
|
- BaseCommandMgr callout_command_mgr;
|
|
|
- callout_command_mgr.registerCommand("my-command", my_hook_handler);
|
|
|
-
|
|
|
- ConstElementPtr command;
|
|
|
- callout_handle.getArgument("command", command);
|
|
|
-
|
|
|
- ConstElementPtr arg;
|
|
|
- std::string command_name = parseCommand(arg, command);
|
|
|
-
|
|
|
- ConstElementPtr response = callout_command_mgr.processCommand(command);
|
|
|
- callout_handle.setArgument("response", response);
|
|
|
-
|
|
|
- // Set 'skip' status to indicate that the command has been handled.
|
|
|
- if (command_name != "list-commands") {
|
|
|
- callout_handle.setStatus(CalloutHandle::NEXT_STEP_SKIP);
|
|
|
- }
|
|
|
-
|
|
|
- callout_argument_names = callout_handle.getArgumentNames();
|
|
|
- // Sort arguments alphabetically, so as we can access them on
|
|
|
- // expected positions and verify.
|
|
|
- std::sort(callout_argument_names.begin(), callout_argument_names.end());
|
|
|
- return (0);
|
|
|
- }
|
|
|
-
|
|
|
- /// @brief Test callback which modifies parameters of the command and
|
|
|
- /// does not return skip status.
|
|
|
- ///
|
|
|
- /// This callout is used to test the case when the callout modifies the
|
|
|
- /// received command and does not set next state SKIP to propagate the
|
|
|
- /// command with modified parameters to the local command handler.
|
|
|
- ///
|
|
|
- /// @param callout_handle Handle passed by the hooks framework.
|
|
|
- /// @return Always 0.
|
|
|
- static int
|
|
|
- control_command_receive_modify_callout(CalloutHandle& callout_handle) {
|
|
|
- callout_name = "control_command_receive";
|
|
|
+ callout_name = "control_command_receive_handle";
|
|
|
|
|
|
ConstElementPtr command;
|
|
|
callout_handle.getArgument("command", command);
|
|
@@ -169,11 +114,8 @@ public:
|
|
|
ConstElementPtr arg;
|
|
|
std::string command_name = parseCommand(arg, command);
|
|
|
|
|
|
- ElementPtr new_arg = Element::createList();
|
|
|
- new_arg->add(Element::create("hook-param"));
|
|
|
- command = createCommand(command_name, new_arg);
|
|
|
-
|
|
|
- callout_handle.setArgument("command", command);
|
|
|
+ callout_handle.setArgument("response",
|
|
|
+ createAnswer(234, "text generated by hook handler"));
|
|
|
|
|
|
callout_argument_names = callout_handle.getArgumentNames();
|
|
|
// Sort arguments alphabetically, so as we can access them on
|
|
@@ -338,12 +280,6 @@ TEST_F(CommandMgrTest, deregisterAll) {
|
|
|
// Test checks whether a command handler can be installed and then
|
|
|
// runs through processCommand to check that it's indeed called.
|
|
|
TEST_F(CommandMgrTest, processCommand) {
|
|
|
-
|
|
|
- // Register callout so as we can check that it is called before
|
|
|
- // processing the command by the manager.
|
|
|
- HooksManager::preCalloutsLibraryHandle().registerCallout(
|
|
|
- "control_command_receive", control_command_receive_callout);
|
|
|
-
|
|
|
// Install my handler
|
|
|
EXPECT_NO_THROW(CommandMgr::instance().registerCommand("my-command",
|
|
|
my_handler));
|
|
@@ -371,21 +307,17 @@ TEST_F(CommandMgrTest, processCommand) {
|
|
|
ASSERT_TRUE(handler_params);
|
|
|
EXPECT_EQ("[ \"just\", \"some\", \"data\" ]", handler_params->str());
|
|
|
|
|
|
- EXPECT_EQ("control_command_receive", callout_name);
|
|
|
-
|
|
|
- // Check that the appropriate arguments have been set. Include the
|
|
|
- // 'response' which should have been set by the callout.
|
|
|
- ASSERT_EQ(2, callout_argument_names.size());
|
|
|
- EXPECT_EQ("command", callout_argument_names[0]);
|
|
|
- EXPECT_EQ("response", callout_argument_names[1]);
|
|
|
+ // Command handlers not installed so expecting that callouts weren't
|
|
|
+ // called.
|
|
|
+ EXPECT_TRUE(callout_name.empty());
|
|
|
}
|
|
|
|
|
|
// Verify that processing a command can be delegated to a hook library.
|
|
|
TEST_F(CommandMgrTest, delegateProcessCommand) {
|
|
|
// Register callout so as we can check that it is called before
|
|
|
// processing the command by the manager.
|
|
|
- HooksManager::preCalloutsLibraryHandle().registerCallout(
|
|
|
- "control_command_receive", control_command_receive_handle_callout);
|
|
|
+ HooksManager::preCalloutsLibraryHandle().registerCommandHandler(
|
|
|
+ "my-command", control_command_receive_handle_callout);
|
|
|
|
|
|
// Install local handler
|
|
|
EXPECT_NO_THROW(CommandMgr::instance().registerCommand("my-command",
|
|
@@ -411,7 +343,7 @@ TEST_F(CommandMgrTest, delegateProcessCommand) {
|
|
|
ASSERT_NO_THROW(answer_arg = parseAnswer(status_code, answer));
|
|
|
EXPECT_EQ(234, status_code);
|
|
|
|
|
|
- EXPECT_EQ("control_command_receive", callout_name);
|
|
|
+ EXPECT_EQ("control_command_receive_handle", callout_name);
|
|
|
|
|
|
// Check that the appropriate arguments have been set. Include the
|
|
|
// 'response' which should have been set by the callout.
|
|
@@ -425,8 +357,8 @@ TEST_F(CommandMgrTest, delegateProcessCommand) {
|
|
|
TEST_F(CommandMgrTest, delegateListCommands) {
|
|
|
// Register callout so as we can check that it is called before
|
|
|
// processing the command by the manager.
|
|
|
- HooksManager::preCalloutsLibraryHandle().registerCallout(
|
|
|
- "control_command_receive", control_command_receive_handle_callout);
|
|
|
+ HooksManager::preCalloutsLibraryHandle().registerCommandHandler(
|
|
|
+ "my-command", control_command_receive_handle_callout);
|
|
|
|
|
|
// Create my-command-bis which is unique for the local Command Manager,
|
|
|
// i.e. not supported by the hook library. This command should also
|
|
@@ -464,56 +396,6 @@ TEST_F(CommandMgrTest, delegateListCommands) {
|
|
|
EXPECT_EQ("my-command-bis", command_names_list[2]);
|
|
|
}
|
|
|
|
|
|
-// This test verifies the scenario in which the hook library influences the
|
|
|
-// command processing by the Kea server. In this test, the callout modifies
|
|
|
-// the arguments of the command and passes the command on to the Command
|
|
|
-// Manager for processing.
|
|
|
-TEST_F(CommandMgrTest, modifyCommandArgsInHook) {
|
|
|
- // Register callout so as we can check that it is called before
|
|
|
- // processing the command by the manager.
|
|
|
- HooksManager::preCalloutsLibraryHandle().registerCallout(
|
|
|
- "control_command_receive", control_command_receive_modify_callout);
|
|
|
-
|
|
|
- // Install local handler
|
|
|
- EXPECT_NO_THROW(CommandMgr::instance().registerCommand("my-command",
|
|
|
- my_handler));
|
|
|
-
|
|
|
- // Now tell CommandMgr to process a command 'my-command' with the
|
|
|
- // specified parameter.
|
|
|
- ElementPtr my_params = Element::fromJSON("[ \"just\", \"some\", \"data\" ]");
|
|
|
- ConstElementPtr command = createCommand("my-command", my_params);
|
|
|
- ConstElementPtr answer;
|
|
|
- ASSERT_NO_THROW(answer = CommandMgr::instance().processCommand(command));
|
|
|
-
|
|
|
- // There should be an answer.
|
|
|
- ASSERT_TRUE(answer);
|
|
|
-
|
|
|
- // Returned status should be unique for the my_handler.
|
|
|
- ConstElementPtr answer_arg;
|
|
|
- int status_code;
|
|
|
- ASSERT_NO_THROW(answer_arg = parseAnswer(status_code, answer));
|
|
|
- EXPECT_EQ(123, status_code);
|
|
|
-
|
|
|
- // Local handler should have been called after the callout.
|
|
|
- ASSERT_TRUE(handler_called);
|
|
|
- EXPECT_EQ("my-command", handler_name);
|
|
|
- ASSERT_TRUE(handler_params);
|
|
|
- // Check that the local handler received the command with arguments
|
|
|
- // set by the callout.
|
|
|
- EXPECT_EQ("[ \"hook-param\" ]", handler_params->str());
|
|
|
-
|
|
|
-
|
|
|
- // Check that the callout has been called with appropriate parameters.
|
|
|
- EXPECT_EQ("control_command_receive", callout_name);
|
|
|
-
|
|
|
- // Check that the appropriate arguments have been set. Include the
|
|
|
- // 'response' which should have been set by the callout.
|
|
|
- ASSERT_EQ(2, callout_argument_names.size());
|
|
|
- EXPECT_EQ("command", callout_argument_names[0]);
|
|
|
- EXPECT_EQ("response", callout_argument_names[1]);
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
// This test verifies that a Unix socket can be opened properly and that input
|
|
|
// parameters (socket-type and socket-name) are verified.
|
|
|
TEST_F(CommandMgrTest, unixCreate) {
|