]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[2212] ported command test's loadBrokenZone test.
authorJINMEI Tatuya <jinmei@isc.org>
Tue, 23 Oct 2012 06:03:02 +0000 (23:03 -0700)
committerJINMEI Tatuya <jinmei@isc.org>
Thu, 25 Oct 2012 22:02:53 +0000 (15:02 -0700)
now catch exceptions from reload().

src/bin/auth/datasrc_clients_mgr.h
src/bin/auth/tests/datasrc_clients_builder_unittest.cc

index 667ec32f40cacf6cc7019058efece84ef80ae4ca..aef7f02a910e3321b100800b5cebd9cf971b3963 100644 (file)
@@ -490,9 +490,16 @@ DataSrcClientsBuilderBase<MutexType, CondVarType>::doLoadZone(
     assert(client_list);
 
     datasrc::ConfigurableClientList::ReloadResult result;
-    {
+    try {
         typename MutexType::Locker locker(*map_mutex_);
         result = client_list->reload(origin);
+    } catch (const isc::Exception& ex) {
+        // We catch our internal exceptions (which will be just ignored) and
+        // propagated others (which should generally be considered fatal and
+        // will make the thread terminate)
+        isc_throw(InternalCommandError, "failed to load a zone " << origin <<
+                  "/" << rrclass << ": error occurred in reload: " <<
+                  ex.what());
     }
     switch (result) {
     case datasrc::ConfigurableClientList::ZONE_RELOADED:
index 27918b622e0e535659ffa3ab396107f865eae402..df1ca8cae1a499f906b35623793d66d84be04f79 100644 (file)
@@ -372,4 +372,20 @@ TEST_F(DataSrcClientsBuilderTest,
               find(Name("example.org"), RRType::SOA())->code);
 }
 
+TEST_F(DataSrcClientsBuilderTest, loadBrokenZone) {
+    configureZones();
+
+    ASSERT_EQ(0, std::system(INSTALL_PROG " -c " TEST_DATA_DIR
+                             "/test1-broken.zone.in "
+                             TEST_DATA_BUILDDIR "/test1.zone.copied"));
+    // there's an error in the new zone file.  reload will be rejected.
+    const Command loadzone_cmd(LOADZONE, isc::data::Element::fromJSON(
+                                   "{\"class\": \"IN\","
+                                   " \"origin\": \"test1.example\"}"));
+    EXPECT_THROW(builder.handleCommand(loadzone_cmd),
+                 TestDataSrcClientsBuilder::InternalCommandError);
+    zoneChecks(clients_map, rrclass);     // zone shouldn't be replaced
+}
+
+
 } // unnamed namespace