Commit 022d3888 authored by Mukund Sivaraman's avatar Mukund Sivaraman
Browse files

[2497] Add rdata::createRdata() and tests for some RRtypes

parent aac7b173
......@@ -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_;
}
......
......@@ -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:
......@@ -571,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)));
}
}
}
......@@ -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 {
......@@ -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:
......@@ -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,
......
......@@ -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,
......
......@@ -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,
......
......@@ -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,
......
......@@ -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);
......
......@@ -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,
......
......@@ -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
......
......@@ -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
}
}
}
......
......@@ -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:
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment