]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#3961] Added UTs
authorThomas Markwalder <tmark@isc.org>
Thu, 4 Sep 2025 18:17:03 +0000 (14:17 -0400)
committerRazvan Becheriu <razvan@isc.org>
Tue, 9 Sep 2025 12:34:14 +0000 (15:34 +0300)
/src/hooks/dhcp/mysql/mysql_cb_dhcp4.cc
/src/hooks/dhcp/mysql/mysql_cb_dhcp6.cc
/src/hooks/dhcp/pgsql/pgsql_cb_dhcp4.cc
/src/hooks/dhcp/pgsql/pgsql_cb_dhcp6.cc
    added space and code to exception text

New tests:

/src/hooks/dhcp/mysql/tests/mysql_cb_dhcp4_unittest.cc
    TEST_F(MySqlConfigBackendDHCPv4Test, optionDef4DeleteForceTest)

src/hooks/dhcp/mysql/tests/mysql_cb_dhcp6_unittest.cc
    TEST_F(MySqlConfigBackendDHCPv6Test, optionDef6DeleteForceTest)

/src/hooks/dhcp/pgsql/tests/pgsql_cb_dhcp4_unittest.cc
    TEST_F(PgSqlConfigBackendDHCPv4Test, optionDef4DeleteForceTest)

/src/hooks/dhcp/pgsql/tests/pgsql_cb_dhcp6_unittest.cc
    TEST_F(PgSqlConfigBackendDHCPv6Test, optionDef6DeleteForceTest)

/src/lib/dhcpsrv/testutils/generic_cb_dhcp4_unittest.*
    GenericConfigBackendDHCPv4Test::optionDef4DeleteForceTest()

/src/lib/dhcpsrv/testutils/generic_cb_dhcp6_unittest.*
    GenericConfigBackendDHCPv6Test::optionDef6DeleteForceTest()

14 files changed:
src/hooks/dhcp/mysql/mysql_cb_dhcp4.cc
src/hooks/dhcp/mysql/mysql_cb_dhcp6.cc
src/hooks/dhcp/mysql/tests/mysql_cb_dhcp4_unittest.cc
src/hooks/dhcp/mysql/tests/mysql_cb_dhcp6_unittest.cc
src/hooks/dhcp/pgsql/pgsql_cb_dhcp4.cc
src/hooks/dhcp/pgsql/pgsql_cb_dhcp6.cc
src/hooks/dhcp/pgsql/tests/pgsql_cb_dhcp4_unittest.cc
src/hooks/dhcp/pgsql/tests/pgsql_cb_dhcp6_unittest.cc
src/lib/dhcpsrv/testutils/generic_cb_dhcp4_unittest.cc
src/lib/dhcpsrv/testutils/generic_cb_dhcp4_unittest.h
src/lib/dhcpsrv/testutils/generic_cb_dhcp6_unittest.cc
src/lib/dhcpsrv/testutils/generic_cb_dhcp6_unittest.h
src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.cc
src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.cc

index d9f5d2c56c0a39888e63e8b15d91c5d8b8f35c48..7e1d3461bfc448d64d3a17537081f13af1497567 100644 (file)
@@ -2207,7 +2207,8 @@ public:
             auto option = getOption(GET_OPTION4_CODE_SPACE, Option::V4,
                                     server_selector, code, space);
             if (option) {
-                isc_throw(InvalidOperation, "option exists for option defintion");
+                isc_throw(InvalidOperation, "option exists for option defintion: "
+                          << space << "." << code);
             }
         }
 
index 92f1e5b20fac961bbf6f559f4f7600a140e891d7..ce1f36773c3693796780bfa050d8e6d423bddebb 100644 (file)
@@ -2589,7 +2589,8 @@ public:
             auto option = getOption(GET_OPTION6_CODE_SPACE, Option::V6,
                                     server_selector, code, space);
             if (option) {
-                isc_throw(InvalidOperation, "option exists for option defintion");
+                isc_throw(InvalidOperation, "option exists for option defintion: "
+                          << space << "." << code);
             }
         }
 
