Commit b34f147f authored by Marcin Siodelski's avatar Marcin Siodelski
Browse files

[3589] Added function to copy the options configuration.

parent ed84b5a5
...@@ -100,8 +100,16 @@ void ...@@ -100,8 +100,16 @@ void
CfgOption::merge(CfgOption& other) const { CfgOption::merge(CfgOption& other) const {
// Merge non-vendor options. // Merge non-vendor options.
mergeInternal(options_, other.options_); mergeInternal(options_, other.options_);
// Merge vendor options.
mergeInternal(vendor_options_, other.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> template <typename Selector>
......
...@@ -261,6 +261,13 @@ public: ...@@ -261,6 +261,13 @@ public:
/// @param [out] other Configuration object to merge to. /// @param [out] other Configuration object to merge to.
void merge(CfgOption& other) const; 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. /// @brief Returns all options for the specified option space.
/// ///
/// This method will not return vendor options, i.e. having option space /// This method will not return vendor options, i.e. having option space
......
...@@ -199,6 +199,46 @@ TEST(CfgOption, merge) { ...@@ -199,6 +199,46 @@ TEST(CfgOption, merge) {
} }
} }
// 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 // This test verifies that single option can be retrieved from the configuration
// using option code and option space. // using option code and option space.
TEST(CfgOption, get) { TEST(CfgOption, get) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment