From: Jelte Jansen Date: Fri, 23 Nov 2012 16:24:55 +0000 (+0100) Subject: [2377] Initial MasterLoader class and test class X-Git-Tag: bind10-1.0.0-beta-release~24^2~64 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e4ecc70f8d016e19fb3274a8d2e802cb22b76231;p=thirdparty%2Fkea.git [2377] Initial MasterLoader class and test class --- diff --git a/src/lib/dns/Makefile.am b/src/lib/dns/Makefile.am index 9168e6bcaf..70c65e7303 100644 --- a/src/lib/dns/Makefile.am +++ b/src/lib/dns/Makefile.am @@ -98,6 +98,7 @@ libb10_dns___la_SOURCES += labelsequence.h labelsequence.cc libb10_dns___la_SOURCES += masterload.h masterload.cc libb10_dns___la_SOURCES += master_lexer.h master_lexer.cc libb10_dns___la_SOURCES += master_lexer_state.h +libb10_dns___la_SOURCES += master_loader.h master_loader.cc libb10_dns___la_SOURCES += message.h message.cc libb10_dns___la_SOURCES += messagerenderer.h messagerenderer.cc libb10_dns___la_SOURCES += name.h name.cc diff --git a/src/lib/dns/master_loader.cc b/src/lib/dns/master_loader.cc new file mode 100644 index 0000000000..583823852d --- /dev/null +++ b/src/lib/dns/master_loader.cc @@ -0,0 +1,75 @@ +// Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +#include + +namespace isc { +namespace dns { + +class MasterLoader::MasterLoaderImpl { +public: + MasterLoaderImpl(const char* master_file, + const Name& zone_origin, + const RRClass zone_class, + MasterLoaderCallbacks callbacks, + MasterLoader::Options options) : + lexer_(), + zone_origin_(zone_origin), + zone_class_(zone_class), + callbacks_(callbacks), + options_(options) + { + lexer_.pushSource(master_file); + } + + bool loadIncremental(size_t count_limit) { + size_t count = 0; + bool done = false; + do { + // Code goes here + } while (!done && (count_limit != 0 && ++count < count_limit)); + // add remaining rrset that was being built (TODO) + return (false); + } + +private: + MasterLexer lexer_; + const Name& zone_origin_; + const RRClass zone_class_; + MasterLoaderCallbacks callbacks_; + MasterLoader::Options options_; + RRsetPtr current_rrset_; +}; + +MasterLoader::MasterLoader(const char* master_file, + const Name& zone_origin, + const RRClass zone_class, + MasterLoaderCallbacks callbacks, + Options options) +{ + impl_ = new MasterLoaderImpl(master_file, zone_origin, + zone_class, callbacks, options); +} + +MasterLoader::~MasterLoader() { + delete impl_; +} + +bool +MasterLoader::loadIncremental(size_t count_limit) { + return (impl_->loadIncremental(count_limit)); +} + +} // end namespace dns +} // end namespace isc diff --git a/src/lib/dns/master_loader.h b/src/lib/dns/master_loader.h index 5ecdd77eaf..86c4f58301 100644 --- a/src/lib/dns/master_loader.h +++ b/src/lib/dns/master_loader.h @@ -15,20 +15,34 @@ #ifndef MASTER_LOADER_H #define MASTER_LOADER_H +#include +#include +#include +#include + namespace isc { namespace dns { - -// Placeholder introduced by #2497. The real class should be updated in -// #2377. class MasterLoader { public: enum Options { - MANY_ERRORS, // lenient mode - // also eventually some check policies like "check NS name" + MANY_ERRORS, ///< Lenient mode }; + MasterLoader(const char* master_file, + const Name& zone_origin, + const RRClass zone_class, + MasterLoaderCallbacks callbacks, + Options options); + ~MasterLoader(); + + bool loadIncremental(size_t count_limit); + //void load(); + +private: + class MasterLoaderImpl; + MasterLoaderImpl* impl_; }; -} -} +} // end namespace dns +} // end namespace isc #endif // MASTER_LOADER_H diff --git a/src/lib/dns/tests/Makefile.am b/src/lib/dns/tests/Makefile.am index 12f8f2fef4..fa166fe04b 100644 --- a/src/lib/dns/tests/Makefile.am +++ b/src/lib/dns/tests/Makefile.am @@ -27,6 +27,7 @@ run_unittests_SOURCES += labelsequence_unittest.cc run_unittests_SOURCES += messagerenderer_unittest.cc run_unittests_SOURCES += master_lexer_token_unittest.cc run_unittests_SOURCES += master_lexer_unittest.cc +run_unittests_SOURCES += master_loader_unittest.cc run_unittests_SOURCES += master_lexer_state_unittest.cc run_unittests_SOURCES += name_unittest.cc run_unittests_SOURCES += nsec3hash_unittest.cc diff --git a/src/lib/dns/tests/master_loader_unittest.cc b/src/lib/dns/tests/master_loader_unittest.cc new file mode 100644 index 0000000000..f9fe1f284b --- /dev/null +++ b/src/lib/dns/tests/master_loader_unittest.cc @@ -0,0 +1,68 @@ +// Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +#include +#include + + +#include +#include +#include + +using namespace isc::dns; + +class MasterLoaderTest : public ::testing::Test { +public: + MasterLoaderTest() : + callbacks_(boost::bind(&MasterLoaderTest::callback, this, + true, _1, _2, _3), + boost::bind(&MasterLoaderTest::callback, this, + false, _1, _2, _3)) + {} + + /// Concatenate file, line, and reason, and add it to either errors + /// or warnings + void + callback(bool error, const std::string& file, size_t line, + const std::string reason) + { + std::stringstream ss; + ss << file << line << reason; + if (error) { + errors.push_back(ss.str()); + } else { + warnings.push_back(ss.str()); + } + } + + void + setLoader(const char* file, const Name& origin, const RRClass rrclass, + const MasterLoader::Options options) + { + loader.reset(new MasterLoader(file, origin, rrclass, callbacks_, options)); + } + + MasterLoaderCallbacks callbacks_; + boost::scoped_ptr loader; + std::vector errors; + std::vector warnings; +}; + +TEST_F(MasterLoaderTest, basicLoad) { + setLoader("testdata/loader_test.txt", + Name("example.com."), + RRClass::IN(), + MasterLoader::MANY_ERRORS); + ASSERT_FALSE(loader->loadIncremental(1)); +}