From: Mukund Sivaraman Date: Thu, 29 Nov 2012 22:41:14 +0000 (+0530) Subject: [2497] Add rdata::createRdata() and tests for some RRtypes X-Git-Tag: bind10-1.0.0-beta-release~74 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=022d3888199e59b7a4bc256eaaf188a64db61cdf;p=thirdparty%2Fkea.git [2497] Add rdata::createRdata() and tests for some RRtypes --- diff --git a/src/lib/dns/rdata.cc b/src/lib/dns/rdata.cc index c7eaa13ed5..06472b0b30 100644 --- a/src/lib/dns/rdata.cc +++ b/src/lib/dns/rdata.cc @@ -65,7 +65,7 @@ createRdata(const RRType& rrtype, const RRClass& rrclass, RdataPtr rdata = RRParamRegistry::getRegistry().createRdata(rrtype, rrclass, buffer, len); - + if (buffer.getPosition() - old_pos != len) { isc_throw(InvalidRdataLength, "RDLENGTH mismatch: " << buffer.getPosition() - old_pos << " != " << len); @@ -81,6 +81,17 @@ createRdata(const RRType& rrtype, const RRClass& rrclass, const Rdata& source) source)); } +RdataPtr +createRdata(const RRType& rrtype, const RRClass& rrclass, + MasterLexer& lexer, const Name* origin, + MasterLoader::Options options, + MasterLoaderCallbacks& callbacks) +{ + return (RRParamRegistry::getRegistry().createRdata(rrtype, rrclass, + lexer, origin, + options, callbacks)); +} + int compareNames(const Name& n1, const Name& n2) { size_t len1 = n1.getLength(); @@ -119,7 +130,8 @@ Generic::Generic(isc::util::InputBuffer& buffer, size_t rdata_len) { impl_ = new GenericImpl(data); } -Generic::Generic(const std::string& rdata_string) { +void +Generic::constructHelper(const std::string& rdata_string) { istringstream iss(rdata_string); string unknown_mark; iss >> unknown_mark; @@ -180,6 +192,32 @@ Generic::Generic(const std::string& rdata_string) { impl_ = new GenericImpl(data); } +Generic::Generic(const std::string& rdata_string) { + constructHelper(rdata_string); +} + +Generic::Generic(MasterLexer& lexer, const Name*, + MasterLoader::Options, + MasterLoaderCallbacks&) +{ + std::string s; + + while (true) { + const MasterLexer::Token& token = lexer.getNextToken(); + if (token.getType() == MasterLexer::Token::END_OF_FILE) { + break; + } + + if (!s.empty()) { + s += " "; + } + + s += token.getString(); + } + + constructHelper(s); +} + Generic::~Generic() { delete impl_; } diff --git a/src/lib/dns/rdata.h b/src/lib/dns/rdata.h index f77ea6efb1..e7811c9510 100644 --- a/src/lib/dns/rdata.h +++ b/src/lib/dns/rdata.h @@ -15,11 +15,15 @@ #ifndef RDATA_H #define RDATA_H 1 -#include +#include +#include +#include + +#include #include -#include +#include namespace isc { namespace util { @@ -279,6 +283,11 @@ public: /// \param rdata_len The length in buffer of the \c Rdata. In bytes. Generic(isc::util::InputBuffer& buffer, size_t rdata_len); + /// \brief Constructor from master lexer. + /// + Generic(MasterLexer& lexer, const Name* name, + MasterLoader::Options options, MasterLoaderCallbacks& callbacks); + /// /// \brief The destructor. virtual ~Generic(); @@ -367,7 +376,10 @@ public: /// \return > 0 if \c this would be sorted after \c other. virtual int compare(const Rdata& other) const; //@} + private: + void constructHelper(const std::string& rdata_string); + GenericImpl* impl_; }; @@ -472,6 +484,14 @@ RdataPtr createRdata(const RRType& rrtype, const RRClass& rrclass, /// \c Rdata object. RdataPtr createRdata(const RRType& rrtype, const RRClass& rrclass, const Rdata& source); + +/// \brief Create RDATA of a given pair of RR type and class from the +/// master lexer. +RdataPtr createRdata(const RRType& rrtype, const RRClass& rrclass, + MasterLexer& lexer, const Name* origin, + MasterLoader::Options options, + MasterLoaderCallbacks& callbacks); + //@} /// @@ -511,6 +531,6 @@ int compareNames(const Name& n1, const Name& n2); } #endif // RDATA_H -// Local Variables: +// Local Variables: // mode: c++ -// End: +// End: diff --git a/src/lib/dns/rrparamregistry-placeholder.cc b/src/lib/dns/rrparamregistry-placeholder.cc index 9f812b4e7f..fa3cbc92c3 100644 --- a/src/lib/dns/rrparamregistry-placeholder.cc +++ b/src/lib/dns/rrparamregistry-placeholder.cc @@ -571,5 +571,26 @@ RRParamRegistry::createRdata(const RRType& rrtype, const RRClass& rrclass, return (RdataPtr(new rdata::generic::Generic( dynamic_cast(source)))); } + +RdataPtr +RRParamRegistry::createRdata(const RRType& rrtype, const RRClass& rrclass, + MasterLexer& lexer, const Name* name, + MasterLoader::Options options, + MasterLoaderCallbacks& callbacks) +{ + RdataFactoryMap::const_iterator found = + impl_->rdata_factories.find(RRTypeClass(rrtype, rrclass)); + if (found != impl_->rdata_factories.end()) { + return (found->second->create(lexer, name, options, callbacks)); + } + + GenericRdataFactoryMap::const_iterator genfound = + impl_->genericrdata_factories.find(rrtype); + if (genfound != impl_->genericrdata_factories.end()) { + return (genfound->second->create(lexer, name, options, callbacks)); + } + + return (RdataPtr(new generic::Generic(lexer, name, options, callbacks))); +} } } diff --git a/src/lib/dns/rrparamregistry.h b/src/lib/dns/rrparamregistry.h index 4a4e011aaa..e156dc95b2 100644 --- a/src/lib/dns/rrparamregistry.h +++ b/src/lib/dns/rrparamregistry.h @@ -24,9 +24,6 @@ #include #include -#include -#include -#include namespace isc { namespace dns { @@ -506,6 +503,12 @@ public: /// \c rdata::Rdata object. rdata::RdataPtr createRdata(const RRType& rrtype, const RRClass& rrclass, const rdata::Rdata& source); + + /// \brief Create RDATA from MasterLexer + rdata::RdataPtr createRdata(const RRType& rrtype, const RRClass& rrclass, + MasterLexer& lexer, const Name* name, + MasterLoader::Options options, + MasterLoaderCallbacks& callbacks); //@} private: @@ -516,6 +519,6 @@ private: } #endif // RRPARAMREGISTRY_H -// Local Variables: +// Local Variables: // mode: c++ -// End: +// End: diff --git a/src/lib/dns/tests/rdata_cname_unittest.cc b/src/lib/dns/tests/rdata_cname_unittest.cc index 2cce9bc849..6451f72948 100644 --- a/src/lib/dns/tests/rdata_cname_unittest.cc +++ b/src/lib/dns/tests/rdata_cname_unittest.cc @@ -87,6 +87,12 @@ TEST_F(Rdata_CNAME_Test, createFromWire) { InvalidRdataLength); } +TEST_F(Rdata_CNAME_Test, createFromLexer) { + EXPECT_EQ(0, rdata_cname.compare( + *test::createRdataUsingLexer(RRType::CNAME(), RRClass::IN(), + "cn.example.com"))); +} + TEST_F(Rdata_CNAME_Test, toWireBuffer) { rdata_cname.toWire(obuffer); EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, diff --git a/src/lib/dns/tests/rdata_dname_unittest.cc b/src/lib/dns/tests/rdata_dname_unittest.cc index eb221d8463..c4e517c555 100644 --- a/src/lib/dns/tests/rdata_dname_unittest.cc +++ b/src/lib/dns/tests/rdata_dname_unittest.cc @@ -89,6 +89,12 @@ TEST_F(Rdata_DNAME_Test, createFromWire) { InvalidRdataLength); } +TEST_F(Rdata_DNAME_Test, createFromLexer) { + EXPECT_EQ(0, rdata_dname.compare( + *test::createRdataUsingLexer(RRType::DNAME(), RRClass::IN(), + "dn.example.com"))); +} + TEST_F(Rdata_DNAME_Test, toWireBuffer) { rdata_dname.toWire(obuffer); EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, diff --git a/src/lib/dns/tests/rdata_in_a_unittest.cc b/src/lib/dns/tests/rdata_in_a_unittest.cc index 2fea9a359c..7ab342304c 100644 --- a/src/lib/dns/tests/rdata_in_a_unittest.cc +++ b/src/lib/dns/tests/rdata_in_a_unittest.cc @@ -68,6 +68,11 @@ TEST_F(Rdata_IN_A_Test, createFromWire) { DNSMessageFORMERR); } +TEST_F(Rdata_IN_A_Test, createFromLexer) { + EXPECT_EQ(0, rdata_in_a.compare( + *test::createRdataUsingLexer(RRType::A(), RRClass::IN(), "192.0.2.1"))); +} + TEST_F(Rdata_IN_A_Test, toWireBuffer) { rdata_in_a.toWire(obuffer); EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, diff --git a/src/lib/dns/tests/rdata_in_aaaa_unittest.cc b/src/lib/dns/tests/rdata_in_aaaa_unittest.cc index d8ed1d6e0d..74a3e3f8ef 100644 --- a/src/lib/dns/tests/rdata_in_aaaa_unittest.cc +++ b/src/lib/dns/tests/rdata_in_aaaa_unittest.cc @@ -66,6 +66,12 @@ TEST_F(Rdata_IN_AAAA_Test, createFromWire) { DNSMessageFORMERR); } +TEST_F(Rdata_IN_AAAA_Test, createFromLexer) { + EXPECT_EQ(0, rdata_in_aaaa.compare( + *test::createRdataUsingLexer(RRType::AAAA(), RRClass::IN(), + "2001:db8::1234"))); +} + TEST_F(Rdata_IN_AAAA_Test, toWireBuffer) { rdata_in_aaaa.toWire(obuffer); EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, diff --git a/src/lib/dns/tests/rdata_mx_unittest.cc b/src/lib/dns/tests/rdata_mx_unittest.cc index 7dc774d770..4747138eae 100644 --- a/src/lib/dns/tests/rdata_mx_unittest.cc +++ b/src/lib/dns/tests/rdata_mx_unittest.cc @@ -62,6 +62,17 @@ TEST_F(Rdata_MX_Test, createFromWire) { // TBD: more tests } +TEST_F(Rdata_MX_Test, createFromLexer) { + EXPECT_EQ(0, rdata_mx.compare( + *test::createRdataUsingLexer(RRType::MX(), RRClass::IN(), + "10 mx.example.com"))); + + EXPECT_THROW({ + test::createRdataUsingLexer(RRType::MX(), RRClass::IN(), + "10 mx. example.com"); + }, InvalidRdataText); +} + TEST_F(Rdata_MX_Test, toWireRenderer) { renderer.writeName(Name("example.com")); rdata_mx.toWire(renderer); diff --git a/src/lib/dns/tests/rdata_ns_unittest.cc b/src/lib/dns/tests/rdata_ns_unittest.cc index 47582ce00f..569e43135c 100644 --- a/src/lib/dns/tests/rdata_ns_unittest.cc +++ b/src/lib/dns/tests/rdata_ns_unittest.cc @@ -86,6 +86,17 @@ TEST_F(Rdata_NS_Test, createFromWire) { InvalidRdataLength); } +TEST_F(Rdata_NS_Test, createFromLexer) { + EXPECT_EQ(0, rdata_ns.compare( + *test::createRdataUsingLexer(RRType::NS(), RRClass::IN(), + "ns.example.com"))); + + EXPECT_THROW({ + test::createRdataUsingLexer(RRType::NS(), RRClass::IN(), + ""); + }, IncompleteName); +} + TEST_F(Rdata_NS_Test, toWireBuffer) { rdata_ns.toWire(obuffer); EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, diff --git a/src/lib/dns/tests/rdata_sshfp_unittest.cc b/src/lib/dns/tests/rdata_sshfp_unittest.cc index dccd8b1290..6c13ad98b7 100644 --- a/src/lib/dns/tests/rdata_sshfp_unittest.cc +++ b/src/lib/dns/tests/rdata_sshfp_unittest.cc @@ -68,6 +68,12 @@ TEST_F(Rdata_SSHFP_Test, createFromText) { EXPECT_EQ(0, rdata_sshfp4.compare(rdata_sshfp)); } +TEST_F(Rdata_SSHFP_Test, createFromLexer) { + EXPECT_EQ(0, rdata_sshfp.compare( + *test::createRdataUsingLexer(RRType::SSHFP(), RRClass::IN(), + "2 1 123456789abcdef67890123456789abcdef67890"))); +} + TEST_F(Rdata_SSHFP_Test, algorithmTypes) { // Some of these may not be RFC conformant, but we relax the check // in our code to work with algorithm and fingerprint types that may diff --git a/src/lib/dns/tests/rdata_unittest.cc b/src/lib/dns/tests/rdata_unittest.cc index bf1f5f792f..c80fdd0a04 100644 --- a/src/lib/dns/tests/rdata_unittest.cc +++ b/src/lib/dns/tests/rdata_unittest.cc @@ -28,6 +28,8 @@ #include #include +#include + using isc::UnitTestUtil; using namespace std; using namespace isc::dns; @@ -54,6 +56,31 @@ RdataTest::rdataFactoryFromFile(const RRType& rrtype, const RRClass& rrclass, uint16_t rdlen = buffer.readUint16(); return (createRdata(rrtype, rrclass, buffer, rdlen)); } + +namespace test { + +void dummyCallback(const string&, size_t, const string&) { +} + +RdataPtr +createRdataUsingLexer(const RRType& rrtype, const RRClass& rrclass, + const std::string& str) +{ + std::stringstream ss(str); + MasterLexer lexer; + lexer.pushSource(ss); + + const MasterLoaderCallbacks::IssueCallback callback + (boost::bind(&dummyCallback, _1, _2, _3)); + MasterLoaderCallbacks callbacks(callback, callback); + Name origin("example.org."); + + return (createRdata(rrtype, rrclass, lexer, &origin, + MasterLoader::MANY_ERRORS, callbacks)); +} + +} // end of namespace isc::dns::rdata::test + } } } diff --git a/src/lib/dns/tests/rdata_unittest.h b/src/lib/dns/tests/rdata_unittest.h index f59360910d..3efb5d8346 100644 --- a/src/lib/dns/tests/rdata_unittest.h +++ b/src/lib/dns/tests/rdata_unittest.h @@ -41,11 +41,18 @@ protected: /// used to test the compare() method against a well-known RR type. RdataPtr rdata_nomatch; }; + +namespace test { +RdataPtr +createRdataUsingLexer(const RRType& rrtype, const RRClass& rrclass, + const std::string& str); +} + } } } #endif // RDATA_UNITTEST_H -// Local Variables: +// Local Variables: // mode: c++ -// End: +// End: