From: Marcin Siodelski Date: Mon, 22 Sep 2014 08:46:46 +0000 (+0200) Subject: [3589] Added function to copy the options configuration. X-Git-Tag: trac3162a_base~4^2~10 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b34f147f6fceaa76bd1221c626086ebaec76d5ec;p=thirdparty%2Fkea.git [3589] Added function to copy the options configuration. --- diff --git a/src/lib/dhcpsrv/cfg_option.cc b/src/lib/dhcpsrv/cfg_option.cc index 813bf7773b..caa4a0a5e4 100644 --- a/src/lib/dhcpsrv/cfg_option.cc +++ b/src/lib/dhcpsrv/cfg_option.cc @@ -100,8 +100,16 @@ void 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 diff --git a/src/lib/dhcpsrv/cfg_option.h b/src/lib/dhcpsrv/cfg_option.h index 2fa5dbdaef..e6fb0c54f6 100644 --- a/src/lib/dhcpsrv/cfg_option.h +++ b/src/lib/dhcpsrv/cfg_option.h @@ -261,6 +261,13 @@ public: /// @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 diff --git a/src/lib/dhcpsrv/tests/cfg_option_unittest.cc b/src/lib/dhcpsrv/tests/cfg_option_unittest.cc index 23c69dc468..d1a9e57da7 100644 --- a/src/lib/dhcpsrv/tests/cfg_option_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_option_unittest.cc @@ -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 // using option code and option space. TEST(CfgOption, get) {