CfgOption::merge(CfgOption& other) const {
// Merge non-vendor options.
mergeInternal(options_, other.options_);
+ // Merge vendor options.
mergeInternal(vendor_options_, other.vendor_options_);
- // Merge verndor options.
+}
+
+void
+CfgOption::copy(CfgOption& other) const {
+ // Create empty object and "merge" data to it.
+ CfgOption new_cfg;
+ merge(new_cfg);
+ other = new_cfg;
}
template <typename Selector>
/// @param [out] other Configuration object to merge to.
void merge(CfgOption& other) const;
+ /// @brief Copies this configuration to another configuration.
+ ///
+ /// This method copies options configuration to another object.
+ ///
+ /// @param [out] other An object to copy the configuration to.
+ void copy(CfgOption& other) const;
+
/// @brief Returns all options for the specified option space.
///
/// This method will not return vendor options, i.e. having option space
}
}
+// This test verifies that the options configuration can be copied between
+// objects.
+TEST(CfgOptionTest, copy) {
+ CfgOption cfg_src;
+ // Add 10 options to the custom option space in the source configuration.
+ for (uint16_t code = 100; code < 110; ++code) {
+ OptionPtr option(new Option(Option::V6, code, OptionBuffer(1, 0x01)));
+ ASSERT_NO_THROW(cfg_src.add(option, false, "foo"));
+ }
+
+ CfgOption cfg_dst;
+ // Add 20 options to the custom option space in destination configuration.
+ for (uint16_t code = 100; code < 120; ++code) {
+ OptionPtr option(new Option(Option::V6, code, OptionBuffer(1, 0xFF)));
+ ASSERT_NO_THROW(cfg_dst.add(option, false, "isc"));
+ }
+
+ // Copy entire configuration to the destination. This should override any
+ // existing data.
+ ASSERT_NO_THROW(cfg_src.copy(cfg_dst));
+
+ // Validate options in the destination configuration.
+ for (uint16_t code = 100; code < 110; ++code) {
+ OptionDescriptor desc = cfg_dst.get("foo", code);
+ ASSERT_TRUE(desc.option);
+ ASSERT_EQ(1, desc.option->getData().size());
+ EXPECT_EQ(0x01, desc.option->getData()[0]);
+ }
+
+ // Any existing options should be removed.
+ OptionContainerPtr container = cfg_dst.getAll("isc");
+ ASSERT_TRUE(container);
+ EXPECT_TRUE(container->empty());
+
+ // The option space "foo" should contain exactly 10 options.
+ container = cfg_dst.getAll("foo");
+ ASSERT_TRUE(container);
+ EXPECT_EQ(10, container->size());
+}
+
// This test verifies that single option can be retrieved from the configuration
// using option code and option space.
TEST(CfgOption, get) {