]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#2434] add tests for socket status in status-get
authorAndrei Pavel <andrei@isc.org>
Thu, 21 Jul 2022 10:23:10 +0000 (13:23 +0300)
committerAndrei Pavel <andrei@isc.org>
Fri, 22 Jul 2022 11:36:31 +0000 (14:36 +0300)
src/bin/dhcp4/tests/ctrl_dhcp4_srv_unittest.cc
src/bin/dhcp6/tests/ctrl_dhcp6_srv_unittest.cc

index 4f38e126ece1e33521deaa5f00920e4d072fa318..589e442239a2c65d3afc3c1d413fb2ae2eeef0ff 100644 (file)
@@ -13,6 +13,7 @@
 #include <config/timeouts.h>
 #include <dhcp/dhcp4.h>
 #include <dhcp/libdhcp++.h>
+#include <dhcp/tests/iface_mgr_test_config.h>
 #include <dhcpsrv/cfgmgr.h>
 #include <dhcpsrv/lease.h>
 #include <dhcpsrv/lease_mgr_factory.h>
@@ -1107,7 +1108,7 @@ TEST_F(CtrlChannelDhcpv4SrvTest, statusGet) {
 
     std::string response_txt;
 
-    // Send the version-get command
+    // Send the status-get command.
     sendUnixCommand("{ \"command\": \"status-get\" }", response_txt);
     ConstElementPtr response;
     ASSERT_NO_THROW(response = Element::fromJSON(response_txt));
@@ -1203,6 +1204,92 @@ TEST_F(CtrlChannelDhcpv4SrvTest, statusGet) {
     EXPECT_EQ(3, found_queue_stats->size());
 }
 
+// Checks that socket status exists in status-get responses.
+TEST_F(CtrlChannelDhcpv4SrvTest, statusGetSockets) {
+    // Create dummy interfaces to test socket status.
+    isc::dhcp::test::IfaceMgrTestConfig test_config(true);
+
+    // Send the status-get command.
+    createUnixChannelServer();
+    string response_text;
+    sendUnixCommand(R"({ "command": "status-get" })", response_text);
+    ConstElementPtr response;
+    ASSERT_NO_THROW(response = Element::fromJSON(response_text));
+    ASSERT_TRUE(response);
+    ASSERT_EQ(Element::map, response->getType());
+    ConstElementPtr result(response->get("result"));
+    ASSERT_TRUE(result);
+    ASSERT_EQ(Element::integer, result->getType());
+    EXPECT_EQ(0, result->intValue());
+    ConstElementPtr arguments(response->get("arguments"));
+    ASSERT_TRUE(arguments);
+    ASSERT_EQ(Element::map, arguments->getType());
+
+    ConstElementPtr sockets(arguments->get("sockets"));
+    ASSERT_TRUE(sockets);
+    ASSERT_EQ(Element::map, sockets->getType());
+
+    ConstElementPtr status(sockets->get("status"));
+    ASSERT_TRUE(status);
+    ASSERT_EQ(Element::string, status->getType());
+    EXPECT_EQ("ready", status->stringValue());
+
+    ConstElementPtr errors(sockets->get("errors"));
+    ASSERT_FALSE(errors);
+}
+
+// Checks that socket status includes errors in status-get responses.
+TEST_F(CtrlChannelDhcpv4SrvTest, statusGetSocketsErrors) {
+    // Create dummy interfaces to test socket status and add custom down and no-address interfaces.
+    isc::dhcp::test::IfaceMgrTestConfig test_config(true);
+    test_config.addIface("down_interface", 4);
+    test_config.setIfaceFlags("down_interface", FlagLoopback(false), FlagUp(false),
+                              FlagRunning(true), FlagInactive4(false),
+                              FlagInactive6(false));
+    test_config.addIface("no_address", 5);
+
+    // Send the status-get command.
+    createUnixChannelServer();
+    string response_text;
+    sendUnixCommand(R"({ "command": "status-get" })", response_text);
+    ConstElementPtr response;
+    ASSERT_NO_THROW(response = Element::fromJSON(response_text));
+    ASSERT_TRUE(response);
+    ASSERT_EQ(Element::map, response->getType());
+    ConstElementPtr result(response->get("result"));
+    ASSERT_TRUE(result);
+    ASSERT_EQ(Element::integer, result->getType());
+    EXPECT_EQ(0, result->intValue());
+    ConstElementPtr arguments(response->get("arguments"));
+    ASSERT_TRUE(arguments);
+    ASSERT_EQ(Element::map, arguments->getType());
+
+    ConstElementPtr sockets(arguments->get("sockets"));
+    ASSERT_TRUE(sockets);
+    ASSERT_EQ(Element::map, sockets->getType());
+
+    ConstElementPtr status(sockets->get("status"));
+    ASSERT_TRUE(status);
+    ASSERT_EQ(Element::string, status->getType());
+    EXPECT_EQ("failed", status->stringValue());
+
+    ConstElementPtr errors(sockets->get("errors"));
+    ASSERT_TRUE(errors);
+    ASSERT_EQ(Element::list, errors->getType());
+    ASSERT_EQ(2, errors->size());
+
+    ConstElementPtr error(errors->get(0));
+    ASSERT_TRUE(error);
+    ASSERT_EQ(Element::string, error->getType());
+    ASSERT_EQ("the interface down_interface is down", error->stringValue());
+
+    error = errors->get(1);
+    ASSERT_TRUE(error);
+    ASSERT_EQ(Element::string, error->getType());
+    ASSERT_EQ("the interface no_address has no usable IPv4 addresses configured",
+              error->stringValue());
+}
+
 // This test verifies that the DHCP server handles config-backend-pull command
 TEST_F(CtrlChannelDhcpv4SrvTest, configBackendPull) {
     createUnixChannelServer();
index 946b24acf01cb18a718c4c3862e7a6e516c72c10..24b6420e37514db76d07c4b887a2edbca3b94aba 100644 (file)
@@ -10,6 +10,7 @@
 #include <cc/command_interpreter.h>
 #include <config/command_mgr.h>
 #include <dhcp/libdhcp++.h>
+#include <dhcp/tests/iface_mgr_test_config.h>
 #include <dhcpsrv/cfgmgr.h>
 #include <dhcpsrv/lease.h>
 #include <dhcpsrv/lease_mgr_factory.h>
@@ -995,7 +996,7 @@ TEST_F(CtrlChannelDhcpv6SrvTest, statusGet) {
 
     std::string response_txt;
 
-    // Send the version-get command
+    // Send the status-get command.
     sendUnixCommand("{ \"command\": \"status-get\" }", response_txt);
     ConstElementPtr response;
     ASSERT_NO_THROW(response = Element::fromJSON(response_txt));
@@ -1091,6 +1092,85 @@ TEST_F(CtrlChannelDhcpv6SrvTest, statusGet) {
     EXPECT_EQ(3, found_queue_stats->size());
 }
 
+// Checks that socket status exists in status-get responses.
+TEST_F(CtrlChannelDhcpv6SrvTest, statusGetSockets) {
+    // Create dummy interfaces to test socket status.
+    isc::dhcp::test::IfaceMgrTestConfig test_config(true);
+
+    // Send the status-get command.
+    createUnixChannelServer();
+    string response_text;
+    sendUnixCommand(R"({ "command": "status-get" })", response_text);
+    ConstElementPtr response;
+    ASSERT_NO_THROW(response = Element::fromJSON(response_text));
+    ASSERT_TRUE(response);
+    ASSERT_EQ(Element::map, response->getType());
+    ConstElementPtr result(response->get("result"));
+    ASSERT_TRUE(result);
+    ASSERT_EQ(Element::integer, result->getType());
+    EXPECT_EQ(0, result->intValue());
+    ConstElementPtr arguments(response->get("arguments"));
+    ASSERT_TRUE(arguments);
+    ASSERT_EQ(Element::map, arguments->getType());
+
+    ConstElementPtr sockets(arguments->get("sockets"));
+    ASSERT_TRUE(sockets);
+    ASSERT_EQ(Element::map, sockets->getType());
+
+    ConstElementPtr status(sockets->get("status"));
+    ASSERT_TRUE(status);
+    ASSERT_EQ(Element::string, status->getType());
+    EXPECT_EQ("ready", status->stringValue());
+
+    ConstElementPtr errors(sockets->get("errors"));
+    ASSERT_FALSE(errors);
+}
+
+// Checks that socket status includes errors in status-get responses.
+TEST_F(CtrlChannelDhcpv6SrvTest, statusGetSocketsErrors) {
+    // Create dummy interfaces to test socket status and add a custom down interface.
+    isc::dhcp::test::IfaceMgrTestConfig test_config(true);
+    test_config.addIface("down_interface", 4);
+    test_config.setIfaceFlags("down_interface", FlagLoopback(false), FlagUp(false),
+                              FlagRunning(true), FlagInactive4(false),
+                              FlagInactive6(false));
+
+    // Send the status-get command.
+    createUnixChannelServer();
+    string response_text;
+    sendUnixCommand(R"({ "command": "status-get" })", response_text);
+    ConstElementPtr response;
+    ASSERT_NO_THROW(response = Element::fromJSON(response_text));
+    ASSERT_TRUE(response);
+    ASSERT_EQ(Element::map, response->getType());
+    ConstElementPtr result(response->get("result"));
+    ASSERT_TRUE(result);
+    ASSERT_EQ(Element::integer, result->getType());
+    EXPECT_EQ(0, result->intValue());
+    ConstElementPtr arguments(response->get("arguments"));
+    ASSERT_TRUE(arguments);
+    ASSERT_EQ(Element::map, arguments->getType());
+
+    ConstElementPtr sockets(arguments->get("sockets"));
+    ASSERT_TRUE(sockets);
+    ASSERT_EQ(Element::map, sockets->getType());
+
+    ConstElementPtr status(sockets->get("status"));
+    ASSERT_TRUE(status);
+    ASSERT_EQ(Element::string, status->getType());
+    EXPECT_EQ("failed", status->stringValue());
+
+    ConstElementPtr errors(sockets->get("errors"));
+    ASSERT_TRUE(errors);
+    ASSERT_EQ(Element::list, errors->getType());
+    ASSERT_EQ(1, errors->size());
+
+    ConstElementPtr error(errors->get(0));
+    ASSERT_TRUE(error);
+    ASSERT_EQ(Element::string, error->getType());
+    ASSERT_EQ("the interface down_interface is down", error->stringValue());
+}
+
 // This test verifies that the DHCP server handles server-tag-get command
 TEST_F(CtrlChannelDhcpv6SrvTest, serverTagGet) {
     createUnixChannelServer();