BIND 10 trac2497, updated. 022d3888199e59b7a4bc256eaaf188a64db61cdf [2497] Add rdata::createRdata() and tests for some RRtypes
BIND 10 source code commits
bind10-changes at lists.isc.org
Thu Nov 29 22:43:45 UTC 2012
The branch, trac2497 has been updated
via 022d3888199e59b7a4bc256eaaf188a64db61cdf (commit)
via aac7b173828dde1f9bfb1807828132b15c58674a (commit)
from 6921ae3d95c08a6f00f38dae2fb7f14622f49440 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 022d3888199e59b7a4bc256eaaf188a64db61cdf
Author: Mukund Sivaraman <muks at isc.org>
Date: Fri Nov 30 04:11:14 2012 +0530
[2497] Add rdata::createRdata() and tests for some RRtypes
commit aac7b173828dde1f9bfb1807828132b15c58674a
Author: Mukund Sivaraman <muks at isc.org>
Date: Thu Nov 29 16:25:52 2012 +0530
[2497] Move create() definition to .cc file
-----------------------------------------------------------------------
Summary of changes:
src/lib/dns/rdata.cc | 42 +++++++++++++++++++++--
src/lib/dns/rdata.h | 28 ++++++++++++---
src/lib/dns/rrparamregistry-placeholder.cc | 49 +++++++++++++++++++++++++++
src/lib/dns/rrparamregistry.h | 33 +++++-------------
src/lib/dns/tests/rdata_cname_unittest.cc | 6 ++++
src/lib/dns/tests/rdata_dname_unittest.cc | 6 ++++
src/lib/dns/tests/rdata_in_a_unittest.cc | 5 +++
src/lib/dns/tests/rdata_in_aaaa_unittest.cc | 6 ++++
src/lib/dns/tests/rdata_mx_unittest.cc | 11 ++++++
src/lib/dns/tests/rdata_ns_unittest.cc | 11 ++++++
src/lib/dns/tests/rdata_sshfp_unittest.cc | 6 ++++
src/lib/dns/tests/rdata_unittest.cc | 27 +++++++++++++++
src/lib/dns/tests/rdata_unittest.h | 11 ++++--
13 files changed, 209 insertions(+), 32 deletions(-)
-----------------------------------------------------------------------
diff --git a/src/lib/dns/rdata.cc b/src/lib/dns/rdata.cc
index c7eaa13..06472b0 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 f77ea6e..e7811c9 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 <stdint.h>
+#include <dns/master_lexer.h>
+#include <dns/master_loader.h>
+#include <dns/master_loader_callbacks.h>
+
+#include <exceptions/exceptions.h>
#include <boost/shared_ptr.hpp>
-#include <exceptions/exceptions.h>
+#include <stdint.h>
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 b242d16..fa3cbc9 100644
--- a/src/lib/dns/rrparamregistry-placeholder.cc
+++ b/src/lib/dns/rrparamregistry-placeholder.cc
@@ -41,6 +41,34 @@ using namespace isc::dns::rdata;
namespace isc {
namespace dns {
+
+namespace rdata {
+
+RdataPtr
+AbstractRdataFactory::create(MasterLexer& lexer, const Name*,
+ MasterLoader::Options,
+ MasterLoaderCallbacks&) const
+{
+ 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();
+ }
+
+ return (create(s));
+}
+
+} // end of namespace isc::dns::rdata
+
namespace {
///
/// The following function and class are a helper to define case-insensitive
@@ -543,5 +571,26 @@ RRParamRegistry::createRdata(const RRType& rrtype, const RRClass& rrclass,
return (RdataPtr(new rdata::generic::Generic(
dynamic_cast<const generic::Generic&>(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 c3b61eb..e156dc9 100644
--- a/src/lib/dns/rrparamregistry.h
+++ b/src/lib/dns/rrparamregistry.h
@@ -24,9 +24,6 @@
#include <exceptions/exceptions.h>
#include <dns/rdata.h>
-#include <dns/master_lexer.h>
-#include <dns/master_loader.h>
-#include <dns/master_loader_callbacks.h>
namespace isc {
namespace dns {
@@ -125,25 +122,7 @@ public:
/// \brief Create RDATA from MasterLexer
virtual RdataPtr create(MasterLexer& lexer, const Name*,
MasterLoader::Options,
- MasterLoaderCallbacks&) const {
- 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();
- }
-
- return (create(s));
- }
-
+ MasterLoaderCallbacks&) const;
//@}
};
@@ -524,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:
@@ -534,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 2cce9bc..6451f72 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 eb221d8..c4e517c 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 2fea9a3..7ab3423 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 d8ed1d6..74a3e3f 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 7dc774d..4747138 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 47582ce..569e431 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 dccd8b1..6c13ad9 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 bf1f5f7..c80fdd0 100644
--- a/src/lib/dns/tests/rdata_unittest.cc
+++ b/src/lib/dns/tests/rdata_unittest.cc
@@ -28,6 +28,8 @@
#include <dns/tests/unittest_util.h>
#include <dns/tests/rdata_unittest.h>
+#include <boost/bind.hpp>
+
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 f593609..3efb5d8 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:
More information about the bind10-changes
mailing list