From: Michal 'vorner' Vaner Date: Tue, 27 Nov 2012 13:36:47 +0000 (+0100) Subject: [2378] Tests for the loading from file X-Git-Tag: bind10-1.0.0-beta-release~28^2~2^2~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=235a1870910da0a8b567bf47c5fc8467d4bcb102;p=thirdparty%2Fkea.git [2378] Tests for the loading from file They are similar to the ones for copy mode. Should they be unified in some way? --- diff --git a/src/lib/datasrc/tests/zone_loader_unittest.cc b/src/lib/datasrc/tests/zone_loader_unittest.cc index 141fe761c0..39108943d4 100644 --- a/src/lib/datasrc/tests/zone_loader_unittest.cc +++ b/src/lib/datasrc/tests/zone_loader_unittest.cc @@ -242,4 +242,110 @@ TEST_F(ZoneLoaderTest, copyMissingSource) { source_client_), DataSourceError); } +// Load an unsigned zone, all at once +TEST_F(ZoneLoaderTest, loadUnsigned) { + ZoneLoader loader(destination_client_, Name::ROOT_NAME(), + TEST_DATA_DIR "root.zone"); + // It gets the updater directly in the constructor + ASSERT_EQ(1, destination_client_.provided_updaters_.size()); + EXPECT_EQ(Name::ROOT_NAME(), destination_client_.provided_updaters_[0]); + // Now load the whole zone + loader.load(); + EXPECT_TRUE(destination_client_.commit_called_); + // We don't check the whole zone. We check the first and last and the + // count, which should be enough. + + // The count is 34 because we expect the RRs to be separated. + EXPECT_EQ(34, destination_client_.rrsets_.size()); + // Ensure known order. + std::sort(destination_client_.rrsets_.begin(), + destination_client_.rrsets_.end()); + EXPECT_EQ(". 518400 IN NS a.root-servers.net.\n", + destination_client_.rrsets_.front()); + EXPECT_EQ("m.root-servers.net. 3600000 IN AAAA 2001:dc3::35\n", + destination_client_.rrsets_.back()); + + // It isn't possible to try again now + EXPECT_THROW(loader.load(), isc::InvalidOperation); + EXPECT_THROW(loader.loadIncremental(1), isc::InvalidOperation); + // Even 0, which should load nothing, returns the error + EXPECT_THROW(loader.loadIncremental(0), isc::InvalidOperation); +} + +// Try loading from master file incrementally. +TEST_F(ZoneLoaderTest, loadUnsignedIncremental) { + ZoneLoader loader(destination_client_, Name::ROOT_NAME(), + TEST_DATA_DIR "/root.zone"); + + // Try loading few RRs first. + loader.loadIncremental(10); + // We should get the 10 we asked for + EXPECT_EQ(10, destination_client_.rrsets_.size()); + // Not committed yet, we didn't complete the loading + EXPECT_FALSE(destination_client_.commit_called_); + + // This is unusual, but allowed. Check it doesn't do anything + loader.loadIncremental(0); + EXPECT_EQ(10, destination_client_.rrsets_.size()); + EXPECT_FALSE(destination_client_.commit_called_); + + // We can finish the rest + loader.loadIncremental(30); + EXPECT_EQ(34, destination_client_.rrsets_.size()); + EXPECT_TRUE(destination_client_.commit_called_); + + // No more loading now + EXPECT_THROW(loader.load(), isc::InvalidOperation); + EXPECT_THROW(loader.loadIncremental(1), isc::InvalidOperation); + EXPECT_THROW(loader.loadIncremental(0), isc::InvalidOperation); +} + +// If the destination zone does not exist, it throws +TEST_F(ZoneLoaderTest, loadMissingDestination) { + destination_client_.missing_zone_ = true; + EXPECT_THROW(ZoneLoader(destination_client_, Name::ROOT_NAME(), + TEST_DATA_DIR "/root.zone"), DataSourceError); +} + +// Check we can load RRSIGs and NSEC3 (which could break due to them being +// in separate namespace) +TEST_F(ZoneLoaderTest, loadSigned) { + ZoneLoader loader(destination_client_, Name("example.org"), + TEST_DATA_DIR "/example.org.nsec3-signed"); + loader.load(); + + // All the RRs are there, including the ones in NSEC3 namespace + EXPECT_EQ(14, destination_client_.rrsets_.size()); + EXPECT_TRUE(destination_client_.commit_called_); + // Same trick with sorting to know where they are + std::sort(destination_client_.rrsets_.begin(), + destination_client_.rrsets_.end()); + // Due to the R at the beginning, this one should be last + EXPECT_EQ("09GM5T42SMIMT7R8DF6RTG80SFMS1NLU.example.org. 1200 IN NSEC3 " + "1 0 10 AABBCCDD RKOF8QMFRB5F2V9EJHFBVB2JPVSA0DJD A RRSIG\n", + destination_client_.rrsets_[0]); + EXPECT_EQ("09GM5T42SMIMT7R8DF6RTG80SFMS1NLU.example.org. 1200 IN RRSIG " + "NSEC3 7 3 1200 20120301040838 20120131040838 19562 example.org." + " EdwMeepLf//lV+KpCAN+213Scv1rrZyj4i2OwoCP4XxxS3CWGSuvYuKOyfZc8w" + "KRcrD/4YG6nZVXE0s5O8NahjBJmDIyVt4WkfZ6QthxGg8ggLVvcD3dFksPyiKHf" + "/WrTOZPSsxvN5m/i1Ey6+YWS01Gf3WDCMWDauC7Nmh3CTM=\n", + destination_client_.rrsets_[1]); +} + +// Test it throws when there's no such file +TEST_F(ZoneLoaderTest, loadNoSuchFile) { + EXPECT_THROW(ZoneLoader(destination_client_, Name::ROOT_NAME(), + "This file does not exist"), MasterFileError); +} + +// And it also throws when there's a syntax error in the master file +TEST_F(ZoneLoaderTest, loadSyntaxError) { + EXPECT_THROW(ZoneLoader(destination_client_, Name::ROOT_NAME(), + // This is not a master file for sure + // (misusing a file that happens to be there + // already). + TEST_DATA_DIR "/example.org.sqlite3"), + MasterFileError); +} + }