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);
}
}
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);
}
}
poolOption4WithClientClassesTest();
}
+TEST_F(MySqlConfigBackendDHCPv4Test, optionDef4DeleteForceTest) {
+ optionDef4DeleteForceTest();
+}
+
/// @brief Test fixture for verifying database connection loss-recovery
/// behavior.
class MySqlConfigBackendDHCPv4DbLostCallbackTest : public GenericConfigBackendDbLostCallbackTest {
pdPoolOption6WithClientClassesTest();
}
+TEST_F(MySqlConfigBackendDHCPv6Test, optionDef6DeleteForceTest) {
+ optionDef6DeleteForceTest();
+}
+
/// @brief Test fixture for verifying database connection loss-recovery
/// behavior.
class MySqlConfigBackendDHCPv6DbLostCallbackTest : public GenericConfigBackendDbLostCallbackTest {
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);
}
}
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);
}
}
poolOption4WithClientClassesTest();
}
+TEST_F(PgSqlConfigBackendDHCPv4Test, optionDef4DeleteForceTest) {
+ optionDef4DeleteForceTest();
+}
+
/// @brief Test fixture for verifying database connection loss-recovery
/// behavior.
class PgSqlConfigBackendDHCPv4DbLostCallbackTest : public GenericConfigBackendDbLostCallbackTest {
pdPoolOption6WithClientClassesTest();
}
+TEST_F(PgSqlConfigBackendDHCPv6Test, optionDef6DeleteForceTest) {
+ optionDef6DeleteForceTest();
+}
+
/// @brief Test fixture for verifying database connection loss-recovery
/// behavior.
class PgSqlConfigBackendDHCPv6DbLostCallbackTest : public GenericConfigBackendDbLostCallbackTest {
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);
+}
/// 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_;
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);
+}
/// 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_;
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);
}
}
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);
+
}
}