From: Thomas Markwalder Date: Thu, 4 Sep 2025 18:17:03 +0000 (-0400) Subject: [#3961] Added UTs X-Git-Tag: Kea-3.1.2~63 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0ec9099a68d5311ea8aa5452ce662f7732bf2b63;p=thirdparty%2Fkea.git [#3961] Added UTs /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() --- diff --git a/src/hooks/dhcp/mysql/mysql_cb_dhcp4.cc b/src/hooks/dhcp/mysql/mysql_cb_dhcp4.cc index d9f5d2c56c..7e1d3461bf 100644 --- a/src/hooks/dhcp/mysql/mysql_cb_dhcp4.cc +++ b/src/hooks/dhcp/mysql/mysql_cb_dhcp4.cc @@ -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); } } diff --git a/src/hooks/dhcp/mysql/mysql_cb_dhcp6.cc b/src/hooks/dhcp/mysql/mysql_cb_dhcp6.cc index 92f1e5b20f..ce1f36773c 100644 --- a/src/hooks/dhcp/mysql/mysql_cb_dhcp6.cc +++ b/src/hooks/dhcp/mysql/mysql_cb_dhcp6.cc @@ -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); } } diff --git a/src/hooks/dhcp/mysql/tests/mysql_cb_dhcp4_unittest.cc b/src/hooks/dhcp/mysql/tests/mysql_cb_dhcp4_unittest.cc index bde3745371..5983f0cabf 100644 --- a/src/hooks/dhcp/mysql/tests/mysql_cb_dhcp4_unittest.cc +++ b/src/hooks/dhcp/mysql/tests/mysql_cb_dhcp4_unittest.cc @@ -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 { diff --git a/src/hooks/dhcp/mysql/tests/mysql_cb_dhcp6_unittest.cc b/src/hooks/dhcp/mysql/tests/mysql_cb_dhcp6_unittest.cc index 9336cce056..bf254477bf 100644 --- a/src/hooks/dhcp/mysql/tests/mysql_cb_dhcp6_unittest.cc +++ b/src/hooks/dhcp/mysql/tests/mysql_cb_dhcp6_unittest.cc @@ -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 { diff --git a/src/hooks/dhcp/pgsql/pgsql_cb_dhcp4.cc b/src/hooks/dhcp/pgsql/pgsql_cb_dhcp4.cc index c1ee9aefb9..d7a8a87083 100644 --- a/src/hooks/dhcp/pgsql/pgsql_cb_dhcp4.cc +++ b/src/hooks/dhcp/pgsql/pgsql_cb_dhcp4.cc @@ -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); } } diff --git a/src/hooks/dhcp/pgsql/pgsql_cb_dhcp6.cc b/src/hooks/dhcp/pgsql/pgsql_cb_dhcp6.cc index a42ff32dd3..268d474523 100644 --- a/src/hooks/dhcp/pgsql/pgsql_cb_dhcp6.cc +++ b/src/hooks/dhcp/pgsql/pgsql_cb_dhcp6.cc @@ -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); } } diff --git a/src/hooks/dhcp/pgsql/tests/pgsql_cb_dhcp4_unittest.cc b/src/hooks/dhcp/pgsql/tests/pgsql_cb_dhcp4_unittest.cc index f84b60d33e..772074fc0d 100644 --- a/src/hooks/dhcp/pgsql/tests/pgsql_cb_dhcp4_unittest.cc +++ b/src/hooks/dhcp/pgsql/tests/pgsql_cb_dhcp4_unittest.cc @@ -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 { diff --git a/src/hooks/dhcp/pgsql/tests/pgsql_cb_dhcp6_unittest.cc b/src/hooks/dhcp/pgsql/tests/pgsql_cb_dhcp6_unittest.cc index 00bbe93315..2d04a91fad 100644 --- a/src/hooks/dhcp/pgsql/tests/pgsql_cb_dhcp6_unittest.cc +++ b/src/hooks/dhcp/pgsql/tests/pgsql_cb_dhcp6_unittest.cc @@ -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 { diff --git a/src/lib/dhcpsrv/testutils/generic_cb_dhcp4_unittest.cc b/src/lib/dhcpsrv/testutils/generic_cb_dhcp4_unittest.cc index a61b122e0c..ecb0d00a97 100644 --- a/src/lib/dhcpsrv/testutils/generic_cb_dhcp4_unittest.cc +++ b/src/lib/dhcpsrv/testutils/generic_cb_dhcp4_unittest.cc @@ -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(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); +} diff --git a/src/lib/dhcpsrv/testutils/generic_cb_dhcp4_unittest.h b/src/lib/dhcpsrv/testutils/generic_cb_dhcp4_unittest.h index 9dc1408051..156bb3e481 100644 --- a/src/lib/dhcpsrv/testutils/generic_cb_dhcp4_unittest.h +++ b/src/lib/dhcpsrv/testutils/generic_cb_dhcp4_unittest.h @@ -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 test_subnets_; diff --git a/src/lib/dhcpsrv/testutils/generic_cb_dhcp6_unittest.cc b/src/lib/dhcpsrv/testutils/generic_cb_dhcp6_unittest.cc index 3a411bba06..53c825db99 100644 --- a/src/lib/dhcpsrv/testutils/generic_cb_dhcp6_unittest.cc +++ b/src/lib/dhcpsrv/testutils/generic_cb_dhcp6_unittest.cc @@ -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(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); +} diff --git a/src/lib/dhcpsrv/testutils/generic_cb_dhcp6_unittest.h b/src/lib/dhcpsrv/testutils/generic_cb_dhcp6_unittest.h index 7952c5742c..919fd781cb 100644 --- a/src/lib/dhcpsrv/testutils/generic_cb_dhcp6_unittest.h +++ b/src/lib/dhcpsrv/testutils/generic_cb_dhcp6_unittest.h @@ -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 test_subnets_; diff --git a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.cc b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.cc index de9aee74fe..e368ac1f9e 100644 --- a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.cc +++ b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.cc @@ -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); } } diff --git a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.cc b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.cc index 314a9078bd..85e7953ed0 100644 --- a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.cc +++ b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.cc @@ -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); + } }