]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[1976] Test removal, addition and reconfiguration when not inited
authorMichal 'vorner' Vaner <michal.vaner@nic.cz>
Thu, 21 Jun 2012 10:53:53 +0000 (12:53 +0200)
committerMichal 'vorner' Vaner <michal.vaner@nic.cz>
Thu, 21 Jun 2012 10:53:53 +0000 (12:53 +0200)
src/bin/auth/datasrc_configurator.h
src/bin/auth/tests/datasrc_configurator_unittest.cc

index 76c47a25a16c16e57db554488cca4b956b713486..bd80c783f8aea3edc82de14cce17719cefab4c2c 100644 (file)
@@ -19,6 +19,7 @@
 
 #include <datasrc/client_list.h>
 #include <config/ccsession.h>
+#include <cc/data.h>
 
 /// \brief A class to configure the authoritative server's data source lists
 ///
@@ -110,20 +111,27 @@ public:
     ///     as an update from the config manager.
     /// \throw InvalidOperation if it is called when not initialized.
     static void reconfigure(const isc::data::ConstElementPtr& config) {
-        // TODO: The InvalidOperation thing
+        if (server_ == NULL) {
+            isc_throw(isc::InvalidOperation,
+                      "Can't reconfigure while not inited");
+        }
         typedef std::map<std::string, isc::data::ConstElementPtr> Map;
         const Map& map(config->mapValue());
         for (Map::const_iterator it(map.begin()); it != map.end(); ++ it) {
             isc::dns::RRClass rrclass(it->first);
-            ListPtr list(server_->getClientList(rrclass));
-            bool need_set(false);
-            if (!list) {
-                list.reset(new List);
-                need_set = true;
-            }
-            list->configure(*it->second, true);
-            if (need_set) {
-                server_->setClientList(rrclass, list);
+            if (it->second->getType() == isc::data::Element::null) {
+                server_->setClientList(rrclass, ListPtr());
+            } else {
+                ListPtr list(server_->getClientList(rrclass));
+                bool need_set(false);
+                if (!list) {
+                    list.reset(new List);
+                    need_set = true;
+                }
+                list->configure(*it->second, true);
+                if (need_set) {
+                    server_->setClientList(rrclass, list);
+                }
             }
         }
     }
index d1f03830184d448d59965b4bc8bbc02bb916b99f..55fa1b61fbeedb9a7346a49f64d053099c6a788f 100644 (file)
@@ -61,7 +61,8 @@ public:
         return (lists_[rrclass]);
     }
     void setClientList(const RRClass& rrclass, const ListPtr& list) {
-        log_ += "set " + rrclass.toText() + " " + list->getConf() + "\n";
+        log_ += "set " + rrclass.toText() + " " +
+            (list ? list->getConf() : "") + "\n";
         lists_[rrclass] = list;
     }
 protected:
@@ -123,6 +124,9 @@ TEST_F(DatasrcConfiguratorTest, initialization) {
     // Deinitialize to make the tests reasonable
     Configurator::deinit();
     EXPECT_FALSE(session.haveSubscription("data_sources", "*"));
+    // We can't reconfigure now (not even manually)
+    EXPECT_THROW(Configurator::reconfigure(ElementPtr(new MapElement())),
+                 InvalidOperation);
     // If one of them is NULL, it does not work
     EXPECT_THROW(Configurator::init(NULL, this), InvalidParameter);
     EXPECT_FALSE(session.haveSubscription("data_sources", "*"));
@@ -170,4 +174,42 @@ TEST_F(DatasrcConfiguratorTest, multiple) {
     EXPECT_EQ(2, lists_.size());
 }
 
+// Check we can add another one later and the old one does not get
+// overwritten.
+TEST_F(DatasrcConfiguratorTest, updateAdd) {
+    // TODO: Make sure the communication protocol really works on
+    // the semi-diff principle here, not by sending everything.
+    // (actually, sending everything would work, as per above, two
+    // tests, but this test would be wrong).
+    doInInit();
+    const ElementPtr
+        config(Element::fromJSON("{\"CH\": [{\"type\": \"yyy\"}]}"));
+    session.addMessage(createCommand("config_update", config), "data_sources",
+                       "*");
+    log_ = "";
+    mccs->checkCommand();
+    // This one does not set
+    EXPECT_EQ("get CH\nset CH yyy\n", log_);
+    // But this should contain the yyy configuration
+    EXPECT_EQ("yyy", lists_[RRClass::CH()]->getConf());
+    EXPECT_EQ("xxx", lists_[RRClass::IN()]->getConf());
+    EXPECT_EQ(2, lists_.size());
+}
+
+// We delete a class list in this test.
+TEST_F(DatasrcConfiguratorTest, updateDelete) {
+    // TODO: Make sure the protocol sends the diff and a delete
+    // is done by a null element. Where is a documentation for this?
+    doInInit();
+    const ElementPtr
+        config(Element::fromJSON("{\"IN\": null}"));
+    session.addMessage(createCommand("config_update", config), "data_sources",
+                       "*");
+    log_ = "";
+    mccs->checkCommand();
+    // This one does not set
+    EXPECT_EQ("set IN \n", log_);
+}
+
+
 }