From: JINMEI Tatuya Date: Sat, 12 Jan 2013 04:44:04 +0000 (-0800) Subject: [2573] implemented loader getSize and getPosition X-Git-Tag: bind10-1.1.0beta1-release~72^2~41^2~9 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=579f5abd033f56e772c6ee0286c58634d12aabfe;p=thirdparty%2Fkea.git [2573] implemented loader getSize and getPosition --- diff --git a/src/lib/dns/master_loader.cc b/src/lib/dns/master_loader.cc index bf093ef000..b5bf1f036a 100644 --- a/src/lib/dns/master_loader.cc +++ b/src/lib/dns/master_loader.cc @@ -104,6 +104,9 @@ public: bool loadIncremental(size_t count_limit); + size_t getSize() const { return (lexer_.getTotalSourceSize()); } + size_t getPosition() const { return (lexer_.getPosition()); } + private: void reportError(const std::string& filename, size_t line, const std::string& reason) @@ -639,5 +642,15 @@ MasterLoader::getRRCount() const { return (impl_->rr_count_); } +size_t +MasterLoader::getSize() const { + return (impl_->getSize()); +} + +size_t +MasterLoader::getPosition() const { + return (impl_->getPosition()); +} + } // end namespace dns } // end namespace isc diff --git a/src/lib/dns/tests/master_loader_unittest.cc b/src/lib/dns/tests/master_loader_unittest.cc index b3db65060f..0c6202f3eb 100644 --- a/src/lib/dns/tests/master_loader_unittest.cc +++ b/src/lib/dns/tests/master_loader_unittest.cc @@ -153,13 +153,24 @@ TEST_F(MasterLoaderTest, basicLoad) { RRClass::IN(), MasterLoader::MANY_ERRORS); EXPECT_FALSE(loader_->loadedSucessfully()); + + // The following three should be set to 0 initially in case the loader + // is constructed from a file name. EXPECT_EQ(0, loader_->getRRCount()); + EXPECT_EQ(0, loader_->getSize()); + EXPECT_EQ(0, loader_->getPosition()); + loader_->load(); EXPECT_TRUE(loader_->loadedSucessfully()); EXPECT_TRUE(errors_.empty()); EXPECT_TRUE(warnings_.empty()); + + // Hardcode expected values taken from the test data file, assuming it + // won't change too often. EXPECT_EQ(4, loader_->getRRCount()); + EXPECT_EQ(549, loader_->getSize()); + EXPECT_EQ(549, loader_->getPosition()); checkBasicRRs(); } @@ -197,6 +208,47 @@ TEST_F(MasterLoaderTest, include) { } } +TEST_F(MasterLoaderTest, includeAndIncremental) { + // Check getSize() and getPosition() are adjusted before and after + // $INCLUDE. + const string first_rr = "before.example.org. 0 A 192.0.2.1\n"; + const string include_str = "$INCLUDE " TEST_DATA_SRCDIR "/example.org"; + const string zone_data = first_rr + include_str + "\n" + + "www 3600 IN AAAA 2001:db8::1\n"; + stringstream ss(zone_data); + setLoader(ss, Name("example.org."), RRClass::IN(), MasterLoader::DEFAULT); + + // On construction, getSize() returns the size of the data (exclude the + // the file to be included); position is set to 0. + EXPECT_EQ(zone_data.size(), loader_->getSize()); + EXPECT_EQ(0, loader_->getPosition()); + + // Read the first RR. getSize() doesn't change; position should be + // at the end of the first line. + loader_->loadIncremental(1); + EXPECT_EQ(zone_data.size(), loader_->getSize()); + EXPECT_EQ(first_rr.size(), loader_->getPosition()); + + // Read next 4. It includes $INCLUDE processing. Magic number of 549 + // is the size of the test zone file (see above); 506 is the position in + // the file at the end of 4th RR (due to extra comments it's smaller than + // the file size). + loader_->loadIncremental(4); + EXPECT_EQ(zone_data.size() + 549, loader_->getSize()); + EXPECT_EQ(first_rr.size() + include_str.size() + 506, + loader_->getPosition()); + + // Read the last one. At this point getSize and getPosition return + // the same value, indicating progress of 100%. + loader_->loadIncremental(1); + EXPECT_EQ(zone_data.size() + 549, loader_->getSize()); + EXPECT_EQ(zone_data.size() + 549, loader_->getPosition()); + + // we were not interested in checking RRs in this test. clear them to + // not confuse TearDown(). + rrsets_.clear(); +} + // A commonly used helper to check callback message. void checkCallbackMessage(const string& actual_msg, const string& expected_msg, @@ -280,11 +332,20 @@ TEST_F(MasterLoaderTest, popAfterError) { // Check it works the same when created based on a stream, not filename TEST_F(MasterLoaderTest, streamConstructor) { - stringstream zone_stream(prepareZone("", true)); + const string zone_data(prepareZone("", true)); + stringstream zone_stream(zone_data); setLoader(zone_stream, Name("example.org."), RRClass::IN(), MasterLoader::MANY_ERRORS); EXPECT_FALSE(loader_->loadedSucessfully()); + + // Unlike the basicLoad test, if we construct the loader from a stream + // getSize() returns the data size in the stream immediately after the + // construction. + EXPECT_EQ(0, loader_->getRRCount()); + EXPECT_EQ(zone_data.size(), loader_->getSize()); + EXPECT_EQ(0, loader_->getPosition()); + loader_->load(); EXPECT_TRUE(loader_->loadedSucessfully()); @@ -293,6 +354,13 @@ TEST_F(MasterLoaderTest, streamConstructor) { checkRR("example.org", RRType::SOA(), "ns1.example.org. " "admin.example.org. 1234 3600 1800 2419200 7200"); checkRR("correct.example.org", RRType::A(), "192.0.2.2"); + + // On completion of the load, both getSize() and getPosition() return the + // size of the data, and getRRCount() returns the number of loaded RRs, + // which is 2 in this case. + EXPECT_EQ(2, loader_->getRRCount()); + EXPECT_EQ(zone_data.size(), loader_->getSize()); + EXPECT_EQ(zone_data.size(), loader_->getPosition()); } // Try loading data incrementally. @@ -300,8 +368,10 @@ TEST_F(MasterLoaderTest, incrementalLoad) { setLoader(TEST_DATA_SRCDIR "/example.org", Name("example.org."), RRClass::IN(), MasterLoader::MANY_ERRORS); + EXPECT_EQ(0, loader_->getRRCount()); // initial count should be 2 EXPECT_FALSE(loader_->loadedSucessfully()); EXPECT_FALSE(loader_->loadIncremental(2)); + EXPECT_EQ(2, loader_->getRRCount()); // number of loaded RR so far EXPECT_FALSE(loader_->loadedSucessfully()); EXPECT_TRUE(errors_.empty()); @@ -324,6 +394,8 @@ TEST_F(MasterLoaderTest, incrementalLoad) { checkRR("www.example.org", RRType::A(), "192.0.2.1"); checkRR("www.example.org", RRType::AAAA(), "2001:db8::1"); + + EXPECT_EQ(4, loader_->getRRCount()); // on completion it's # of zone's RRs. } // Try loading from file that doesn't exist. There should be single error