index bde374537191f0482f8e7dcecbbce5e776759034..5983f0cabf53ea1fd56c7017ed83cea361580dbb 100644 (file)
@@ -423,6 +423,10 @@ TEST_F(MySqlConfigBackendDHCPv4Test, poolOption4WithClientClassesTest) {
     poolOption4WithClientClassesTest();
 }
 
+TEST_F(MySqlConfigBackendDHCPv4Test, optionDef4DeleteForceTest) {
+    optionDef4DeleteForceTest();
+}
+
 /// @brief Test fixture for verifying database connection loss-recovery
 /// behavior.
 class MySqlConfigBackendDHCPv4DbLostCallbackTest : public GenericConfigBackendDbLostCallbackTest {
index 9336cce056a1e65ca19d63b1e439f3a6c926a0d3..bf254477bf93e9009d34406268b54ca3bf7cf2bb 100644 (file)
@@ -431,6 +431,10 @@ TEST_F(MySqlConfigBackendDHCPv6Test, pdPoolOption6WithClientClassesTest) {
     pdPoolOption6WithClientClassesTest();
 }
 
+TEST_F(MySqlConfigBackendDHCPv6Test, optionDef6DeleteForceTest) {
+    optionDef6DeleteForceTest();
+}
+
 /// @brief Test fixture for verifying database connection loss-recovery
 /// behavior.
 class MySqlConfigBackendDHCPv6DbLostCallbackTest : public GenericConfigBackendDbLostCallbackTest {
index c1ee9aefb9a5cca01fb2f60517c7842b87881cc0..d7a8a8708357864c4b7b7d44b38ac508151b8aa2 100644 (file)
@@ -2069,7 +2069,8 @@ public:
             auto option = getOption(GET_OPTION4_CODE_SPACE, Option::V4,
                                     server_selector, code, space);
             if (option) {
-                isc_throw(InvalidOperation, "option exists for option defintion");
+                isc_throw(InvalidOperation, "option exists for option defintion: "
+                          << space << "." << code);
             }
         }
 
index a42ff32dd3a8d5437887606263692cd10b979859..268d4745239a6385fa66553f0f9da792428a6b02 100644 (file)
@@ -2373,7 +2373,8 @@ public:
             auto option = getOption(GET_OPTION6_CODE_SPACE, Option::V6,
                                     server_selector, code, space);
             if (option) {
-                isc_throw(InvalidOperation, "option exists for option defintion");
+                isc_throw(InvalidOperation, "option exists for option defintion: "
+                          << space << "." << code);
             }
         }
 
index f84b60d33e11c3335e27d5c74bc73458cac3965c..772074fc0d77fddc7210b2eb00c1289767e5e6d0 100644 (file)
@@ -421,6 +421,10 @@ TEST_F(PgSqlConfigBackendDHCPv4Test, poolOption4WithClientClassesTest) {
     poolOption4WithClientClassesTest();
 }
 
