From: Michal 'vorner' Vaner Date: Mon, 3 Dec 2012 13:43:07 +0000 (+0100) Subject: [2377] Test error detection X-Git-Tag: bind10-1.0.0-beta-release~24^2~52 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0f6b84e5523df12f5017ef7615bd0bb25359cc5f;p=thirdparty%2Fkea.git [2377] Test error detection Generate several broken input and see all of them fail. Also check they continue to parse or not according to parameters. --- diff --git a/src/lib/dns/tests/master_loader_unittest.cc b/src/lib/dns/tests/master_loader_unittest.cc index 6df6ba2bbc..e99cd243fe 100644 --- a/src/lib/dns/tests/master_loader_unittest.cc +++ b/src/lib/dns/tests/master_loader_unittest.cc @@ -26,11 +26,14 @@ #include #include #include +#include using namespace isc::dns; using std::vector; using std::string; using std::list; +using std::ofstream; +using std::endl; class MasterLoaderTest : public ::testing::Test { public: @@ -74,6 +77,23 @@ public: options)); } + void prepareBrokenZone(const string& filename, const string& line) { + ofstream out(filename.c_str(), + std::ios_base::out | std::ios_base::trunc); + ASSERT_FALSE(out.fail()); + out << "example.org. 3600 IN SOA ns1.example.org.filename " + "admin.example.org.filename 1234 3600 1800 2419200 7200" << endl; + out << line << endl; + out << "correct 3600 IN A 192.0.2.2" << endl; + out.close(); + } + + void clear() { + warnings_.clear(); + errors_.clear(); + rrsets_.clear(); + } + // Check the next RR in the ones produced by the loader // Other than passed arguments are checked to be the default for the tests void checkRR(const string& name, const RRType& type, const string& data) { @@ -155,3 +175,57 @@ TEST_F(MasterLoaderTest, invalidFile) { EXPECT_EQ(0, errors_[0].find("Error opening the input source file: ")) << "Different error: " << errors_[0]; } + +struct ErrorCase { + const char* line; + const char* problem; +} error_cases[] = { + { "www... 3600 IN A 192.0.2.1", "Invalid name" }, + { "www FORTNIGHT IN A 192.0.2.1", "Invalid TTL" }, + { "www 3600 XX A 192.0.2.1", "Invalid class" }, + { "www 3600 IN A bad_ip", "Invalid Rdata" }, + { "www 3600 IN", "Unexpected EOLN" }, + { "www 3600 CH TXT nothing", "Class mismatch" }, + { NULL, NULL } +}; + +// Test a broken zone is handled properly. We test several problems, +// both in strict and lenient mode. +TEST_F(MasterLoaderTest, brokenZone) { + const string filename(TEST_DATA_BUILDDIR "/broken.zone"); + for (const ErrorCase* ec = error_cases; ec->line != NULL; ++ec) { + SCOPED_TRACE(ec->problem); + prepareBrokenZone(filename, ec->line); + + { + SCOPED_TRACE("Strict mode"); + clear(); + setLoader(filename.c_str(), Name("example.org."), RRClass::IN(), + MasterLoader::DEFAULT); + loader_->load(); + EXPECT_EQ(1, errors_.size()); + EXPECT_TRUE(warnings_.empty()); + + checkRR("example.org", RRType::SOA(), "ns1.example.org. " + "admin.example.org. 1234 3600 1800 2419200 7200"); + // In the strict mode, it is aborted. The last RR is not + // even attempted. + EXPECT_TRUE(rrsets_.empty()); + } + + { + SCOPED_TRACE("Lenient mode"); + clear(); + setLoader(filename.c_str(), Name("example.org."), RRClass::IN(), + MasterLoader::MANY_ERRORS); + loader_->load(); + EXPECT_EQ(1, errors_.size()); + EXPECT_TRUE(warnings_.empty()); + checkRR("example.org", RRType::SOA(), "ns1.example.org. " + "admin.example.org. 1234 3600 1800 2419200 7200"); + // This one is below the error one. + checkRR("correct.example.org", RRType::A(), "192.0.2.2"); + EXPECT_TRUE(rrsets_.empty()); + } + } +}