Browse Source

[2212] ported command test's loadBrokenZone test.

now catch exceptions from reload().
JINMEI Tatuya 12 years ago
parent
commit
7ff2ddee91

+ 8 - 1
src/bin/auth/datasrc_clients_mgr.h

@@ -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:

+ 16 - 0
src/bin/auth/tests/datasrc_clients_builder_unittest.cc

@@ -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