+TEST_F(PgSqlConfigBackendDHCPv4Test, optionDef4DeleteForceTest) {
+    optionDef4DeleteForceTest();
+}
+
 /// @brief Test fixture for verifying database connection loss-recovery
 /// behavior.
 class PgSqlConfigBackendDHCPv4DbLostCallbackTest : public GenericConfigBackendDbLostCallbackTest {
index 00bbe93315305395b78f2adc073c4d7a3f63b651..2d04a91fadeabcdef6ce7923c8a6385a344641c8 100644 (file)
@@ -429,6 +429,10 @@ TEST_F(PgSqlConfigBackendDHCPv6Test, pdPoolOption6WithClientClassesTest) {
     pdPoolOption6WithClientClassesTest();
 }
 
+TEST_F(PgSqlConfigBackendDHCPv6Test, optionDef6DeleteForceTest) {
+    optionDef6DeleteForceTest();
+}
+
 /// @brief Test fixture for verifying database connection loss-recovery
 /// behavior.
 class PgSqlConfigBackendDHCPv6DbLostCallbackTest : public GenericConfigBackendDbLostCallbackTest {
index a61b122e0c7bdcfbe5ea4cb17b11f3ffcadf630d..ecb0d00a97602f24179b86c315c91162ac6956e2 100644 (file)
@@ -5138,3 +5138,46 @@ GenericConfigBackendDHCPv4Test::poolOption4WithClientClassesTest() {
     auto cfg_option = returned_pool->getCfgOption()->getAll(DHCP4_OPTION_SPACE);
     EXPECT_TRUE(cfg_option->empty());
 }
+
+void
+GenericConfigBackendDHCPv4Test::optionDef4DeleteForceTest() {
+    /// @brief This test verifies that option defintion delete:
+    /// 1. Does not delete a defintion if the force parameter is omitted and a
+    /// dependent option exists.
+    /// 2. Does not delete a defintion if the force parameter is false and a
+    /// dependent option exists.
+    /// 3. Deletes a defintion if the force parameter is true and a
+    /// dependent option exists.
+
+
+    // Create an option definition.
+    OptionDefinitionPtr option_def(new OptionDefinition("foo", 234,
+                                                        DHCP4_OPTION_SPACE,
+                                                        "string"));
+
+    ASSERT_NO_THROW_LOG(cbptr_->createUpdateOptionDef4(ServerSelector::ALL(),
+                                                       option_def));
+
+    // Create an option which uses the definition.
+    auto desc = createOption<OptionString>(Option::V4, 234, true, false, false, "my-option");
+    OptionDescriptorPtr option((new OptionDescriptor(desc)));
+    option->space_name_ = DHCP4_OPTION_SPACE;
+
+    ASSERT_NO_THROW_LOG(cbptr_->createUpdateOption4(ServerSelector::ALL(), option));
+
+    // Attempting to delete the defintion should fail by default.
+    uint64_t deleted_num = 0;
+    ASSERT_THROW_MSG(deleted_num = cbptr_->deleteOptionDef4(ServerSelector::ALL(),
+                                                            234, DHCP4_OPTION_SPACE),
+                     InvalidOperation, "option exists for option defintion: dhcp4.234");
+    EXPECT_EQ(0, deleted_num);
+
+    ASSERT_THROW_MSG(deleted_num = cbptr_->deleteOptionDef4(ServerSelector::ALL(),
+                                                            234, DHCP4_OPTION_SPACE, false),
+                     InvalidOperation, "option exists for option defintion: dhcp4.234");
+    EXPECT_EQ(0, deleted_num);
+
+    ASSERT_NO_THROW_LOG(deleted_num = cbptr_->deleteOptionDef4(ServerSelector::ALL(),
+                                                            234, DHCP4_OPTION_SPACE, true));
+    EXPECT_EQ(1, deleted_num);
+}
index 9dc140805166c1ad722d483161c7210adcbed61c..156bb3e4811a0f9f3444d40a3dda3f4ecd3a8900 100644 (file)
@@ -400,6 +400,15 @@ public:
     /// by their client-classes content.
     void poolOption4WithClientClassesTest();
 
+    /// @brief This test verifies that option defintion delete:
+    /// 1. Does not delete a defintion if the force parameter is omitted and a
+    /// dependent option exists.
+    /// 2. Does not delete a defintion if the force parameter is false and a
+    /// dependent option exists.
+    /// 3. Deletes a defintion if the force parameter is true and a
+    /// dependent option exists.
+    void optionDef4DeleteForceTest();
+
     /// @brief Holds pointers to subnets used in tests.
     std::vector<Subnet4Ptr> test_subnets_;
 
index 3a411bba067b8b7cac7ef511afcf677cd1f44145..53c825db99f11ad2eb6fc58d128288971c54dea6 100644 (file)
@@ -5387,3 +5387,37 @@ GenericConfigBackendDHCPv6Test::pdPoolOption6WithClientClassesTest() {
     auto cfg_option = returned_pool->getCfgOption()->getAll(DHCP6_OPTION_SPACE);
     EXPECT_TRUE(cfg_option->empty());
 }
+
+void
+GenericConfigBackendDHCPv6Test::optionDef6DeleteForceTest() {
+    // Create an option definition.
+    OptionDefinitionPtr option_def(new OptionDefinition("foo", 700,
+                                                        DHCP6_OPTION_SPACE,
+                                                        "string"));
+
+    ASSERT_NO_THROW_LOG(cbptr_->createUpdateOptionDef6(ServerSelector::ALL(),
+                                                       option_def));
+
+    // Create an option which uses the definition.
+    auto desc = createOption<OptionString>(Option::V6, 700, true, false, false, "my-option");
+    OptionDescriptorPtr option((new OptionDescriptor(desc)));
+    option->space_name_ = DHCP6_OPTION_SPACE;
+
+    ASSERT_NO_THROW_LOG(cbptr_->createUpdateOption6(ServerSelector::ALL(), option));
+
+    // Attempting to delete the defintion should fail by default.
+    uint64_t deleted_num = 0;
+    ASSERT_THROW_MSG(deleted_num = cbptr_->deleteOptionDef6(ServerSelector::ALL(),
+                                                            700, DHCP6_OPTION_SPACE),
+                     InvalidOperation, "option exists for option defintion: dhcp6.700");
+    EXPECT_EQ(0, deleted_num);
+
+    ASSERT_THROW_MSG(deleted_num = cbptr_->deleteOptionDef6(ServerSelector::ALL(),
+                                                            700, DHCP6_OPTION_SPACE, false),
+                     InvalidOperation, "option exists for option defintion: dhcp6.700");
+    EXPECT_EQ(0, deleted_num);
+
+    ASSERT_NO_THROW_LOG(deleted_num = cbptr_->deleteOptionDef6(ServerSelector::ALL(),
+                                                            700, DHCP6_OPTION_SPACE, true));
+    EXPECT_EQ(1, deleted_num);
+}
index 7952c5742c55f56cbe3660712e431419cb5d99a8..919fd781cbd603ddabd373965f386292ca1b0e17 100644 (file)
@@ -409,6 +409,15 @@ public:
     /// by their client-classes content.
     void pdPoolOption6WithClientClassesTest();
 
+    /// @brief This test verifies that option defintion delete:
+    /// 1. Does not delete a defintion if the force parameter is omitted and a
+    /// dependent option exists.
+    /// 2. Does not delete a defintion if the force parameter is false and a
+    /// dependent option exists.
+    /// 3. Deletes a defintion if the force parameter is true and a
+    /// dependent option exists.
+    void optionDef6DeleteForceTest();
+
     /// @brief Holds pointers to subnets used in tests.
     std::vector<Subnet6Ptr> test_subnets_;
 
index de9aee74fe06b3ecdce6746554c72304b8f1c5f5..e368ac1f9e404d1afaa27f0def08f2900b642da7 100644 (file)
@@ -1155,7 +1155,7 @@ TestConfigBackendDHCPv4::deleteOptionDef4(const db::ServerSelector& server_selec
     if (!force) {
         auto option = getOption4(server_selector, code, space);
         if (option) {
-            isc_throw(InvalidOperation, "option exists for option definition " 
+            isc_throw(InvalidOperation, "option exists for option definition: " 
                       << space << "." << code);
         }
     }
index 314a9078bde9ad5478ebc5d5e2964660ba7fc833..85e7953ed0fa378bf273bcc5acb4c7f64f0e5f7f 100644 (file)
@@ -1210,7 +1210,9 @@ TestConfigBackendDHCPv6::deleteOptionDef6(const db::ServerSelector& server_selec
     if (!force) {
         auto option = getOption6(server_selector, code, space);
         if (option) {
-            isc_throw(InvalidOperation, "option exists for option definition");
+            isc_throw(InvalidOperation, "option exists for option definition: "
+                      << space << "." << code);
+
         }
     }