]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[3589] Added function to copy the options configuration.
authorMarcin Siodelski <marcin@isc.org>
Mon, 22 Sep 2014 08:46:46 +0000 (10:46 +0200)
committerMarcin Siodelski <marcin@isc.org>
Tue, 30 Sep 2014 17:32:41 +0000 (19:32 +0200)
src/lib/dhcpsrv/cfg_option.cc
src/lib/dhcpsrv/cfg_option.h
src/lib/dhcpsrv/tests/cfg_option_unittest.cc

index 813bf7773b6cddacd299dc9ab8f8dfb32f6a802c..caa4a0a5e4bb33f6e13c9e7824e5f9ac34c31ed7 100644 (file)
@@ -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 <typename Selector>
index 2fa5dbdaef7ca56b91944db42fa13133a2ed3970..e6fb0c54f63a2bd384924720b58a169fad7536f9 100644 (file)
@@ -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
index 23c69dc468e39672218de6e61a9792ec6540f8d5..d1a9e57da730dfb73dfe62c8a6fe4b8652699238 100644 (file)
@@ -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) {