[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