[svn] commit: r2418 - in /branches/trac55/src/lib: datasrc/data_source.cc datasrc/sqlite3_datasrc.cc datasrc/tests/sqlite3_unittest.cc datasrc/tests/static_unittest.cc dns/rrsetlist.cc dns/rrsetlist.h dns/tests/rrsetlist_unittest.cc
BIND 10 source code commits
bind10-changes at lists.isc.org
Tue Jul 6 21:20:53 UTC 2010
Author: each
Date: Tue Jul 6 21:20:53 2010
New Revision: 2418
Log:
Improvements to RRsetList class:
- use std::map instead of std::vector for internal data storage
- use operator[] to access rrsets by type
- only allow insertion of rrsets matching a single name and rrclass,
which may be predefined or may be set by the first rrset inserted
Modified:
branches/trac55/src/lib/datasrc/data_source.cc
branches/trac55/src/lib/datasrc/sqlite3_datasrc.cc
branches/trac55/src/lib/datasrc/tests/sqlite3_unittest.cc
branches/trac55/src/lib/datasrc/tests/static_unittest.cc
branches/trac55/src/lib/dns/rrsetlist.cc
branches/trac55/src/lib/dns/rrsetlist.h
branches/trac55/src/lib/dns/tests/rrsetlist_unittest.cc
Modified: branches/trac55/src/lib/datasrc/data_source.cc
==============================================================================
--- branches/trac55/src/lib/datasrc/data_source.cc (original)
+++ branches/trac55/src/lib/datasrc/data_source.cc Tue Jul 6 21:20:53 2010
@@ -172,7 +172,7 @@
bool
checkCache(QueryTask& task, RRsetList& target) {
HotCache& cache = task.q.getCache();
- RRsetList rrsets;
+ RRsetList rrsets(task.qclass);
RRsetPtr rrset;
int count = 0;
uint32_t flags = 0, cflags = 0;
@@ -339,15 +339,13 @@
return (result);
}
+ // XXX: We currently can't cache class-ANY queries
if (task.qclass == RRClass::ANY()) {
- // XXX: Currently, RRsetList::findRRset() doesn't handle
- // ANY queries, and without that we can't cache the results,
- // so we just return in that case.
return (result);
}
if (task.flags == 0) {
- rrset = target.findRRset(task.qtype, task.qclass);
+ rrset = target[task.qtype];
assert(rrset);
cache.addPositive(rrset, task.flags);
} else {
@@ -374,7 +372,7 @@
}
} else if ((task.flags & DataSrc::CNAME_FOUND) != 0) {
cache.addNegative(task.qname, task.qclass, task.qtype, task.flags);
- rrset = target.findRRset(RRType::CNAME(), task.qclass);
+ rrset = target[RRType::CNAME()];
assert(rrset);
cache.addPositive(rrset, task.flags);
} else if ((task.flags & DataSrc::DATA_NOT_FOUND) == 0) {
@@ -382,7 +380,7 @@
cache.addNegative(task.qname, task.qclass, RRType::CNAME(),
task.flags);
}
- rrset = target.findRRset(task.qtype, task.qclass);
+ rrset = target[task.qtype];
assert(rrset);
cache.addPositive(rrset, task.flags);
} else {
@@ -404,14 +402,14 @@
return (result);
}
- rrset = target.findRRset(RRType::A(), task.qclass);
+ rrset = target[RRType::A()];
if (rrset) {
cache.addPositive(rrset, task.flags);
} else {
cache.addNegative(task.qname, task.qclass, RRType::A(), task.flags);
}
- rrset = target.findRRset(RRType::AAAA(), task.qclass);
+ rrset = target[RRType::AAAA()];
if (rrset) {
cache.addPositive(rrset, task.flags);
} else {
@@ -433,21 +431,21 @@
return (result);
}
- rrset = target.findRRset(RRType::NS(), task.qclass);
+ rrset = target[RRType::NS()];
if (rrset) {
cache.addPositive(rrset, task.flags);
} else {
cache.addNegative(task.qname, task.qclass, RRType::NS(),
task.flags);
}
- rrset = target.findRRset(RRType::DS(), task.qclass);
+ rrset = target[RRType::DS()];
if (rrset) {
cache.addPositive(rrset, task.flags);
} else {
cache.addNegative(task.qname, task.qclass, RRType::DS(),
task.flags);
}
- rrset = target.findRRset(RRType::DNAME(), task.qclass);
+ rrset = target[RRType::DNAME()];
if (rrset) {
cache.addPositive(rrset, task.flags);
} else {
@@ -533,7 +531,7 @@
const int diff = task->qname.getLabelCount() - zonename->getLabelCount();
if (diff > 1) {
bool found = false;
- RRsetList ref;
+ RRsetList ref(q.qclass());
for (int i = diff - 1; i > 0; --i) {
const Name sub(task->qname.split(i));
if (refQuery(q, sub, zoneinfo, ref)) {
@@ -551,17 +549,15 @@
// Found a referral while getting answer data;
// send a delegation.
if (found) {
- RRsetPtr r = ref.findRRset(RRType::DNAME(), q.qclass());
+ RRsetPtr r = ref[RRType::DNAME()];
if (r != NULL) {
- RRsetList syn;
+ RRsetList syn(q.qclass());
addToMessage(q, Section::ANSWER(), r);
q.message().setHeaderFlag(MessageFlag::AA());
synthesizeCname(task, r, syn);
if (syn.size() == 1) {
- addToMessage(q, Section::ANSWER(),
- syn.findRRset(RRType::CNAME(), q.qclass()));
- chaseCname(q, task, syn.findRRset(RRType::CNAME(),
- q.qclass()));
+ addToMessage(q, Section::ANSWER(), syn[RRType::CNAME()]);
+ chaseCname(q, task, syn[RRType::CNAME()]);
return (true);
}
}
@@ -584,7 +580,7 @@
inline DataSrc::Result
addSOA(Query& q, ZoneInfo& zoneinfo) {
- RRsetList soa;
+ RRsetList soa(q.qclass());
const Name* const zonename = zoneinfo.getEnclosingZone();
QueryTask newtask(q, *zonename, RRType::SOA(), QueryTask::SIMPLE_QUERY);
@@ -593,20 +589,18 @@
return (DataSrc::ERROR);
}
- addToMessage(q, Section::AUTHORITY(),
- soa.findRRset(RRType::SOA(), q.qclass()));
+ addToMessage(q, Section::AUTHORITY(), soa[RRType::SOA()]);
return (DataSrc::SUCCESS);
}
inline DataSrc::Result
addNSEC(Query& q, const Name& name, ZoneInfo& zoneinfo) {
- RRsetList nsec;
+ RRsetList nsec(q.qclass());
QueryTask newtask(q, name, RRType::NSEC(), QueryTask::SIMPLE_QUERY);
RETERR(doQueryTask(newtask, zoneinfo, nsec));
if (newtask.flags == 0) {
- addToMessage(q, Section::AUTHORITY(),
- nsec.findRRset(RRType::NSEC(), q.qclass()));
+ addToMessage(q, Section::AUTHORITY(), nsec[RRType::NSEC()]);
}
return (DataSrc::SUCCESS);
@@ -622,9 +616,9 @@
return (DataSrc::ERROR);
}
- RRsetList rl;
+ RRsetList rl(q.qclass());
RETERR(ds->findCoveringNSEC3(*zonename, hash, rl));
- target = rl.findRRset(RRType::NSEC3(), q.qclass());
+ target = rl[RRType::NSEC3()];
return (DataSrc::SUCCESS);
}
@@ -632,7 +626,7 @@
ConstNsec3ParamPtr
getNsec3Param(Query& q, ZoneInfo& zoneinfo) {
DataSrc::Result result;
- RRsetList nsec3param;
+ RRsetList nsec3param(q.qclass());
const Name* const zonename = zoneinfo.getEnclosingZone();
QueryTask newtask(q, *zonename, RRType::NSEC3PARAM(),
@@ -643,7 +637,7 @@
return (ConstNsec3ParamPtr());
}
- RRsetPtr rrset = nsec3param.findRRset(RRType::NSEC3PARAM(), q.qclass());
+ RRsetPtr rrset = nsec3param[RRType::NSEC3PARAM()];
if (!rrset) {
return (ConstNsec3ParamPtr());
}
@@ -693,7 +687,7 @@
break;
}
hash2 = nodehash;
- RRsetList rl;
+ RRsetList rl(q.qclass());
// hash2 will be overwritten with the actual hash found;
// we don't want to use one until we find an exact match
@@ -766,7 +760,7 @@
return (DataSrc::SUCCESS);
}
- RRsetList wild;
+ RRsetList wild(q.qclass());
const Name star("*");
bool cname = false;
@@ -811,7 +805,7 @@
// match the qname), and then continue as if this were a normal
// answer: if a CNAME, chase the target, otherwise add authority.
if (cname) {
- RRsetPtr rrset = wild.findRRset(RRType::CNAME(), q.qclass());
+ RRsetPtr rrset = wild[RRType::CNAME()];
if (rrset != NULL) {
rrset->setName(task->qname);
addToMessage(q, Section::ANSWER(), rrset);
@@ -823,7 +817,7 @@
addToMessage(q, Section::ANSWER(), rrset);
}
- RRsetList auth;
+ RRsetList auth(q.qclass());
if (!refQuery(q, *zonename, zoneinfo, auth)) {
return (DataSrc::ERROR);
}
@@ -868,7 +862,7 @@
}
ZoneInfo zoneinfo(this, task->qname, task->qclass, task->qtype);
- RRsetList data;
+ RRsetList data(q.qclass());
Result result = SUCCESS;
// For these query task types, if there is more than
@@ -906,7 +900,8 @@
((task->qtype == RRType::NSEC() ||
task->qtype == RRType::DS() ||
task->qtype == RRType::DNAME()) &&
- data.findRRset(task->qtype, task->qclass)))) {
+ data[task->qtype])))
+ {
task->flags &= ~REFERRAL;
}
@@ -930,13 +925,13 @@
// Data found, no additional processing needed.
// Add the NS records for the enclosing zone to
// the authority section.
- RRsetList auth;
- const DataSrc* ds = zoneinfo.getDataSource();
- if (!refQuery(q, Name(*zonename), zoneinfo, auth) ||
- !auth.findRRset(RRType::NS(), ds->getClass())) {
- isc_throw(DataSourceError,
- "NS RR not found in " << *zonename << "/" <<
- q.qclass());
+ RRsetList auth(q.qclass());
+ if (!refQuery(q, Name(*zonename), zoneinfo, auth) ||
+ !auth[RRType::NS()])
+ {
+ isc_throw(DataSourceError, "NS RR not found in zone "
+ << *zonename << "/"
+ << q.qclass());
}
copyAuth(q, auth);
@@ -966,7 +961,7 @@
} else if ((task->flags & CNAME_FOUND) != 0) {
// The qname node contains a CNAME. Add a new task to the
// queue to look up its target.
- RRsetPtr rrset = data.findRRset(RRType::CNAME(), q.qclass());
+ RRsetPtr rrset = data[RRType::CNAME()];
if (rrset != NULL) {
addToMessage(q, task->section, rrset);
chaseCname(q, task, rrset);
@@ -975,7 +970,7 @@
} else if ((task->flags & REFERRAL) != 0) {
// The qname node contains an out-of-zone referral.
if (task->state == QueryTask::GETANSWER) {
- RRsetList auth;
+ RRsetList auth(q.qclass());
m.clearHeaderFlag(MessageFlag::AA());
if (!refQuery(q, task->qname, zoneinfo, auth)) {
m.setRcode(Rcode::SERVFAIL());
Modified: branches/trac55/src/lib/datasrc/sqlite3_datasrc.cc
==============================================================================
--- branches/trac55/src/lib/datasrc/sqlite3_datasrc.cc (original)
+++ branches/trac55/src/lib/datasrc/sqlite3_datasrc.cc Tue Jul 6 21:20:53 2010
@@ -189,7 +189,7 @@
}
}
- RRsetPtr rrset = result_sets.findRRset(base_rrtype, qclass);
+ RRsetPtr rrset = result_sets.findRRset(base_rrtype);
if (rrset == NULL) {
rrset = RRsetPtr(new RRset(qname, qclass, base_rrtype, RRTTL(ttl)));
result_sets.addRRset(rrset);
Modified: branches/trac55/src/lib/datasrc/tests/sqlite3_unittest.cc
==============================================================================
--- branches/trac55/src/lib/datasrc/tests/sqlite3_unittest.cc (original)
+++ branches/trac55/src/lib/datasrc/tests/sqlite3_unittest.cc Tue Jul 6 21:20:53 2010
@@ -102,6 +102,7 @@
Sqlite3DataSourceTest() : rrclass(RRClass::IN()),
rrclass_notmatch(RRClass::CH()),
rrtype(RRType::A()), rrttl(RRTTL(3600)),
+ result_sets(RRClass::IN()),
find_flags(0), rrset_matched(0), rrset_count(0)
{
data_source.init(SQLITE_DBFILE_EXAMPLE);
@@ -290,7 +291,7 @@
const vector<const vector<string>* >& expected_answers,
const vector<const vector<string>* >& expected_signatures)
{
- RRsetList result_sets;
+ RRsetList result_sets(qclass);
uint32_t find_flags;
unsigned int rrset_matched = 0;
unsigned int rrset_count = 0;
Modified: branches/trac55/src/lib/datasrc/tests/static_unittest.cc
==============================================================================
--- branches/trac55/src/lib/datasrc/tests/static_unittest.cc (original)
+++ branches/trac55/src/lib/datasrc/tests/static_unittest.cc Tue Jul 6 21:20:53 2010
@@ -47,7 +47,8 @@
authors_name("authors.bind"),
nomatch_name("example.com"),
rrclass(RRClass::CH()), rrtype(RRType::TXT()),
- rrttl(RRTTL(0)), find_flags(0), matched_rdata(0)
+ rrttl(RRTTL(0)), result_sets(RRClass::IN()),
+ find_flags(0), matched_rdata(0)
{
// version.bind is answered with package name+version
// (defined as PACKAGE_STRING in config.h)
@@ -132,7 +133,7 @@
const uint32_t expected_flags, const vector<RRType>& expected_types,
const vector<const vector<string>* >& expected_answers)
{
- RRsetList result_sets;
+ RRsetList result_sets(qclass);
uint32_t find_flags;
unsigned int rrset_matched = 0;
unsigned int rrset_count = 0;
Modified: branches/trac55/src/lib/dns/rrsetlist.cc
==============================================================================
--- branches/trac55/src/lib/dns/rrsetlist.cc (original)
+++ branches/trac55/src/lib/dns/rrsetlist.cc Tue Jul 6 21:20:53 2010
@@ -20,6 +20,7 @@
#include <exceptions/exceptions.h>
+#include <dns/name.h>
#include <dns/rrclass.h>
#include <dns/rrtype.h>
#include <dns/rrset.h>
@@ -30,14 +31,43 @@
void
RRsetList::addRRset(RRsetPtr rrsetptr) {
- ConstRRsetPtr rrset_found = findRRset(rrsetptr->getType(),
- rrsetptr->getClass());
- if (rrset_found != NULL) {
- isc_throw(DuplicateRRset, "RRset is being doubly added to RRsetList: "
- "type=" << rrsetptr->getType() << ", class=" <<
- rrsetptr->getClass());
+ if (rrsetptr->getClass() == RRClass::ANY()) {
+ isc_throw(ClassMismatch, "Attempted to store RRset of class ANY");
}
- rrsets_.push_back(rrsetptr);
+
+ // If the initial class was ANY, then we can accept any RRset, but
+ // all subsequent RRsets have to match the first one.
+ if (class_ == RRClass::ANY()) {
+ assert(size() == 0);
+ class_ = rrsetptr->getClass();
+ } else if (class_ != rrsetptr->getClass()) {
+ isc_throw(ClassMismatch, "Class mismatch inserting RRset "
+ << rrsetptr->getName() << "/"
+ << rrsetptr->getClass() << "/"
+ << rrsetptr->getType()
+ << " in RRsetList of class " << class_);
+ }
+
+ if (name_ == NULL) {
+ assert(size() == 0);
+ name_ = new Name(rrsetptr->getName());
+ } else if (*name_ != rrsetptr->getName()) {
+ isc_throw(NameMismatch, "Name mismatch inserting RRset "
+ << rrsetptr->getName() << "/"
+ << rrsetptr->getClass() << "/"
+ << rrsetptr->getType() << " in RRsetList "
+ << *name_ << "/" << class_);
+ }
+
+ ConstRRsetPtr rrset_found = findRRset(rrsetptr->getType());
+ if (rrset_found) {
+ isc_throw(DuplicateRRset, "Inserted duplicate RRset: "
+ << rrsetptr->getName() << "/"
+ << rrsetptr->getClass() << "/"
+ << rrsetptr->getType());
+ }
+
+ rrsets_[rrsetptr->getType()] = rrsetptr;
}
void
@@ -49,14 +79,14 @@
}
RRsetPtr
-RRsetList::findRRset(const RRType& rrtype, const RRClass& rrclass) {
- BOOST_FOREACH(RRsetPtr rrsetptr, rrsets_) {
- if ((rrsetptr->getClass() == rrclass) &&
- (rrsetptr->getType() == rrtype)) {
- return rrsetptr;
- }
- }
- return RRsetPtr();
+RRsetList::findRRset(const RRType& rrtype) const {
+ std::map<RRType,RRsetPtr>::const_iterator iter;
+ iter = rrsets_.find(rrtype);
+ if (iter == rrsets_.end()) {
+ return (RRsetPtr());
+ }
+
+ return (iter->second);
}
}
Modified: branches/trac55/src/lib/dns/rrsetlist.h
==============================================================================
--- branches/trac55/src/lib/dns/rrsetlist.h (original)
+++ branches/trac55/src/lib/dns/rrsetlist.h Tue Jul 6 21:20:53 2010
@@ -19,7 +19,7 @@
#include <iostream>
#include <iterator>
-#include <vector>
+#include <map>
#include <boost/shared_ptr.hpp>
@@ -36,38 +36,45 @@
isc::Exception(file, line, what) {}
};
+class ClassMismatch : public Exception {
+public:
+ ClassMismatch(const char* file, size_t line, const char* what) :
+ isc::Exception(file, line, what) {}
+};
+
+class NameMismatch : public Exception {
+public:
+ NameMismatch(const char* file, size_t line, const char* what) :
+ isc::Exception(file, line, what) {}
+};
+
template <typename T, typename P, typename R>
class RRsetListIterator :
- public std::iterator<std::input_iterator_tag, RRsetPtr> {
+ public std::iterator<std::input_iterator_tag, RRsetPtr> {
public:
RRsetListIterator() {}
- explicit RRsetListIterator(const T& it) :
- it_(it) {}
- RRsetListIterator& operator++()
- {
+ explicit RRsetListIterator(const T& it) : it_(it) {}
+ RRsetListIterator& operator++() {
++it_;
return (*this);
}
- RRsetListIterator operator++(int)
- {
+ RRsetListIterator operator++(int) {
RRsetListIterator tmp(*this);
++it_;
return (tmp);
}
- R operator*() const
- {
- return (*it_);
+
+ // NOTE: operator* returns only the value, not the key/value pair.
+ R operator*() const {
+ return ((*it_).second);
}
- P operator->() const
- {
+ P operator->() const {
return (&(operator*()));
}
- bool operator==(const RRsetListIterator& other)
- {
+ bool operator==(const RRsetListIterator& other) {
return (it_ == other.it_);
}
- bool operator!=(const RRsetListIterator& other)
- {
+ bool operator!=(const RRsetListIterator& other) {
return (it_ != other.it_);
}
@@ -80,28 +87,43 @@
RRsetList(const RRsetList& source);
RRsetList& operator=(const RRsetList& source);
public:
- RRsetList() {}
- void addRRset(RRsetPtr new_rrsetptr);
- void append(RRsetList& source);
- RRsetPtr findRRset(const RRType& rrtype, const RRClass& rrclass);
+ RRsetList(const RRClass& c = RRClass::ANY()) : name_(NULL), class_(c) {}
+ RRsetList(const Name& n, const RRClass& c = RRClass::ANY()) :
+ name_(new Name(n)), class_(c) {}
- typedef RRsetListIterator<std::vector<RRsetPtr>::iterator,
+ ~RRsetList() {
+ delete name_;
+ };
+
+ typedef RRsetListIterator<std::map<RRType,RRsetPtr>::iterator,
RRsetPtr*,
RRsetPtr&> iterator;
- typedef RRsetListIterator<std::vector<RRsetPtr>::const_iterator,
+ typedef RRsetListIterator<std::map<RRType,RRsetPtr>::const_iterator,
const RRsetPtr*,
const RRsetPtr&> const_iterator;
const_iterator begin() const { return (const_iterator(rrsets_.begin())); }
const_iterator end() const { return (const_iterator(rrsets_.end())); }
-
iterator begin() { return (iterator(rrsets_.begin())); }
iterator end() { return (iterator(rrsets_.end())); }
size_t size() const { return (rrsets_.size()); }
+ void addRRset(RRsetPtr new_rrsetptr);
+ void append(RRsetList& source);
+
+ RRsetPtr findRRset(const RRType& rrtype) const;
+ RRsetPtr operator[](const RRType& rrtype) const {
+ return (findRRset(rrtype));
+ };
+
+ const RRClass& getClass() const { return (class_); }
+ const Name* getName() const { return (name_); }
+
private:
- std::vector<RRsetPtr> rrsets_;
+ Name* name_;
+ RRClass class_;
+ std::map<RRType,RRsetPtr> rrsets_;
};
} // end of namespace dns
Modified: branches/trac55/src/lib/dns/tests/rrsetlist_unittest.cc
==============================================================================
--- branches/trac55/src/lib/dns/tests/rrsetlist_unittest.cc (original)
+++ branches/trac55/src/lib/dns/tests/rrsetlist_unittest.cc Tue Jul 6 21:20:53 2010
@@ -77,20 +77,21 @@
}
TEST_F(RRsetListTest, emptyOnInitialCreate) {
- RRsetList list;
+ RRsetList list(RRClass::IN());
EXPECT_EQ(list.size(), 0);
}
TEST_F(RRsetListTest, addRRsets) {
- RRsetList list;
+ RRsetList list(RRClass::IN());
setupList(list);
EXPECT_EQ(list.size(), 5);
}
TEST_F(RRsetListTest, append) {
- RRsetList list1;
+ RRsetList list1(RRClass::IN());
setupList(list1);
- RRsetList list2;
+ RRsetList list2(RRClass::IN());
+
RRsetPtr dname(new RRset(Name("example.com"), RRClass::IN(),
RRType::DNAME(), example_ttl));
dname->addRdata(rdata_dname);
@@ -99,16 +100,16 @@
EXPECT_EQ(list2.size(), 1);
EXPECT_EQ(list1.size(), 6);
- RRsetPtr rrset = list1.findRRset(RRType::DNAME(), RRClass::IN());
+ RRsetPtr rrset = list1.findRRset(RRType::DNAME());
EXPECT_EQ(RRType::DNAME(), rrset->getType());
EXPECT_THROW(list1.append(list2), DuplicateRRset);
}
TEST_F(RRsetListTest, extraRRset) {
- RRsetList list;
- setupList(list);
- RRsetPtr cname(new RRset(Name("another.example.com"), RRClass::IN(),
+ RRsetList list(RRClass::IN());
+ setupList(list);
+ RRsetPtr cname(new RRset(Name("example.com"), RRClass::IN(),
RRType::CNAME(), example_ttl));
EXPECT_THROW(list.addRRset(cname), DuplicateRRset);
}
@@ -118,7 +119,7 @@
const RRType& rrtype, const RRClass& rrclass,
const RRTTL& rrttl)
{
- RRsetPtr rrset = list.findRRset(rrtype, rrclass);;
+ RRsetPtr rrset = list.findRRset(rrtype);;
EXPECT_EQ(name, rrset->getName());
EXPECT_EQ(rrtype, rrset->getType());
EXPECT_EQ(rrclass, rrset->getClass());
@@ -126,7 +127,7 @@
}
TEST_F(RRsetListTest, findRRset) {
- RRsetList list;
+ RRsetList list(RRClass::IN());
setupList(list);
checkFindResult(list, example_name, RRType::A(), RRClass::IN(),
@@ -142,21 +143,20 @@
}
TEST_F(RRsetListTest, checkData) {
- RRsetList list;
+ RRsetList list(RRClass::IN());
RRsetPtr a(new RRset(Name("example.com"), RRClass::IN(),
RRType::A(), example_ttl));
a->addRdata(rdata_in_a);
list.addRRset(a);
- RdataIteratorPtr it =
- list.findRRset(RRType::A(), RRClass::IN())->getRdataIterator();
+ RdataIteratorPtr it = list.findRRset(RRType::A())->getRdataIterator();
it->first();
EXPECT_FALSE(it->isLast());
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
}
TEST_F(RRsetListTest, iterate) {
- RRsetList list;
+ RRsetList list(RRClass::IN());
setupList(list);
bool has_a = false, has_aaaa = false, has_ns = false, has_soa = false,
@@ -188,4 +188,34 @@
EXPECT_TRUE(i == 5);
}
-}
+TEST_F(RRsetListTest, classMismatch) {
+ RRsetList list(RRClass::CH());
+ EXPECT_THROW(setupList(list), ClassMismatch);
+}
+
+TEST_F(RRsetListTest, classMismatchNoInit) {
+ RRsetList list;
+ EXPECT_NO_THROW(setupList(list));
+ RRsetPtr cname(new RRset(Name("example.com"), RRClass::CH(),
+ RRType::CNAME(), example_ttl));
+ EXPECT_THROW(list.addRRset(cname), ClassMismatch);
+}
+
+TEST_F(RRsetListTest, nameMismatch) {
+ RRsetList list(Name("name1.example.com"));
+ RRsetPtr cname(new RRset(Name("name2.example.com"), RRClass::IN(),
+ RRType::CNAME(), example_ttl));
+ EXPECT_THROW(list.addRRset(cname), NameMismatch);
+}
+
+TEST_F(RRsetListTest, nameMismatchNoInit) {
+ RRsetList list;
+ RRsetPtr cname1(new RRset(Name("name1.example.com"), RRClass::IN(),
+ RRType::CNAME(), example_ttl));
+ EXPECT_NO_THROW(list.addRRset(cname1));
+ RRsetPtr cname2(new RRset(Name("name2.example.com"), RRClass::IN(),
+ RRType::CNAME(), example_ttl));
+ EXPECT_THROW(list.addRRset(cname2), NameMismatch);
+}
+
+}
More information about the bind10-changes
mailing list