[svn] commit: r987 - in /branches/each-ds/src/lib/auth/cpp: data_source.cc data_source.h data_source_sqlite3.cc data_source_static.cc datasrc_unittest.cc unittest_ds.cc unittest_ds.h

BIND 10 source code commits bind10-changes at lists.isc.org
Fri Feb 26 01:35:36 UTC 2010


Author: each
Date: Fri Feb 26 01:35:35 2010
New Revision: 987

Log:
- much more complete data source unittests
- fixed some bugs found along the way

Modified:
    branches/each-ds/src/lib/auth/cpp/data_source.cc
    branches/each-ds/src/lib/auth/cpp/data_source.h
    branches/each-ds/src/lib/auth/cpp/data_source_sqlite3.cc
    branches/each-ds/src/lib/auth/cpp/data_source_static.cc
    branches/each-ds/src/lib/auth/cpp/datasrc_unittest.cc
    branches/each-ds/src/lib/auth/cpp/unittest_ds.cc
    branches/each-ds/src/lib/auth/cpp/unittest_ds.h

Modified: branches/each-ds/src/lib/auth/cpp/data_source.cc
==============================================================================
--- branches/each-ds/src/lib/auth/cpp/data_source.cc (original)
+++ branches/each-ds/src/lib/auth/cpp/data_source.cc Fri Feb 26 01:35:35 2010
@@ -146,13 +146,24 @@
 
 // Query for referrals (i.e., NS/DS or DNAME) at a given name
 static inline bool
-refQuery(const Name& name, Query& q, const DataSrc* ds, RRsetList& target) {
+refQuery(const Name& name, Query& q, QueryTask& task,
+         const DataSrc* ds, RRsetList& target) {
     QueryTask t(name, q.qclass(), QueryTask::REF_QUERY);
+    t.zone = task.zone;
+
     DataSrc::Result result = doQueryTask(ds, q, t, target);
-    if (result == DataSrc::SUCCESS && t.flags == 0) {
-        return true;
-    }
-    return false;
+
+    // Lookup failed
+    if (result != DataSrc::SUCCESS) {
+        return (false);
+    }
+    
+    // Referral bit is expected, so clear it when checking flags
+    if ((t.flags & ~DataSrc::REFERRAL) != 0) {
+        return (false);
+    }
+
+    return (true);
 }
 
 // Match downward, from the zone apex to the query name, looking for
@@ -167,7 +178,7 @@
         RRsetList ref;
         for(int i = diff; i > 1; i--) {
             Name sub(task.qname.split(i - 1, nlen - i));
-            if (refQuery(sub, q, ds, ref)) {
+            if (refQuery(sub, q, task, ds, ref)) {
                 found = true;
                 break;
             }
@@ -185,6 +196,7 @@
             if (RRsetPtr r = ref[RRType::DNAME()]) {
                 RRsetList syn;
                 m.addRRset(Section::ANSWER(), r, q.wantDnssec());
+                m.setHeaderFlag(MessageFlag::AA());
                 synthesizeCname(q, task, r, syn);
                 if (syn.size() == 1) {
                     m.addRRset(Section::ANSWER(),
@@ -238,6 +250,7 @@
         const Name& wname(star.concatenate(task.qname.split(i, nlen - i)));
         QueryTask t(wname, task.qclass, task.qtype,
                     QueryTask::SIMPLE_QUERY); 
+        t.zone = task.zone;
         result = doQueryTask(ds, q, t, wild);
         if (result == DataSrc::SUCCESS &&
             (t.flags == 0 || (t.flags & DataSrc::CNAME_FOUND))) {
@@ -266,7 +279,7 @@
             }
 
             RRsetList auth;
-            if (! refQuery(Name(*task.zone), q, ds, auth)) {
+            if (! refQuery(Name(*task.zone), q, task, ds, auth)) {
                 return (DataSrc::ERROR);
             }
 
@@ -277,6 +290,7 @@
         RRsetList nsec;
         QueryTask t = QueryTask(*task.zone, task.qclass, RRType::NSEC(),
                                 QueryTask::SIMPLE_QUERY); 
+        t.zone = task.zone;
         result = doQueryTask(ds, q, t, nsec);
         if (result != DataSrc::SUCCESS) {
             return (DataSrc::ERROR);
@@ -385,7 +399,7 @@
                     // Add the NS records for the enclosing zone to
                     // the authority section.
                     RRsetList auth;
-                    if (! refQuery(Name(*zone), q, ds, auth)) {
+                    if (! refQuery(Name(*zone), q, task, ds, auth)) {
                         m.setRcode(Rcode::SERVFAIL());
                         return;
                     }
@@ -427,7 +441,7 @@
             if (task.state == QueryTask::GETANSWER) {
                 RRsetList auth;
                 m.clearHeaderFlag(MessageFlag::AA());
-                if (! refQuery(task.qname, q, ds, auth)) {
+                if (! refQuery(task.qname, q, task, ds, auth)) {
                     m.setRcode(Rcode::SERVFAIL());
                     return;
                 }
@@ -459,7 +473,7 @@
             // If we were looking for answer data, not additional,
             // and the name was not found, we need to find out whether
             // there are any relevant wildcards.
-            bool wildcard_found;
+            bool wildcard_found = false;
             result = tryWildcard(q, task, ds, wildcard_found);
             if (result != SUCCESS) {
                 m.setRcode(Rcode::SERVFAIL());
@@ -490,6 +504,7 @@
                 RRsetList soa;
                 QueryTask t(Name(*zone), task.qclass, RRType::SOA(), 
                             QueryTask::SIMPLE_QUERY); 
+                t.zone = task.zone;
                 result = doQueryTask(ds, q, t, soa);
                 if (result != SUCCESS || t.flags != 0) {
                     m.setRcode(Rcode::SERVFAIL());

Modified: branches/each-ds/src/lib/auth/cpp/data_source.h
==============================================================================
--- branches/each-ds/src/lib/auth/cpp/data_source.h (original)
+++ branches/each-ds/src/lib/auth/cpp/data_source.h Fri Feb 26 01:35:35 2010
@@ -130,6 +130,7 @@
 
     const RRClass& getClass() const { return rrclass; }
     void setClass(RRClass& c) { rrclass = c; }
+    void setClass(const RRClass& c) { rrclass = c; }
 
     Result init() { return NOT_IMPLEMENTED; }
     Result close() { return NOT_IMPLEMENTED; }

Modified: branches/each-ds/src/lib/auth/cpp/data_source_sqlite3.cc
==============================================================================
--- branches/each-ds/src/lib/auth/cpp/data_source_sqlite3.cc (original)
+++ branches/each-ds/src/lib/auth/cpp/data_source_sqlite3.cc Fri Feb 26 01:35:35 2010
@@ -136,6 +136,7 @@
     int sig_ttl = -1;
     int rows = 0;
     RRsetPtr rrset;
+    bool any = (rdtype == RRType::ANY());
 
     rc = sqlite3_step(query);
     while (rc == SQLITE_ROW) {
@@ -144,12 +145,12 @@
         const char *sigtype = (const char *)sqlite3_column_text(query, 2);
         const char *rdata = (const char *)sqlite3_column_text(query, 3);
 
+        RRType rt(sigtype ? sigtype : type);
+
         // looking for something else but found NS; we need to inform
         // the caller that this is a referral, but we do not return the
         // NS RRset to the caller.
-        if ((rdtype != RRType::NS() && rdtype != RRType::ANY()) &&
-            ((strcmp(type, "NS") == 0 ||
-             (sigtype != NULL && strcmp(sigtype, "NS") == 0)))) {
+        if (rdtype != RRType::NS() && !any && rt == RRType::NS()) {
             flags |= REFERRAL;
             rc = sqlite3_step(query);
             continue;
@@ -157,20 +158,25 @@
 
         rows++;
 
-        // found a CNAME when looking for something else (other than NSEC
-        // or ANY)
-        if (strcmp(type, "CNAME") == 0 && rdtype != RRType::CNAME() &&
-              rdtype != RRType::NSEC() && rdtype != RRType::ANY()) {
-            flags |= CNAME_FOUND;
-        }
-
-        RRType rt(sigtype == NULL ? type : sigtype);
+        // Looking for something else but found CNAME
+        if (rt == RRType::CNAME() && rdtype != RRType::CNAME()) {
+            if (rdtype == RRType::NSEC()) {
+                // NSEC query, just skip the CNAME
+                rc = sqlite3_step(query);
+                continue;
+            } else if (!any) {
+                // include the CNAME, but don't flag it for chasing if
+                // this is an ANY query
+                flags |= CNAME_FOUND;
+            }
+        }
+
         if (!target[rt]) {
             rrset = RRsetPtr(new RRset(name, RRClass::IN(), rt, RRTTL(3600)));
             target.addRRset(rrset);
         }
 
-        if (sigtype == NULL && RRType(type) == rrset->getType()) {
+        if (!sigtype && RRType(type) == rrset->getType()) {
             RdataPtr item = createRdata(RRType(type), RRClass("IN"), rdata);
             rrset->addRdata(item);
 
@@ -178,7 +184,7 @@
                 target_ttl = ttl;
             }
             rrset->setTTL(RRTTL(target_ttl));
-        } else if (sigtype != NULL && RRType(sigtype) == rrset->getType()) {
+        } else if (sigtype && RRType(sigtype) == rrset->getType()) {
             RdataPtr rrsig = createRdata(RRType::RRSIG(), RRClass::IN(), rdata);
             if (rrset->getRRsig()) {
                 rrset->getRRsig()->addRdata(rrsig);

Modified: branches/each-ds/src/lib/auth/cpp/data_source_static.cc
==============================================================================
--- branches/each-ds/src/lib/auth/cpp/data_source_static.cc (original)
+++ branches/each-ds/src/lib/auth/cpp/data_source_static.cc Fri Feb 26 01:35:35 2010
@@ -26,6 +26,7 @@
 
 #include <iostream>
 
+using namespace std;
 using namespace isc::dns;
 using namespace isc::dns::rdata;
 
@@ -35,6 +36,8 @@
 StaticDataSrc::StaticDataSrc() : authors_name("authors.bind"),
                                  version_name("version.bind")
 {
+    setClass(RRClass::CH());
+
     authors = RRsetPtr(new RRset(authors_name, RRClass::CH(),
                                           RRType::TXT(), RRTTL(0)));
     authors->addRdata(generic::TXT("Evan Hunt"));
@@ -92,30 +95,35 @@
                          Name* zone) const
 {
     flags = 0;
-    if (qname == version_name &&
-        qclass == version->getClass() &&
-        (qtype == version->getType() || qtype == RRType::ANY())) {
-        target.addRRset(version);
-        return (SUCCESS);
-    } else if (qname == version_name &&
-               qclass == version_ns->getClass() &&
-               (qtype == version->getType() || qtype == RRType::ANY())) {
-        target.addRRset(version_ns);
-        return (SUCCESS);
-    } else if (qname == authors_name &&
-               qclass == authors->getClass() &&
-               (qtype == authors->getType() || qtype == RRType::ANY())) {
-        target.addRRset(authors);
-        return (SUCCESS);
-    } else if (qname == authors_name &&
-               qclass == authors_ns->getClass() &&
-               (qtype == authors->getType() || qtype == RRType::ANY())) {
-        target.addRRset(authors_ns);
-        return (SUCCESS);
+    if (qclass != getClass()) {
+        return (ERROR);
     }
 
-    flags = NAME_NOT_FOUND;
-    return (ERROR);
+    bool any = (qtype == RRType::ANY());
+
+    if (qname == version_name) {
+        if (qtype == RRType::TXT() || any) {
+            target.addRRset(version);
+        } else if (qtype == RRType::NS()) {
+            target.addRRset(version_ns);
+        } else {
+            flags = TYPE_NOT_FOUND;
+        }
+    } else if (qname == authors_name) {
+        if (qtype == RRType::TXT() || any) {
+            target.addRRset(authors);
+            return (SUCCESS);
+        } else if (qtype == RRType::NS()) {
+            target.addRRset(authors_ns);
+            return (SUCCESS);
+        } else {
+            flags = TYPE_NOT_FOUND;
+        }
+    } else {
+        flags = NAME_NOT_FOUND;
+    }
+
+    return (SUCCESS);
 }
 
 }

Modified: branches/each-ds/src/lib/auth/cpp/datasrc_unittest.cc
==============================================================================
--- branches/each-ds/src/lib/auth/cpp/datasrc_unittest.cc (original)
+++ branches/each-ds/src/lib/auth/cpp/datasrc_unittest.cc Fri Feb 26 01:35:35 2010
@@ -46,12 +46,12 @@
     TestDataSrc ds;
     OutputBuffer obuffer;
     MessageRenderer renderer;
-    Message query;
-    static void queryFromFile(Message& message, const char* datafile);
+    Message msg;
+    static void msgFromFile(Message& message, const char* datafile);
 };
 
 void
-DataSrcTest::queryFromFile(Message& message, const char* datafile)
+DataSrcTest::msgFromFile(Message& message, const char* datafile)
 {
     std::vector<unsigned char> data;
     UnitTestUtil::readWireData(datafile, data);
@@ -61,82 +61,536 @@
 }
 
 TEST_F(DataSrcTest, Query) {
-    queryFromFile(query, "testdata/q_www");
-    Query q = Query(query, false);
-    ds.doQuery(q);
+    msgFromFile(msg, "testdata/q_www");
+    msg.makeResponse();
+    msg.setHeaderFlag(MessageFlag::AA());
+    msg.setRcode(Rcode::NOERROR());
+    Query q = Query(msg, false);
+    ds.doQuery(q);
+    Message* m = &(q.message());
+
+    EXPECT_EQ(Rcode::NOERROR(), m->getRcode());
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::QR()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::AA()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::RD()));
+
+    EXPECT_EQ(2, m->getRRCount(Section::ANSWER()));
+    EXPECT_EQ(4, m->getRRCount(Section::AUTHORITY()));
+    EXPECT_EQ(6, m->getRRCount(Section::ADDITIONAL()));
+
+    RRsetIterator rit = m->beginSection(Section::ANSWER());
+    RRsetPtr rrset = *rit;
+    EXPECT_EQ(Name("www.example.com"), rrset->getName());
+    EXPECT_EQ(RRType::A(), rrset->getType());
+    EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+    RdataIteratorPtr it = rrset->getRdataIterator();
+    it->first();
+    EXPECT_EQ("192.168.1.1", it->getCurrent().toText());
+    it->next();
+    EXPECT_TRUE(it->isLast());
+
+    // XXX: also check ANSWER RRSIG
+
+    rit = m->beginSection(Section::AUTHORITY());
+    rrset = *rit;
+    EXPECT_EQ(Name("example.com"), rrset->getName());
+    EXPECT_EQ(RRType::NS(), rrset->getType());
+    EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+    it = rrset->getRdataIterator();
+    it->first();
+    EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
+    it->next();
+    EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
+    it->next();
+    EXPECT_EQ("dns03.example.com.", it->getCurrent().toText());
+    it->next();
+    EXPECT_TRUE(it->isLast());
+
+    rit = m->beginSection(Section::ADDITIONAL());
+    rrset = *rit;
+    EXPECT_EQ(Name("dns01.example.com"), rrset->getName());
+    EXPECT_EQ(RRType::A(), rrset->getType());
+    EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+    it = rrset->getRdataIterator();
+    it->first();
+    EXPECT_EQ("192.168.2.1", it->getCurrent().toText());
+    it->next();
+    EXPECT_TRUE(it->isLast());
 }
 
 TEST_F(DataSrcTest, NSQuery) {
-    queryFromFile(query, "testdata/q_example_ns");
-    Query q = Query(query, false);
-    ds.doQuery(q);
+    msgFromFile(msg, "testdata/q_example_ns");
+    msg.makeResponse();
+    msg.setHeaderFlag(MessageFlag::AA());
+    msg.setRcode(Rcode::NOERROR());
+    Query q = Query(msg, false);
+    ds.doQuery(q);
+    Message* m = &(q.message());
+
+    EXPECT_EQ(Rcode::NOERROR(), m->getRcode());
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::QR()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::AA()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::RD()));
+
+    EXPECT_EQ(4, m->getRRCount(Section::ANSWER()));
+    EXPECT_EQ(0, m->getRRCount(Section::AUTHORITY()));
+    EXPECT_EQ(6, m->getRRCount(Section::ADDITIONAL()));
+
+    RRsetIterator rit = m->beginSection(Section::ANSWER());
+    RRsetPtr rrset = *rit;
+    EXPECT_EQ(Name("example.com"), rrset->getName());
+    EXPECT_EQ(RRType::NS(), rrset->getType());
+    EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+    RdataIteratorPtr it = rrset->getRdataIterator();
+    it->first();
+    EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
+    it->next();
+    EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
+    it->next();
+    EXPECT_EQ("dns03.example.com.", it->getCurrent().toText());
+    it->next();
+    EXPECT_TRUE(it->isLast());
 }
 
 TEST_F(DataSrcTest, NxRRset) {
-    queryFromFile(query, "testdata/q_example_ptr");
-    Query q = Query(query, false);
-    ds.doQuery(q);
+    msgFromFile(msg, "testdata/q_example_ptr");
+    msg.makeResponse();
+    msg.setHeaderFlag(MessageFlag::AA());
+    msg.setRcode(Rcode::NOERROR());
+    Query q = Query(msg, false);
+    ds.doQuery(q);
+    Message* m = &(q.message());
+
+    EXPECT_EQ(Rcode::NOERROR(), m->getRcode());
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::QR()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::AA()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::RD()));
+
+    EXPECT_EQ(0, m->getRRCount(Section::ANSWER()));
+    EXPECT_EQ(4, m->getRRCount(Section::AUTHORITY()));
+    EXPECT_EQ(0, m->getRRCount(Section::ADDITIONAL()));
+
+    RRsetIterator rit = m->beginSection(Section::AUTHORITY());
+    RRsetPtr rrset = *rit;
+    EXPECT_EQ(Name("example.com"), rrset->getName());
+    EXPECT_EQ(RRType::SOA(), rrset->getType());
 }
 
 TEST_F(DataSrcTest, Nxdomain) {
-    queryFromFile(query, "testdata/q_glork");
-    Query q = Query(query, false);
-    ds.doQuery(q);
+    msgFromFile(msg, "testdata/q_glork");
+    msg.makeResponse();
+    msg.setHeaderFlag(MessageFlag::AA());
+    msg.setRcode(Rcode::NOERROR());
+    Query q = Query(msg, false);
+    ds.doQuery(q);
+    Message* m = &(q.message());
+
+    EXPECT_EQ(Rcode::NXDOMAIN(), m->getRcode());
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::QR()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::AA()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::RD()));
+
+    EXPECT_EQ(0, m->getRRCount(Section::ANSWER()));
+    EXPECT_EQ(6, m->getRRCount(Section::AUTHORITY()));
+    EXPECT_EQ(0, m->getRRCount(Section::ADDITIONAL()));
+
+    RRsetIterator rit = m->beginSection(Section::AUTHORITY());
+    RRsetPtr rrset = *rit;
+    EXPECT_EQ(Name("example.com"), rrset->getName());
+    EXPECT_EQ(RRType::NSEC(), rrset->getType());
+    EXPECT_EQ(RRClass::IN(), rrset->getClass());
+    // XXX: check for other authority section answers
 }
 
 TEST_F(DataSrcTest, NxZone) {
-    queryFromFile(query, "testdata/q_spork");
-    Query q = Query(query, false);
-    ds.doQuery(q);
+    msgFromFile(msg, "testdata/q_spork");
+    msg.makeResponse();
+    msg.setHeaderFlag(MessageFlag::AA());
+    msg.setRcode(Rcode::NOERROR());
+    Query q = Query(msg, false);
+    ds.doQuery(q);
+    Message* m = &(q.message());
+
+    EXPECT_EQ(Rcode::REFUSED(), m->getRcode());
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::QR()));
+    EXPECT_FALSE(m->getHeaderFlag(MessageFlag::AA()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::RD()));
+
 }
 
 TEST_F(DataSrcTest, Wildcard) {
-    queryFromFile(query, "testdata/q_wild");
-    Query q = Query(query, false);
-    ds.doQuery(q);
+    msgFromFile(msg, "testdata/q_wild");
+    msg.makeResponse();
+    msg.setHeaderFlag(MessageFlag::AA());
+    msg.setRcode(Rcode::NOERROR());
+    Query q = Query(msg, false);
+    ds.doQuery(q);
+    Message* m = &(q.message());
+
+    EXPECT_EQ(Rcode::NOERROR(), m->getRcode());
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::QR()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::AA()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::RD()));
+
+    EXPECT_EQ(2, m->getRRCount(Section::ANSWER()));
+    EXPECT_EQ(4, m->getRRCount(Section::AUTHORITY()));
+    EXPECT_EQ(6, m->getRRCount(Section::ADDITIONAL()));
+
+    RRsetIterator rit = m->beginSection(Section::ANSWER());
+    RRsetPtr rrset = *rit;
+    EXPECT_EQ(Name("www.wild.example.com"), rrset->getName());
+    EXPECT_EQ(RRType::A(), rrset->getType());
+    EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+    RdataIteratorPtr it = rrset->getRdataIterator();
+    it->first();
+    EXPECT_EQ("192.168.3.2", it->getCurrent().toText());
+    it->next();
+    EXPECT_TRUE(it->isLast());
+
+    rit = m->beginSection(Section::AUTHORITY());
+    rrset = *rit;
+    EXPECT_EQ(Name("example.com"), rrset->getName());
+    EXPECT_EQ(RRType::NS(), rrset->getType());
+    EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+    it = rrset->getRdataIterator();
+    it->first();
+    EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
+    it->next();
+    EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
+    it->next();
+    EXPECT_EQ("dns03.example.com.", it->getCurrent().toText());
+    it->next();
+    EXPECT_TRUE(it->isLast());
+
+    rit = m->beginSection(Section::ADDITIONAL());
+    rrset = *rit;
+    EXPECT_EQ(Name("dns01.example.com"), rrset->getName());
+    EXPECT_EQ(RRType::A(), rrset->getType());
+    EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+    it = rrset->getRdataIterator();
+    it->first();
+    EXPECT_EQ("192.168.2.1", it->getCurrent().toText());
+    it->next();
+    EXPECT_TRUE(it->isLast());
 }
 
 TEST_F(DataSrcTest, AuthDelegation) {
-    queryFromFile(query, "testdata/q_sql1");
-    Query q = Query(query, false);
-    ds.doQuery(q);
+    msgFromFile(msg, "testdata/q_sql1");
+    msg.makeResponse();
+    msg.setHeaderFlag(MessageFlag::AA());
+    msg.setRcode(Rcode::NOERROR());
+    Query q = Query(msg, false);
+    ds.doQuery(q);
+    Message* m = &(q.message());
+
+    EXPECT_EQ(Rcode::NOERROR(), m->getRcode());
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::QR()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::AA()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::RD()));
+
+    EXPECT_EQ(2, m->getRRCount(Section::ANSWER()));
+    EXPECT_EQ(4, m->getRRCount(Section::AUTHORITY()));
+    EXPECT_EQ(6, m->getRRCount(Section::ADDITIONAL()));
+
+    RRsetIterator rit = m->beginSection(Section::ANSWER());
+    RRsetPtr rrset = *rit;
+    EXPECT_EQ(Name("www.sql1.example.com"), rrset->getName());
+    EXPECT_EQ(RRType::A(), rrset->getType());
+    EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+    RdataIteratorPtr it = rrset->getRdataIterator();
+    it->first();
+    EXPECT_EQ("192.168.2.2", it->getCurrent().toText());
+    it->next();
+    EXPECT_TRUE(it->isLast());
+
+    rit = m->beginSection(Section::AUTHORITY());
+    rrset = *rit;
+    EXPECT_EQ(Name("sql1.example.com"), rrset->getName());
+    EXPECT_EQ(RRType::NS(), rrset->getType());
+    EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+    it = rrset->getRdataIterator();
+    it->first();
+    EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
+    it->next();
+    EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
+    it->next();
+    EXPECT_EQ("dns03.example.com.", it->getCurrent().toText());
+    it->next();
+    EXPECT_TRUE(it->isLast());
+
+    rit = m->beginSection(Section::ADDITIONAL());
+    rrset = *rit;
+    EXPECT_EQ(Name("dns01.example.com"), rrset->getName());
+    EXPECT_EQ(RRType::A(), rrset->getType());
+    EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+    it = rrset->getRdataIterator();
+    it->first();
+    EXPECT_EQ("192.168.2.1", it->getCurrent().toText());
+    it->next();
+    EXPECT_TRUE(it->isLast());
 }
 
 TEST_F(DataSrcTest, Dname) {
-    queryFromFile(query, "testdata/q_dname");
-    Query q = Query(query, false);
-    ds.doQuery(q);
+    msgFromFile(msg, "testdata/q_dname");
+    msg.makeResponse();
+    msg.setHeaderFlag(MessageFlag::AA());
+    msg.setRcode(Rcode::NOERROR());
+    Query q = Query(msg, false);
+    ds.doQuery(q);
+    Message* m = &(q.message());
+
+    EXPECT_EQ(Rcode::NOERROR(), m->getRcode());
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::QR()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::AA()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::RD()));
+
+    EXPECT_EQ(5, m->getRRCount(Section::ANSWER()));
+    EXPECT_EQ(4, m->getRRCount(Section::AUTHORITY()));
+    EXPECT_EQ(6, m->getRRCount(Section::ADDITIONAL()));
+
+    RRsetIterator rit = m->beginSection(Section::ANSWER());
+    RRsetPtr rrset = *rit;
+    EXPECT_EQ(Name("dname.example.com"), rrset->getName());
+    EXPECT_EQ(RRType::DNAME(), rrset->getType());
+    EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+    RdataIteratorPtr it = rrset->getRdataIterator();
+    it->first();
+    EXPECT_EQ("sql1.example.com.", it->getCurrent().toText());
+    it->next();
+    EXPECT_TRUE(it->isLast());
+
+    // XXX: check CNAME and A record too
+
+    rit = m->beginSection(Section::AUTHORITY());
+    rrset = *rit;
+    EXPECT_EQ(Name("sql1.example.com"), rrset->getName());
+    EXPECT_EQ(RRType::NS(), rrset->getType());
+    EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+    it = rrset->getRdataIterator();
+    it->first();
+    EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
+    it->next();
+    EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
+    it->next();
+    EXPECT_EQ("dns03.example.com.", it->getCurrent().toText());
+    it->next();
+    EXPECT_TRUE(it->isLast());
+
+    rit = m->beginSection(Section::ADDITIONAL());
+    rrset = *rit;
+    EXPECT_EQ(Name("dns01.example.com"), rrset->getName());
+    EXPECT_EQ(RRType::A(), rrset->getType());
+    EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+    it = rrset->getRdataIterator();
+    it->first();
+    EXPECT_EQ("192.168.2.1", it->getCurrent().toText());
+    it->next();
+    EXPECT_TRUE(it->isLast());
 }
 
 TEST_F(DataSrcTest, Cname) {
-    queryFromFile(query, "testdata/q_cname");
-    Query q = Query(query, false);
-    ds.doQuery(q);
+    msgFromFile(msg, "testdata/q_cname");
+    msg.makeResponse();
+    msg.setHeaderFlag(MessageFlag::AA());
+    msg.setRcode(Rcode::NOERROR());
+    Query q = Query(msg, false);
+    ds.doQuery(q);
+    Message* m = &(q.message());
+
+    EXPECT_EQ(Rcode::NOERROR(), m->getRcode());
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::QR()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::AA()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::RD()));
+
+    EXPECT_EQ(2, m->getRRCount(Section::ANSWER()));
+    EXPECT_EQ(0, m->getRRCount(Section::AUTHORITY()));
+    EXPECT_EQ(0, m->getRRCount(Section::ADDITIONAL()));
+
+    RRsetIterator rit = m->beginSection(Section::ANSWER());
+    RRsetPtr rrset = *rit;
+    EXPECT_EQ(Name("foo.example.com"), rrset->getName());
+    EXPECT_EQ(RRType::CNAME(), rrset->getType());
+    EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+    RdataIteratorPtr it = rrset->getRdataIterator();
+    it->first();
+    EXPECT_EQ("cnametest.flame.org.", it->getCurrent().toText());
+    it->next();
+    EXPECT_TRUE(it->isLast());
 }
 
 TEST_F(DataSrcTest, CnameInt) {
-    queryFromFile(query, "testdata/q_cname_int");
-    Query q = Query(query, false);
-    ds.doQuery(q);
+    msgFromFile(msg, "testdata/q_cname_int");
+    msg.makeResponse();
+    msg.setHeaderFlag(MessageFlag::AA());
+    msg.setRcode(Rcode::NOERROR());
+    Query q = Query(msg, false);
+    ds.doQuery(q);
+    Message* m = &(q.message());
+
+    EXPECT_EQ(Rcode::NOERROR(), m->getRcode());
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::QR()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::AA()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::RD()));
+
+    EXPECT_EQ(4, m->getRRCount(Section::ANSWER()));
+    EXPECT_EQ(4, m->getRRCount(Section::AUTHORITY()));
+    EXPECT_EQ(6, m->getRRCount(Section::ADDITIONAL()));
+
+    RRsetIterator rit = m->beginSection(Section::ANSWER());
+    RRsetPtr rrset = *rit;
+    EXPECT_EQ(Name("cname-int.example.com"), rrset->getName());
+    EXPECT_EQ(RRType::CNAME(), rrset->getType());
+    EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+    RdataIteratorPtr it = rrset->getRdataIterator();
+    it->first();
+    EXPECT_EQ("www.example.com.", it->getCurrent().toText());
+    it->next();
+    EXPECT_TRUE(it->isLast());
+
+    // XXX: check a record as well
+
+    rit = m->beginSection(Section::AUTHORITY());
+    rrset = *rit;
+    EXPECT_EQ(Name("example.com"), rrset->getName());
+    EXPECT_EQ(RRType::NS(), rrset->getType());
+    EXPECT_EQ(RRClass::IN(), rrset->getClass());
 }
 
 TEST_F(DataSrcTest, CnameExt) {
-    queryFromFile(query, "testdata/q_cname_ext");
-    Query q = Query(query, false);
-    ds.doQuery(q);
+    msgFromFile(msg, "testdata/q_cname_ext");
+    msg.makeResponse();
+    msg.setHeaderFlag(MessageFlag::AA());
+    msg.setRcode(Rcode::NOERROR());
+    Query q = Query(msg, false);
+    ds.doQuery(q);
+    Message* m = &(q.message());
+
+    EXPECT_EQ(Rcode::NOERROR(), m->getRcode());
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::QR()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::AA()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::RD()));
+
+    EXPECT_EQ(4, m->getRRCount(Section::ANSWER()));
+    EXPECT_EQ(4, m->getRRCount(Section::AUTHORITY()));
+    EXPECT_EQ(6, m->getRRCount(Section::ADDITIONAL()));
+
+    RRsetIterator rit = m->beginSection(Section::ANSWER());
+    RRsetPtr rrset = *rit;
+    EXPECT_EQ(Name("cname-ext.example.com"), rrset->getName());
+    EXPECT_EQ(RRType::CNAME(), rrset->getType());
+    EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+    RdataIteratorPtr it = rrset->getRdataIterator();
+    it->first();
+    EXPECT_EQ("www.sql1.example.com.", it->getCurrent().toText());
+    it->next();
+    EXPECT_TRUE(it->isLast());
+
+    rit = m->beginSection(Section::AUTHORITY());
+    rrset = *rit;
+    EXPECT_EQ(Name("sql1.example.com"), rrset->getName());
+    EXPECT_EQ(RRType::NS(), rrset->getType());
+    EXPECT_EQ(RRClass::IN(), rrset->getClass());
 }
 
 TEST_F(DataSrcTest, Delegation) {
-    queryFromFile(query, "testdata/q_subzone");
-    Query q = Query(query, false);
-    ds.doQuery(q);
+    msgFromFile(msg, "testdata/q_subzone");
+    msg.makeResponse();
+    msg.setHeaderFlag(MessageFlag::AA());
+    msg.setRcode(Rcode::NOERROR());
+    Query q = Query(msg, false);
+    ds.doQuery(q);
+    Message* m = &(q.message());
+
+    EXPECT_EQ(Rcode::NOERROR(), m->getRcode());
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::QR()));
+    EXPECT_FALSE(m->getHeaderFlag(MessageFlag::AA()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::RD()));
+
+    EXPECT_EQ(0, m->getRRCount(Section::ANSWER()));
+    EXPECT_EQ(5, m->getRRCount(Section::AUTHORITY()));
+    EXPECT_EQ(2, m->getRRCount(Section::ADDITIONAL()));
+
+    RRsetIterator rit = m->beginSection(Section::AUTHORITY());
+    RRsetPtr rrset = *rit;
+    EXPECT_EQ(Name("subzone.example.com."), rrset->getName());
+    EXPECT_EQ(RRType::NS(), rrset->getType());
+    EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+    RdataIteratorPtr it = rrset->getRdataIterator();
+    it->first();
+    EXPECT_EQ("ns1.subzone.example.com.", it->getCurrent().toText());
+    it->next();
+    EXPECT_FALSE(it->isLast());
+
+    rit = m->beginSection(Section::ADDITIONAL());
+    rrset = *rit;
+    EXPECT_EQ(Name("ns1.subzone.example.com"), rrset->getName());
+    EXPECT_EQ(RRType::A(), rrset->getType());
+    EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+    it = rrset->getRdataIterator();
+    it->first();
+    EXPECT_EQ("192.168.3.1", it->getCurrent().toText());
+    it->next();
+    EXPECT_TRUE(it->isLast());
 }
 
 TEST_F(DataSrcTest, DS) {
-    queryFromFile(query, "testdata/q_subzone_ds");
-    Query q = Query(query, false);
-    ds.doQuery(q);
-}
-
-}
-
+    msgFromFile(msg, "testdata/q_subzone_ds");
+    msg.makeResponse();
+    msg.setHeaderFlag(MessageFlag::AA());
+    msg.setRcode(Rcode::NOERROR());
+    Query q = Query(msg, false);
+    ds.doQuery(q);
+    Message* m = &(q.message());
+
+    EXPECT_EQ(Rcode::NOERROR(), m->getRcode());
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::QR()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::AA()));
+    EXPECT_TRUE(m->getHeaderFlag(MessageFlag::RD()));
+
+    EXPECT_EQ(3, m->getRRCount(Section::ANSWER()));
+    EXPECT_EQ(4, m->getRRCount(Section::AUTHORITY()));
+    EXPECT_EQ(6, m->getRRCount(Section::ADDITIONAL()));
+
+    RRsetIterator rit = m->beginSection(Section::ANSWER());
+    RRsetPtr rrset = *rit;
+    EXPECT_EQ(Name("subzone.example.com."), rrset->getName());
+    EXPECT_EQ(RRType::DS(), rrset->getType());
+    EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+    rit = m->beginSection(Section::AUTHORITY());
+    rrset = *rit;
+    EXPECT_EQ(Name("example.com"), rrset->getName());
+    EXPECT_EQ(RRType::NS(), rrset->getType());
+    EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+    RdataIteratorPtr it = rrset->getRdataIterator();
+    it->first();
+    EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
+    it->next();
+    EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
+    it->next();
+    EXPECT_EQ("dns03.example.com.", it->getCurrent().toText());
+    it->next();
+    EXPECT_TRUE(it->isLast());
+}
+
+}
+

Modified: branches/each-ds/src/lib/auth/cpp/unittest_ds.cc
==============================================================================
--- branches/each-ds/src/lib/auth/cpp/unittest_ds.cc (original)
+++ branches/each-ds/src/lib/auth/cpp/unittest_ds.cc Fri Feb 26 01:35:35 2010
@@ -38,130 +38,330 @@
 namespace isc {
 namespace auth {
 
-TestDataSrc::TestDataSrc() : example_name("example.com"),
-                             sql1_name("sql1.example.com")
+TestDataSrc::TestDataSrc() : example("example.com"),
+                             sql1("sql1.example.com"),
+                             www_sql1("www.sql1.example.com"),
+                             www("www.example.com"),
+                             foo("foo.example.com"),
+                             dns01("dns01.example.com"),
+                             dns02("dns02.example.com"),
+                             dns03("dns03.example.com"),
+                             cnameint("cname-int.example.com"),
+                             cnameext("cname-ext.example.com"),
+                             dname("dname.example.com"),
+                             wild("*.wild.example.com"),
+                             subzone("subzone.example.com")
 {
-    example_ns = RRsetPtr(new RRset(example_name, RRClass::IN(),
+    RRset* rp;
+    RRsetPtr rrsig;
+
+    // example.com
+    example_ns = RRsetPtr(new RRset(example, RRClass::IN(),
                                     RRType::NS(), RRTTL(3600)));
-    example_ns->addRdata(generic::NS(Name("dns01.example.com")));
-    example_ns->addRdata(generic::NS(Name("dns02.example.com")));
-    example_ns->addRdata(generic::NS(Name("dns03.example.com")));
-
-    example_rrsig = RRsetPtr(new RRset(example_name, RRClass::IN(),
-                                       RRType::RRSIG(), RRTTL(3600)));
-    example_rrsig->addRdata(generic::RRSIG("NS 5 2 3600 20100322084538 20100220084538 33495 example.com. ClcrfjkQZUY5L6ZlCkU3cJHzcrEGrofKSVeeoeZ+w6yeEowFNVXs2YBo3tom53DiCrdD9rs3feVSLGW5rjsz/O6lDuomgQG+EVSnWa7GTIPBXj1BmDXXp3XxeldYmhf4UzaN5BA+RUA5E8NChNKuNNof76j2S9tilfN/kvpy4fw="));
-
-    sql1_ns = RRsetPtr(new RRset(sql1_name, RRClass::IN(),
+    example_ns->addRdata(generic::NS(dns01));
+    example_ns->addRdata(generic::NS(dns02));
+    example_ns->addRdata(generic::NS(dns03));
+
+    rp = new RRset(example, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+    rrsig->addRdata(generic::RRSIG("NS 5 2 3600 20100322084538 20100220084538 33495 example.com. ClcrfjkQZUY5L6ZlCkU3cJHzcrEGrofKSVeeoeZ+w6yeEowFNVXs2YBo3tom53DiCrdD9rs3feVSLGW5rjsz/O6lDuomgQG+EVSnWa7GTIPBXj1BmDXXp3XxeldYmhf4UzaN5BA+RUA5E8NChNKuNNof76j2S9tilfN/kvpy4fw="));
+    example_ns->addRRsig(rrsig);
+
+    example_soa = RRsetPtr(new RRset(example, RRClass::IN(),
+                                    RRType::SOA(), RRTTL(3600)));
+    example_soa->addRdata(generic::SOA("master.example.com. admin.example.com. 1234 3600 1800 2419200 7200"));
+
+    rp = new RRset(example, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+    rrsig->addRdata(generic::RRSIG("SOA 5 2 3600 20100322084538 20100220084538 33495 example.com.  KUun66Qaw36osk2BJS6U1fAy3PPDkNo2QK4meGNbDBY8q8b+f2o+IXJ14YCvssGl1ORW0CcLnDRxssnk8V/Svmj5iFhO+8HC2hnVBdi2zewvdVtwRb+lWwKN7pkXXwuy6g1t9WCd/j5FCc/wgxqtZUTPb6XgZcnHrORDMOTqLs4="));
+    example_soa->addRRsig(rrsig);
+
+    example_nsec = RRsetPtr(new RRset(example, RRClass::IN(),
+                                      RRType::NSEC(), RRTTL(3600)));
+    example_nsec->addRdata(generic::NSEC("cname-ext.example.com. NS SOA MX RRSIG NSEC DNSKEY"));
+    rp = new RRset(example, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+
+    rrsig->addRdata(generic::RRSIG("NSEC 5 2 7200 20100322084538 20100220084538 33495 example.com. KxuVaPPKNPJzr/q+cJPiNlkHVTQK0LVsgTbSqruXQc25lAd0wn5oKUtxL1bEAchHkfA8eLzcYCj2ZqqAv9OJubw53mfskTad7UHs4Uj2RTrIsNGMCiZGgOpvNb9JcWpQtoyXVT1uNse+Qsbeir0eyeYIufUynFU041jtNrlJMio="));
+    example_nsec->addRRsig(rrsig);
+
+    // sql1.example.com
+    sql1_ns = RRsetPtr(new RRset(sql1, RRClass::IN(),
                                  RRType::NS(), RRTTL(3600)));
-    sql1_ns->addRdata(generic::NS(Name("dns01.example.com")));
-    sql1_ns->addRdata(generic::NS(Name("dns02.example.com")));
-    sql1_ns->addRdata(generic::NS(Name("dns03.example.com")));
-
-    sql1_rrsig = RRsetPtr(new RRset(sql1_name, RRClass::IN(),
-                                    RRType::RRSIG(), RRTTL(3600)));
-    sql1_rrsig->addRdata(generic::RRSIG("NS 5 3 3600 20100322084536 20100220084536 12447 sql1.example.com. 0CL8noy0NSgoWwuKd+Dc6vyIIw2BrAEBx0IJzcSB6GlB25x/zjEd6AJG0be13HN6jOaTX8iWTuCVrEYuXg76V+M4EvTZHjEScj0az74TrDv4Vdo459paGKCX9B8NLJW1mW4fzZrrXQ8jmBEZeS91Q5rJrO+UKJEuUz3LYdTPvao="));
-
-    www_sql1_a = RRsetPtr(new RRset(Name("www.sql1.example.com"),
+    sql1_ns->addRdata(generic::NS(dns01));
+    sql1_ns->addRdata(generic::NS(dns02));
+    sql1_ns->addRdata(generic::NS(dns03));
+
+    rp = new RRset(sql1, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+    rrsig->addRdata(generic::RRSIG("NS 5 3 3600 20100322084536 20100220084536 12447 sql1.example.com. 0CL8noy0NSgoWwuKd+Dc6vyIIw2BrAEBx0IJzcSB6GlB25x/zjEd6AJG0be13HN6jOaTX8iWTuCVrEYuXg76V+M4EvTZHjEScj0az74TrDv4Vdo459paGKCX9B8NLJW1mW4fzZrrXQ8jmBEZeS91Q5rJrO+UKJEuUz3LYdTPvao="));
+    sql1_ns->addRRsig(rrsig);
+
+    sql1_soa = RRsetPtr(new RRset(sql1, RRClass::IN(),
+                                 RRType::SOA(), RRTTL(3600)));
+    sql1_soa->addRdata(generic::SOA("master.example.com. admin.example.com. 678 3600 1800 2419200 7200"));
+
+    rp = new RRset(sql1, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+    rrsig->addRdata(generic::RRSIG("SOA 5 3 3600 20100322084536 20100220084536 12447 sql1.example.com. oakulfyljL/RAKgCKXEZ3KsG8BJj5WG4JK4moWFB6c9OKem6jIk8hKP2XlUVXFuOYJlRdIM4KicmR2GAK+5jJp6z5ShssstYTXo3QosVm6oCKumuFeLFHzcjfqP1D+F9NsvHldJIBnS/4ebPkmR5OENyCZXQF5HmN2awIj4CLjE="));
+    sql1_soa->addRRsig(rrsig);
+
+    sql1_nsec = RRsetPtr(new RRset(sql1, RRClass::IN(),
+                                      RRType::NSEC(), RRTTL(3600)));
+    sql1_nsec->addRdata(generic::NSEC("www.sql1.example.com. NS SOA RRSIG NSEC DNSKEY"));
+    rp = new RRset(sql1, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+
+    rrsig->addRdata(generic::RRSIG("NSEC 5 3 7200 20100322084536 20100220084536 12447 sql1.example.com. v71CgdTYccCiTqfRcn6HsvISQa8ruvUfCKtpwym0RW/G27xlZn8otj2IMtWwkLxti8Rqqu+PTViLaOIbeVfHBcqzAd7U59cAOYoq3ODZx6auiE3C23HAKqUavKcP7Esaajm1cbcWy6Kyie4CAZc8M7EeKxgkXMKJGqBQzF+/FOo="));
+    sql1_nsec->addRRsig(rrsig);
+    sql1_ds = RRsetPtr(new RRset(sql1, RRClass::IN(),
+                                 RRType::DS(), RRTTL(3600)));
+    sql1_ds->addRdata(generic::DS("33313 5 1 0FDD7A2C11AA7F55D50FBF9B7EDDA2322C541A8D"));
+    sql1_ds->addRdata(generic::DS("33313 5 2 00B99B7006F496D135B01AB17EDB469B4BE9E1973884DEA757BC4E3015A8C3AB"));
+
+    rp = new RRset(sql1, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+    rrsig->addRdata(generic::RRSIG("DS 5 3 3600 20100322084538 20100220084538 33495 example.com. dIqZKvpkJN1l92SOiWgJh3KbjErIN+EfojMsm4pEdV5xQdZwj6DNNEu6Kw4rRwdvrZIu0TyqPr3jSJb7o6R7vZgZzmLfVV/ojQah7rwuYHCFcfyZ4JyK2311fMhRR1QAvMsdcjdyA1XC140Cm6AnL3cH5rh/KUks/0ec3Ca7GNQ="));
+    sql1_ds->addRRsig(rrsig);
+
+
+    sql1_ds_nsec = RRsetPtr(new RRset(sql1, RRClass::IN(),
+                                   RRType::NSEC(), RRTTL(3600)));
+    sql1_ds_nsec->addRdata(generic::NSEC("subzone.example.com. NS DS RRSIG NSEC"));
+    rp = new RRset(sql1, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+    rrsig->addRdata(generic::RRSIG("NSEC 5 3 7200 20100322084538 20100220084538 33495 example.com. k9FRdFyk/cPdkmmaoZbGZPpzIzfbFWQ3QCHd2qhJa0xAXaEOT/GBL6aFqx9SlunDu2wgES+To5fWPZGi4NzWpp6c5t27rnATN/oCEQ/UYIJKmWbqrXdst0Ps5boznk7suK2Y+km31KxaIf3fDd/T3kZCVsR0aWKRRRatPb7GfLw="));
+    sql1_ds_nsec->addRRsig(rrsig);
+
+    // www.sql1.example.com
+    www_sql1_a = RRsetPtr(new RRset(www_sql1,
                                     RRClass::IN(), RRType::A(),
                                     RRTTL(3600)));
     www_sql1_a->addRdata(in::A("192.168.2.2"));
 
-    www_sql1_rrsig = RRsetPtr(new RRset(Name("www.sql1.example.com"),
-                                        RRClass::IN(), RRType::RRSIG(),
-                                        RRTTL(3600)));
-    www_sql1_rrsig->addRdata(generic::RRSIG("A 5 4 3600 20100322084536 20100220084536 12447 sql1.example.com. DNdVKxB3oBsB14NPoV9WG14Y/g4zMcIXLYnFjj9vRZRZJpAvbTEipiXlayuhOxnqU827OipETQyeULZmLsqIQ1wK4Fgf+9b5aJ8D85/o4wBka00X4hZ3MwDPRb4mjuogwBTBg5NRpNSzUfbkPGiav08BFwgg+Efm9veSB05arS0="));
-
-    dns01_example_a = RRsetPtr(new RRset(Name("dns01.example.com"),
+    rp = new RRset(www_sql1, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+    rrsig->addRdata(generic::RRSIG("A 5 4 3600 20100322084536 20100220084536 12447 sql1.example.com. DNdVKxB3oBsB14NPoV9WG14Y/g4zMcIXLYnFjj9vRZRZJpAvbTEipiXlayuhOxnqU827OipETQyeULZmLsqIQ1wK4Fgf+9b5aJ8D85/o4wBka00X4hZ3MwDPRb4mjuogwBTBg5NRpNSzUfbkPGiav08BFwgg+Efm9veSB05arS0="));
+    www_sql1_a->addRRsig(rrsig);
+
+    www_sql1_nsec = RRsetPtr(new RRset(www_sql1,
+                                       RRClass::IN(), RRType::NSEC(),
+                                       RRTTL(3600)));
+    www_sql1_nsec->addRdata(generic::NSEC("sql1.example.com. A RRSIG NSEC"));
+    rp = new RRset(www_sql1, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+
+    rrsig->addRdata(generic::RRSIG("NSEC 5 4 7200 20100322084536 20100220084536 12447 sql1.example.com. cJMJhDx/ND7/9j3zhyXe+6eaSsU7ByYpXhJzbe+OhjFgH0VasQXq7o1QB3I293UZ+yhkjgXap+9QtPlraaNaYyTyOMQ42OoxSefJpYz9CME/FI2tsUfyrCnLFxYRNet7sMS0q+hLqxRayuEHDFDp72hHPGLJQ8a7jq4SrIonT50="));
+    www_sql1_nsec->addRRsig(rrsig);
+
+    // dns01.example.com
+    dns01_a = RRsetPtr(new RRset(dns01,
                                          RRClass::IN(), RRType::A(),
                                          RRTTL(3600)));
-    dns01_example_a->addRdata(in::A("192.168.2.1"));
-
-    dns01_example_rrsig = RRsetPtr(new RRset(Name("dns01.example.com"),
-                                         RRClass::IN(), RRType::RRSIG(),
-                                         RRTTL(3600)));
-    dns01_example_rrsig->addRdata(generic::RRSIG("A 5 3 3600 20100322084538 20100220084538 33495 example.com. NIawlZLk8WZAjNux7oQM2mslfW52OZFFkWt++7FHu2SU98XqEeKfCMnpgtWe5T8Nr9cS8df901iEOJoWQzGTEaHYUBtEhsSjBVn7mKp3fz6473a2xxy75SUKZ0rxjNXSZ8Q5rnFmkX0HTH2Sg51mtjH6aC2pfheQnA2t193BnSg="));
-
-    dns02_example_a = RRsetPtr(new RRset(Name("dns02.example.com"),
+    dns01_a->addRdata(in::A("192.168.2.1"));
+
+    rp = new RRset(dns01, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+    rrsig->addRdata(generic::RRSIG("A 5 3 3600 20100322084538 20100220084538 33495 example.com. NIawlZLk8WZAjNux7oQM2mslfW52OZFFkWt++7FHu2SU98XqEeKfCMnpgtWe5T8Nr9cS8df901iEOJoWQzGTEaHYUBtEhsSjBVn7mKp3fz6473a2xxy75SUKZ0rxjNXSZ8Q5rnFmkX0HTH2Sg51mtjH6aC2pfheQnA2t193BnSg="));
+    dns01_a->addRRsig(rrsig);
+
+    dns01_nsec = RRsetPtr(new RRset(dns01, RRClass::IN(), RRType::NSEC(), RRTTL(3600)));
+    dns01_nsec->addRdata(generic::NSEC("dns02.example.com. A RRSIG NSEC"));
+
+    rp = new RRset(dns01, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+    rrsig->addRdata(generic::RRSIG("NSEC 5 3 7200 20100322084538 20100220084538 33495 example.com. EkyeshmMNP9xiAz6mDFDIwksTdmkF9zsFzLuVKAgK6eUk7St6tp5PSvjA8nWol0vdvvz4LK85a4ffTFEiNRyvWeYP2vOhEkyDcrwuCd8Vc3jh/8Sm1Js+nX7hJStrZGFvp2TWPpt9nKH5p3MxXvTb/YVurnue0xSeFAE17O3+I0="));
+    dns01_nsec->addRRsig(rrsig);
+
+    // dns02.example.com
+    dns02_a = RRsetPtr(new RRset(dns02, RRClass::IN(), RRType::A(), RRTTL(3600)));
+    dns02_a->addRdata(in::A("192.168.2.2"));
+
+    rp = new RRset(dns02, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+    rrsig->addRdata(generic::RRSIG("A 5 3 3600 20100322084538 20100220084538 33495 example.com. XJtVMbUIRE0mk6Hn/Nx6k36jaxaBDPK2/IYB6vCQjJETz6gW4T6q/H/eY9/Lsw5iYPFhoBRDxT4XFj575t98kELXnJe1WhuMbRPlOhyOjxkLECaUne/sbFPOtbGFx9ohuojI0RgxxZiCFaO8wJuv6nfPuzmlLajWS6z9NZeOMIk="));
+    dns02_a->addRRsig(rrsig);
+
+    dns02_nsec = RRsetPtr(new RRset(dns02, RRClass::IN(),
+                                      RRType::NSEC(), RRTTL(3600)));
+    dns02_nsec->addRdata(generic::NSEC("dns03.example.com. A RRSIG NSEC"));
+    rp = new RRset(dns02, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+
+    rrsig->addRdata(generic::RRSIG("NSEC 5 3 7200 20100322084538 20100220084538 33495 example.com. imBNTMB3sPU4kblcaAH6V7lCVt5xgtAybi3DA/SbLEulLaV2NE6vcoEn/AieaM4mOJicQnUDj/H+1hSEhzxU2tRM8zfVlvztxQWn6eh7ZR4mKfNDSvRUGU9ykhpwMyC7wjOt1j5bcSA/OTnLRAilslnJyOM4bSaxVEFo8YPjncY="));
+    dns02_nsec->addRRsig(rrsig);
+
+    // dns03.example.com
+    dns03_a = RRsetPtr(new RRset(dns03,
                                          RRClass::IN(), RRType::A(),
                                          RRTTL(3600)));
-    dns02_example_a->addRdata(in::A("192.168.2.2"));
-
-    dns02_example_rrsig = RRsetPtr(new RRset(Name("dns02.example.com"),
-                                         RRClass::IN(), RRType::RRSIG(),
-                                         RRTTL(3600)));
-    dns02_example_rrsig->addRdata(generic::RRSIG("A 5 3 3600 20100322084538 20100220084538 33495 example.com. XJtVMbUIRE0mk6Hn/Nx6k36jaxaBDPK2/IYB6vCQjJETz6gW4T6q/H/eY9/Lsw5iYPFhoBRDxT4XFj575t98kELXnJe1WhuMbRPlOhyOjxkLECaUne/sbFPOtbGFx9ohuojI0RgxxZiCFaO8wJuv6nfPuzmlLajWS6z9NZeOMIk="));
-
-    dns03_example_a = RRsetPtr(new RRset(Name("dns03.example.com"),
-                                         RRClass::IN(), RRType::A(),
-                                         RRTTL(3600)));
-    dns03_example_a->addRdata(in::A("192.168.2.3"));
-
-    dns03_example_rrsig = RRsetPtr(new RRset(Name("dns03.example.com"),
-                                         RRClass::IN(), RRType::RRSIG(),
-                                         RRTTL(3600)));
-    dns03_example_rrsig->addRdata(generic::RRSIG("A 5 3 3600 20100322084538 20100220084538 33495 example.com. Ubrcm1H+F6m8khle7P9zU8eO+Jtuj+1Vx1MM5KAkmZPJwQe9uTcoCpQa6DXOGG9kajDTnNN1Be1gkZuJDTZJG4SmJLXLbNY3RDnxpGmWta3qs/VgDq78/YM8ropt1/s7YKyrCfGE2ff+FUB0mLObiG01ZV2gu5HJzgE7SEWLEiI="));
-
-    www_example_a = RRsetPtr(new RRset(Name("www.example.com"),
-                                       RRClass::IN(), RRType::A(),
+    dns03_a->addRdata(in::A("192.168.2.3"));
+
+    rp = new RRset(dns03, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+    rrsig->addRdata(generic::RRSIG("A 5 3 3600 20100322084538 20100220084538 33495 example.com. Ubrcm1H+F6m8khle7P9zU8eO+Jtuj+1Vx1MM5KAkmZPJwQe9uTcoCpQa6DXOGG9kajDTnNN1Be1gkZuJDTZJG4SmJLXLbNY3RDnxpGmWta3qs/VgDq78/YM8ropt1/s7YKyrCfGE2ff+FUB0mLObiG01ZV2gu5HJzgE7SEWLEiI="));
+    dns03_a->addRRsig(rrsig);
+
+    dns03_nsec = RRsetPtr(new RRset(dns03, RRClass::IN(),
+                                      RRType::NSEC(), RRTTL(3600)));
+    dns03_nsec->addRdata(generic::NSEC("foo.example.com. A RRSIG NSEC"));
+    rp = new RRset(dns03, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+
+    rrsig->addRdata(generic::RRSIG("NSEC 5 3 7200 20100322084538 20100220084538 33495 example.com.  nn829Xw5CJFnPHwI9WHeT5epQv+odtCkHnjlPFGoPTLOyiks+041UmMqtq3uiSp4d2meMSe9UuDvoROT0L6NTtQQvVqiDhTn0irTFw1uw7fO8ZTG7eyu6Ypfz0+HvfbNvd4kMoD2OTgADRXPVsCTwK+PBOIIG9YTEQfl8pCqW5g="));
+    dns03_nsec->addRRsig(rrsig);
+
+    // www.example.com
+    www_a = RRsetPtr(new RRset(www, RRClass::IN(), RRType::A(),
                                        RRTTL(3600)));
-    www_example_a->addRdata(in::A("192.168.1.1"));
-
-    www_example_rrsig = RRsetPtr(new RRset(Name("www.example.com"),
-                                       RRClass::IN(), RRType::RRSIG(),
-                                       RRTTL(3600)));
-    www_example_rrsig->addRdata(generic::RRSIG("A 5 3 3600 20100322084538 20100220084538 33495 example.com. qyFyyV/mE8x4pdhudr5iycwhDsva31MzwO1kBR+bDKvzJg8mN8KxlPZrOlNNUhd3YRXQVwieMyxOTWRPXoxrNEDkNwimXkfe3rrHY7ibV9eNS4OIBUjb44VjCNr9CmQSzfuQ2yxO2r+YIuPYHRCjieD4xh6t9ay4IaCN/tDAJ+Q="));
-
-    wild_example_a = RRsetPtr(new RRset(Name("*.wild.example.com"),
-                                        RRClass::IN(), RRType::A(),
+    www_a->addRdata(in::A("192.168.1.1"));
+
+    rp = new RRset(www, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+    rrsig->addRdata(generic::RRSIG("A 5 3 3600 20100322084538 20100220084538 33495 example.com. qyFyyV/mE8x4pdhudr5iycwhDsva31MzwO1kBR+bDKvzJg8mN8KxlPZrOlNNUhd3YRXQVwieMyxOTWRPXoxrNEDkNwimXkfe3rrHY7ibV9eNS4OIBUjb44VjCNr9CmQSzfuQ2yxO2r+YIuPYHRCjieD4xh6t9ay4IaCN/tDAJ+Q="));
+    www_a->addRRsig(rrsig);
+
+    www_nsec = RRsetPtr(new RRset(www, RRClass::IN(),
+                                  RRType::NSEC(), RRTTL(3600)));
+    www_nsec->addRdata(generic::NSEC("example.com. A RRSIG NSEC"));
+    rp = new RRset(www, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+
+    rrsig->addRdata(generic::RRSIG("NSEC 5 3 7200 20100322084538 20100220084538 33495 example.com. ZLZlSVBa2oe4U+7SZASnypP2VkI5gg1/1cVGqYUvfYNIUkcVMWDgn7DZCfpmo+2vdlV/4VhAc+sjDd+X+e57XGnW8+lqZHvG6NMMhmSGmeATD3D+8lEJJGo0dxoN4rHJQyp/eT2S4nChz+D/ze+YRagYxGF7pXm9zcrw3kKZGTs="));
+    www_nsec->addRRsig(rrsig);
+
+    // *.wild.example.com
+    wild_a = RRsetPtr(new RRset(wild, RRClass::IN(), RRType::A(),
                                         RRTTL(3600)));
-    wild_example_a->addRdata(in::A("192.168.3.2"));
-
-    wild_example_rrsig = RRsetPtr(new RRset(Name("*.wild.example.com"),
-                                        RRClass::IN(), RRType::RRSIG(),
-                                        RRTTL(3600)));
-    wild_example_rrsig->addRdata(generic::RRSIG("A 5 3 3600 20100322084538 20100220084538 33495 example.com. FdO+UWONgtLKFxUzzygGunw67F9y8SzsP7yOLEYVJclRR8X3Ii62L0gtQHq2y0TcKsXttRsD6XY+tM5P/pgXlTNi7Bk4Fgb0PIDPjOsfT4DrS80kWn0YbinM/4/FA1j5ru5sTTboOY5UGhvDnoA9ogNuQQYb2/3wkoH0PrA2Q/0="));
-
-    foo_example_cname = RRsetPtr(new RRset(Name("foo.example.com"),
-                                           RRClass::IN(), RRType::CNAME(),
+    wild_a->addRdata(in::A("192.168.3.2"));
+
+    rp = new RRset(wild, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+    rrsig->addRdata(generic::RRSIG("A 5 3 3600 20100322084538 20100220084538 33495 example.com. FdO+UWONgtLKFxUzzygGunw67F9y8SzsP7yOLEYVJclRR8X3Ii62L0gtQHq2y0TcKsXttRsD6XY+tM5P/pgXlTNi7Bk4Fgb0PIDPjOsfT4DrS80kWn0YbinM/4/FA1j5ru5sTTboOY5UGhvDnoA9ogNuQQYb2/3wkoH0PrA2Q/0="));
+    wild_a->addRRsig(rrsig);
+
+    wild_nsec = RRsetPtr(new RRset(wild, RRClass::IN(),
+                                   RRType::NSEC(), RRTTL(3600)));
+    wild_nsec->addRdata(generic::NSEC("www.example.com. A RRSIG NSEC"));
+    rp = new RRset(wild, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+
+    rrsig->addRdata(generic::RRSIG("NSEC 5 3 7200 20100322084538 20100220084538 33495 example.com. OoGYslRj4xjZnBuzgOqsrvkDAHWycmQzbUxCRmgWnCbXiobJK7/ynONH3jm8G3vGlU0lwpHkhNs6cUK+6Nu8W49X3MT0Xksl/brroLcXYLi3vfxnYUNMMpXdeFl6WNNfoJRo90F/f/TWXAClRrDS29qiG3G1PEJZikIxZsZ0tyM="));
+    wild_nsec->addRRsig(rrsig);
+
+    // foo.example.com
+    foo_cname = RRsetPtr(new RRset(foo, RRClass::IN(), RRType::CNAME(),
                                            RRTTL(3600)));
-    foo_example_cname->addRdata(generic::CNAME("cnametest.flame.org"));
-
-    foo_example_rrsig = RRsetPtr(new RRset(Name("foo.example.com"),
-                                           RRClass::IN(), RRType::RRSIG(),
-                                           RRTTL(3600)));
-    foo_example_rrsig->addRdata(generic::RRSIG("CNAME 5 3 3600 20100322084538 20100220084538 33495 example.com. DSqkLnsh0gCeCPVW/Q8viy9GNP+KHmFGfWqyVG1S6koBtGN/VQQ16M4PHZ9Zssmf/JcDVJNIhAChHPE2WJiaPCNGTprsaUshf1Q2vMPVnkrJKgDY8SVRYMptmT8eaT0gGri4KhqRoFpMT5OYfesybwDgfhFSQQAh6ps3bIUsy4o="));
-
-    cnameint_example_cname = RRsetPtr(new RRset(Name("cname-int.example.com"),
-                                                RRClass::IN(), RRType::CNAME(),
-                                                RRTTL(3600)));
-    cnameint_example_cname->addRdata(generic::CNAME("www.exmaple.com"));
-
-    cnameint_example_rrsig = RRsetPtr(new RRset(Name("cname-int.example.com"),
-                                                RRClass::IN(),
-                                                RRType::RRSIG(),
-                                                RRTTL(3600)));
-    cnameint_example_rrsig->addRdata(generic::RRSIG("CNAME 5 3 3600 20100322084538 20100220084538 33495 example.com. U1wjt0XY9xjTwvUmWSUcfLGMhCjfX2ylWfHrycy50x2oxcK9z94E1ejen9wDTIEBSGYgi6wpZ8RK0+02N1DWTGpDqNXd7aFRfDrWQJ/q/XJHDx0vlcmhkWhrT82LBfKxkrptOzchuSo/c0mpK+mpiIMc1VOwY+yuQ2ALfcD6EHw="));
-
-    cnameext_example_cname = RRsetPtr(new RRset(Name("cname-ext.example.com"),
-                                                RRClass::IN(), RRType::CNAME(),
-                                                RRTTL(3600)));
-    cnameext_example_cname->addRdata(generic::CNAME("www.sql1.example.com"));
-
-    cnameext_example_rrsig = RRsetPtr(new RRset(Name("cname-ext.example.com"),
-                                                RRClass::IN(),
-                                                RRType::RRSIG(),
-                                                RRTTL(3600)));
-    cnameext_example_rrsig->addRdata(generic::RRSIG("CNAME 5 3 3600 20100322084538 20100220084538 33495 example.com. bGPIuZilyygvTThK4BrdECuaBcnZUgW/0d09iN2CrNjckchQl3dtbnMNirFsVs9hShDSldRNlQpiAVMpnPgXHhReNum7jmX6yqIH6s8GKIo91zr3VL/ramlezie5w4MilDHrxXLK2pb8IHmP+ZHivQ2EtdYQZgETWBWxr5FDfwk="));
-
-    dname = RRsetPtr(new RRset(Name("dname.example.com"),
-                               RRClass::IN(), RRType::DNAME(),
+    foo_cname->addRdata(generic::CNAME("cnametest.flame.org"));
+
+    rp = new RRset(foo, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+    rrsig->addRdata(generic::RRSIG("CNAME 5 3 3600 20100322084538 20100220084538 33495 example.com. DSqkLnsh0gCeCPVW/Q8viy9GNP+KHmFGfWqyVG1S6koBtGN/VQQ16M4PHZ9Zssmf/JcDVJNIhAChHPE2WJiaPCNGTprsaUshf1Q2vMPVnkrJKgDY8SVRYMptmT8eaT0gGri4KhqRoFpMT5OYfesybwDgfhFSQQAh6ps3bIUsy4o="));
+    foo_cname->addRRsig(rrsig);
+
+    foo_nsec = RRsetPtr(new RRset(foo, RRClass::IN(),
+                                  RRType::NSEC(), RRTTL(3600)));
+    foo_nsec->addRdata(generic::NSEC("mail.example.com. CNAME RRSIG NSEC"));
+    rp = new RRset(foo, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+
+    rrsig->addRdata(generic::RRSIG("NSEC 5 3 7200 20100322084538 20100220084538 33495 example.com. RTQwlSqui6StUYye1KCSOEr1d3irndWFqHBpwP7g7n+w8EDXJ8I7lYgwzHvlQt6BLAxe5fUDi7ct8M5hXvsm7FoWPZ5wXH+2/eJUCYxIw4vezKMkMwBP6M/YkJ2CMqY8DppYf60QaLDONQAr7AcK/naSyioeI5h6eaoVitUDMso="));
+    foo_nsec->addRRsig(rrsig);
+
+    // cname-int.example.com
+    cnameint_cname = RRsetPtr(new RRset(cnameint, RRClass::IN(),
+                                        RRType::CNAME(), RRTTL(3600)));
+    cnameint_cname->addRdata(generic::CNAME("www.example.com"));
+
+    rp = new RRset(cnameint, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+    rrsig->addRdata(generic::RRSIG("CNAME 5 3 3600 20100322084538 20100220084538 33495 example.com. U1wjt0XY9xjTwvUmWSUcfLGMhCjfX2ylWfHrycy50x2oxcK9z94E1ejen9wDTIEBSGYgi6wpZ8RK0+02N1DWTGpDqNXd7aFRfDrWQJ/q/XJHDx0vlcmhkWhrT82LBfKxkrptOzchuSo/c0mpK+mpiIMc1VOwY+yuQ2ALfcD6EHw="));
+    cnameint_cname->addRRsig(rrsig);
+
+    cnameint_nsec = RRsetPtr(new RRset(cnameint, RRClass::IN(),
+                                      RRType::NSEC(), RRTTL(3600)));
+    cnameint_nsec->addRdata(generic::NSEC("dname.example.com. CNAME RRSIG NSEC"));
+    rp = new RRset(cnameint, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+
+    rrsig->addRdata(generic::RRSIG("NSEC 5 3 7200 20100322084538 20100220084538 33495 example.com. rbV+gaxfrsoha59NOLF4EFyWQ+GuFCVK/8D77x1atan3HNlXBlZ1smgudKTaJ3CtlobIDt0MEdPxY1yn2Tskw/5mlP1PWf8oaP3BwGSQdn4gLI8+sMpNOPFEdXpxqxngm2F6/7fqniL1QuSAQBEdO+5UiCAgnncPmAsSJg3u1zg="));
+    cnameint_nsec->addRRsig(rrsig);
+
+    // cname-ext.example.com
+    cnameext_cname = RRsetPtr(new RRset(cnameext, RRClass::IN(),
+                                        RRType::CNAME(), RRTTL(3600)));
+    cnameext_cname->addRdata(generic::CNAME("www.sql1.example.com"));
+
+    rp = new RRset(cnameext, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+    rrsig->addRdata(generic::RRSIG("CNAME 5 3 3600 20100322084538 20100220084538 33495 example.com. bGPIuZilyygvTThK4BrdECuaBcnZUgW/0d09iN2CrNjckchQl3dtbnMNirFsVs9hShDSldRNlQpiAVMpnPgXHhReNum7jmX6yqIH6s8GKIo91zr3VL/ramlezie5w4MilDHrxXLK2pb8IHmP+ZHivQ2EtdYQZgETWBWxr5FDfwk="));
+    cnameext_cname->addRRsig(rrsig);
+
+    cnameext_nsec = RRsetPtr(new RRset(cnameext, RRClass::IN(),
+                                      RRType::NSEC(), RRTTL(3600)));
+    cnameext_nsec->addRdata(generic::NSEC("cname-int.example.com. CNAME RRSIG NSEC"));
+    rp = new RRset(cnameext, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+
+    rrsig->addRdata(generic::RRSIG("NSEC 5 3 7200 20100322084538 20100220084538 33495 example.com. inWsFwSDWG7TakjwbUTzTRpXz0WifelA5Kn3ABk6BVirIPmd+yQoNj2QZBDFAQwhnLPlNws2Oo4vgMsBMyx1Fv5eHgMUuCN3DUDaLlzlPtUb42CjOUa+jZBeTV/Hd7WZrirluASE1QFDprLdSSqoPPfAKvN3pORtW7y580dMOIM="));
+    cnameext_nsec->addRRsig(rrsig);
+
+    // dname.example.com
+    dname_dname = RRsetPtr(new RRset(dname, RRClass::IN(), RRType::DNAME(),
                                RRTTL(3600)));
-    dname->addRdata(generic::DNAME("sql1.example.com"));
-
-    dname_rrsig = RRsetPtr(new RRset(Name("dname.example.com"),
-                               RRClass::IN(), RRType::RRSIG(),
-                               RRTTL(3600)));
-    dname_rrsig->addRdata(generic::RRSIG("DNAME 5 3 3600 20100322084538 20100220084538 33495 example.com. ae8U47oaiwWdurkSyzcsCAF6DxBqjukizwF7K7U6lQVMtfoUE14oiAqfj1fjH8YLDOO/Hd1twrd/u0vgjnI1Gg32YTi7cYOzwE912SV1u2B/y0awaQKWPBwOW0aI7vxelt1vMUF81xosiQD04gOIdDBTqbHKcDxum87iWbhk4Ug="));
+    dname_dname->addRdata(generic::DNAME("sql1.example.com."));
+
+    rp = new RRset(dname, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+    rrsig->addRdata(generic::RRSIG("DNAME 5 3 3600 20100322084538 20100220084538 33495 example.com. ae8U47oaiwWdurkSyzcsCAF6DxBqjukizwF7K7U6lQVMtfoUE14oiAqfj1fjH8YLDOO/Hd1twrd/u0vgjnI1Gg32YTi7cYOzwE912SV1u2B/y0awaQKWPBwOW0aI7vxelt1vMUF81xosiQD04gOIdDBTqbHKcDxum87iWbhk4Ug="));
+    dname_dname->addRRsig(rrsig);
+
+    dname_nsec = RRsetPtr(new RRset(dname, RRClass::IN(),
+                                      RRType::NSEC(), RRTTL(3600)));
+    dname_nsec->addRdata(generic::NSEC("dns01.example.com. DNAME RRSIG NSEC"));
+    rp = new RRset(dname, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+
+    rrsig->addRdata(generic::RRSIG("NSEC 5 3 7200 20100322084538 20100220084538 33495 example.com. c21Fff2D8vBrLzohBnUeflkaRdUAnUxAFGp+UQ0miACDCMOFBlCS9v9g/2+orOnKfd3l4vyz55C310t8JXgXb119ofaZWj2zkdUe+X8Bax+sMS0Y5K/sUhSNvbJbozr9UYPdvjSVBiWgh3s9fsb+etKq9uFukAzGU/FuGYpO0r0="));
+    dname_nsec->addRRsig(rrsig);
+
+    // subzone.example.com
+    subzone_ns = RRsetPtr(new RRset(subzone, RRClass::IN(), RRType::NS(),
+                                    RRTTL(3600)));
+    subzone_ns->addRdata(generic::NS(Name("ns1.subzone.example.com")));
+    subzone_ns->addRdata(generic::NS(Name("ns2.subzone.example.com")));
+
+    subzone_ds = RRsetPtr(new RRset(subzone, RRClass::IN(), RRType::DS(),
+                                    RRTTL(3600)));
+
+    subzone_glue1 = RRsetPtr(new RRset(Name("ns1.subzone.example.com"),
+                                    RRClass::IN(), RRType::A(),
+                                    RRTTL(3600)));
+    subzone_glue1->addRdata(in::A("192.168.3.1"));
+    subzone_glue2 = RRsetPtr(new RRset(Name("ns2.subzone.example.com"),
+                                    RRClass::IN(), RRType::A(),
+                                    RRTTL(3600)));
+    subzone_glue2->addRdata(in::A("192.168.3.2"));
+
+    subzone_ds = RRsetPtr(new RRset(subzone, RRClass::IN(), RRType::DS(),
+                                    RRTTL(3600)));
+
+    subzone_ds->addRdata(generic::DS("33313 5 1 0FDD7A2C11AA7F55D50FBF9B7EDDA2322C541A8D"));
+    subzone_ds->addRdata(generic::DS("33313 5 2 00B99B7006F496D135B01AB17EDB469B4BE9E1973884DEA757BC4E3015A8C3AB"));
+
+    rp = new RRset(subzone, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+    rrsig->addRdata(generic::RRSIG("DS 5 3 3600 20100322084538 20100220084538 33495 example.com. dIqZKvpkJN1l92SOiWgJh3KbjErIN+EfojMsm4pEdV5xQdZwj6DNNEu6Kw4rRwdvrZIu0TyqPr3jSJb7o6R7vZgZzmLfVV/ojQah7rwuYHCFcfyZ4JyK2311fMhRR1QAvMsdcjdyA1XC140Cm6AnL3cH5rh/KUks/0ec3Ca7GNQ="));
+    subzone_ds->addRRsig(rrsig);
+
+    subzone_nsec = RRsetPtr(new RRset(subzone, RRClass::IN(),
+                                      RRType::NSEC(), RRTTL(3600)));
+    subzone_nsec->addRdata(generic::NSEC("*.wild.example.com. NS DS RRSIG NSEC"));
+    rp = new RRset(subzone, RRClass::IN(), RRType::RRSIG(), RRTTL(3600));
+    rrsig = RRsetPtr(rp);
+
+    rrsig->addRdata(generic::RRSIG("NSEC 5 3 7200 20100322084538 20100220084538 33495 example.com. Oe2kgIhsLtPJ4+lDZDxznV8/vEVoXKOBFN9lwWyebaKa19BaSXlQ+YVejmulmKDDjEucMvEfuItfn6w7bnU+DzOLk5D1lJCjwDlKz8u3xOAx16TiuQn4bgQAOiFtBQygmGGqO3BVpX+jxsmw7eH3emofy8uUqr/C4aopnwuf28g="));
+    subzone_nsec->addRRsig(rrsig);
 }
 
 void
@@ -169,20 +369,246 @@
     const Name& qname = match.qname();
     NameComparisonResult::NameRelation cmp;
 
-    cmp = qname.compare(sql1_name).getRelation();
+    cmp = qname.compare(sql1).getRelation();
     if (cmp == NameComparisonResult::EQUAL ||
-        cmp == NameComparisonResult::SUBDOMAIN) {
-        match.update(*this, sql1_name);
+          cmp == NameComparisonResult::SUBDOMAIN) {
+        match.update(*this, sql1);
         return;
     }
 
-    cmp = qname.compare(example_name).getRelation();
+    cmp = qname.compare(example).getRelation();
     if (cmp == NameComparisonResult::EQUAL ||
-        cmp == NameComparisonResult::SUBDOMAIN) {
-        match.update(*this, example_name);
+          cmp == NameComparisonResult::SUBDOMAIN) {
+        match.update(*this, example);
         return;
     }
 
+}
+
+void
+TestDataSrc::findRecords(const Name& name, const RRType& rdtype,
+                         RRsetList& target, Name* zone, const Mode mode,
+                         uint32_t& flags) const
+{
+    bool any = (rdtype == RRType::ANY());
+    flags = 0;
+
+
+    if (*zone == sql1) {
+        if (name == sql1 && mode == DELEGATION) {
+            target.addRRset(sql1_ns);
+            flags |= REFERRAL;
+        } else if (name == sql1) {
+            if (any) {
+                target.addRRset(sql1_ns);
+                target.addRRset(sql1_nsec);
+                flags |= REFERRAL;
+            } else if (rdtype == RRType::NS()) {
+                target.addRRset(sql1_ns);
+                flags |= REFERRAL;
+            } else if (rdtype == RRType::SOA()) {
+                target.addRRset(sql1_soa);
+                flags |= REFERRAL;
+            } else if (rdtype == RRType::NSEC()) {
+                target.addRRset(sql1_nsec);
+                flags |= REFERRAL;
+            } else {
+                flags |= TYPE_NOT_FOUND;
+            }
+        } else if (name == www_sql1) {
+            if (any) {
+                target.addRRset(www_sql1_a);
+                target.addRRset(www_sql1_nsec);
+            } else if (rdtype == RRType::A()) {
+                target.addRRset(www_sql1_a);
+            } else if (rdtype == RRType::NSEC()) {
+                target.addRRset(www_sql1_nsec);
+                flags |= REFERRAL;
+            } else {
+                flags |= TYPE_NOT_FOUND;
+            }
+        } else {
+            flags |= NAME_NOT_FOUND;
+        }
+    } else {
+        if (name == example && mode == DELEGATION) {
+            target.addRRset(example_ns);
+            flags |= REFERRAL;
+        } else if (name == example) {
+            if (any) {
+                target.addRRset(example_ns);
+                target.addRRset(example_soa);
+                target.addRRset(example_nsec);
+                flags |= REFERRAL;
+            } else if (rdtype == RRType::NS()) {
+                target.addRRset(example_ns);
+                flags |= REFERRAL;
+            } else if (rdtype == RRType::SOA()) {
+                target.addRRset(example_soa);
+                flags |= REFERRAL;
+            } else if (rdtype == RRType::NSEC()) {
+                target.addRRset(example_nsec);
+                flags |= REFERRAL;
+            } else {
+                flags |= TYPE_NOT_FOUND;
+            }
+        } else if (name == sql1 && mode == DELEGATION) {
+            target.addRRset(sql1_ns);
+            target.addRRset(sql1_ds);
+            target.addRRset(sql1_ds_nsec);
+            flags |= REFERRAL;
+        } else if (name == sql1) {
+            if (any) {
+                target.addRRset(sql1_ns);
+                target.addRRset(sql1_ds);
+                target.addRRset(sql1_ds_nsec);
+                flags |= REFERRAL;
+            } else if (rdtype == RRType::DS()) {
+                target.addRRset(sql1_ds);
+                flags |= REFERRAL;
+            } else if (rdtype == RRType::NS()) {
+                target.addRRset(sql1_ns);
+                flags |= REFERRAL;
+            } else if (rdtype == RRType::NSEC()) {
+                target.addRRset(sql1_ds_nsec);
+                flags |= REFERRAL;
+            } else {
+                flags |= TYPE_NOT_FOUND;
+            }
+        } else if (name == subzone && mode == DELEGATION) {
+            target.addRRset(subzone_ns);
+            target.addRRset(subzone_ds);
+            flags |= REFERRAL;
+        } else if (name == subzone) {
+            if (any) {
+                target.addRRset(subzone_ns);
+                target.addRRset(subzone_nsec);
+                flags |= REFERRAL;
+            } else if (rdtype == RRType::NS()) {
+                target.addRRset(subzone_ns);
+                flags |= REFERRAL;
+            } else if (rdtype == RRType::DS()) {
+                target.addRRset(subzone_ds);
+                flags |= REFERRAL;
+            } else if (rdtype == RRType::NSEC()) {
+                target.addRRset(subzone_nsec);
+                flags |= REFERRAL;
+            } else {
+                flags |= TYPE_NOT_FOUND;
+            }
+        } else if (name == dns01 && mode == ADDRESS) {
+            target.addRRset(dns01_a);
+        } else if (name == dns01) {
+            if (any) {
+                target.addRRset(dns01_a);
+                target.addRRset(dns01_nsec);
+            } else if (rdtype == RRType::A()) {
+                target.addRRset(dns01_a);
+            } else if (rdtype == RRType::NSEC()) {
+                target.addRRset(dns01_nsec);
+            } else {
+                flags |= TYPE_NOT_FOUND;
+            }
+        } else if (name == dns02 && mode == ADDRESS) {
+            target.addRRset(dns02_a);
+        } else if (name == dns02) {
+            if (any) {
+                target.addRRset(dns02_a);
+                target.addRRset(dns02_nsec);
+            } else if (rdtype == RRType::A()) {
+                target.addRRset(dns02_a);
+            } else if (rdtype == RRType::NSEC()) {
+                target.addRRset(dns02_nsec);
+            } else {
+                flags |= TYPE_NOT_FOUND;
+            }
+        } else if (name == dns03 && mode == ADDRESS) {
+            target.addRRset(dns03_a);
+        } else if (name == dns03) {
+            if (any) {
+                target.addRRset(dns03_a);
+                target.addRRset(dns03_nsec);
+            } else if (rdtype == RRType::A()) {
+                target.addRRset(dns03_a);
+            } else if (rdtype == RRType::NSEC()) {
+                target.addRRset(dns03_nsec);
+            } else {
+                flags |= TYPE_NOT_FOUND;
+            }
+        } else if (name == wild) {
+            if (any) {
+                target.addRRset(wild_a);
+                target.addRRset(wild_nsec);
+            } else if (rdtype == RRType::A()) {
+                target.addRRset(wild_a);
+            } else if (rdtype == RRType::NSEC()) {
+                target.addRRset(wild_nsec);
+                flags |= REFERRAL;
+            } else {
+                flags |= TYPE_NOT_FOUND;
+            }
+        } else if (name == www) {
+            if (any) {
+                target.addRRset(www_a);
+                target.addRRset(www_nsec);
+            } else if (rdtype == RRType::A()) {
+                target.addRRset(www_a);
+            } else if (rdtype == RRType::NSEC()) {
+                target.addRRset(www_nsec);
+                flags |= REFERRAL;
+            } else {
+                flags |= TYPE_NOT_FOUND;
+            }
+        } else if (name == foo) {
+            if (rdtype == RRType::NSEC()) {
+                target.addRRset(foo_nsec);
+            } else {
+                target.addRRset(foo_cname);
+                if (rdtype != RRType::CNAME()) {
+                    flags |= CNAME_FOUND;
+                }
+            }
+        } else if (name == cnameint) {
+            if (rdtype == RRType::NSEC()) {
+                target.addRRset(cnameint_nsec);
+            } else {
+                target.addRRset(cnameint_cname);
+                if (rdtype != RRType::CNAME()) {
+                    flags |= CNAME_FOUND;
+                }
+            }
+        } else if (name == cnameext) {
+            if (rdtype == RRType::NSEC()) {
+                target.addRRset(cnameext_nsec);
+            } else {
+                target.addRRset(cnameext_cname);
+                if (rdtype != RRType::CNAME()) {
+                    flags |= CNAME_FOUND;
+                }
+            }
+        } else if (name == dname) {
+            if (any) {
+                target.addRRset(dname_dname);
+                target.addRRset(dname_nsec);
+                flags |= REFERRAL;
+            } else if (rdtype == RRType::DNAME()) {
+                target.addRRset(dname_dname);
+                flags |= REFERRAL;
+            } else if (rdtype == RRType::NSEC()) {
+                target.addRRset(dns01_nsec);
+                flags |= REFERRAL;
+            } else {
+                flags |= TYPE_NOT_FOUND;
+            }
+        } else if (name == Name("ns1.subzone.example.com") && mode == ADDRESS) {
+            target.addRRset(subzone_glue1);
+        } else if (name == Name("ns2.subzone.example.com") && mode == ADDRESS) {
+            target.addRRset(subzone_glue2);
+        } else {
+            flags |= NAME_NOT_FOUND;
+        }
+    }
+    return;
 }
 
 DataSrc::Result
@@ -194,9 +620,97 @@
                        uint32_t& flags,
                        Name* zone) const
 {
-    flags = NAME_NOT_FOUND;
+    findRecords(qname, qtype, target, zone, NORMAL, flags);
     return (SUCCESS);
 }
 
-}
-}
+DataSrc::Result
+TestDataSrc::findExactRRset(const Query& q,
+                            const Name& qname,
+                            const RRClass& qclass,
+                            const RRType& qtype,
+                            RRsetList& target,
+                            uint32_t& flags,
+                            Name* zone) const
+{
+    findRecords(qname, qtype, target, zone, NORMAL, flags);
+    // Ignore referrals in this case
+    flags &= ~REFERRAL;
+
+    // CNAMEs don't count in this case
+    if (flags & CNAME_FOUND) {
+        flags &= ~CNAME_FOUND;
+        flags |= TYPE_NOT_FOUND;
+    }
+
+    return (SUCCESS);
+}
+
+DataSrc::Result
+TestDataSrc::findAddrs(const Query& q,
+                        const Name& qname,
+                        const RRClass& qclass,
+                        RRsetList& target,
+                        uint32_t& flags,
+                        Name* zone) const
+{
+    findRecords(qname, RRType::ANY(), target, zone, ADDRESS, flags);
+    return (SUCCESS);
+}
+
+DataSrc::Result
+TestDataSrc::findReferral(const Query& q,
+                          const Name& qname,
+                          const RRClass& qclass,
+                          RRsetList& target,
+                          uint32_t& flags,
+                          Name* zone) const
+{
+    findRecords(qname, RRType::ANY(), target, zone, DELEGATION, flags);
+    return (SUCCESS);
+}
+
+DataSrc::Result
+TestDataSrc::findPreviousName(const Query& q,
+                              const Name& qname,
+                              Name& target,
+                              Name* zone) const
+{
+    if (*zone == example) {
+        if (qname >= example || qname < cnameext) {
+            target = example;
+        } else if (qname < cnameint) {
+            target = cnameext;
+        } else if (qname < dname) {
+            target = cnameint;
+        } else if (qname < dns01) {
+            target = dname;
+        } else if (qname < dns02) {
+            target = dns01;
+        } else if (qname < dns03) {
+            target = dns02;
+        } else if (qname < foo) {
+            target = dns03;
+        } else if (qname < sql1) {
+            target = foo;
+        } else if (qname < subzone) {
+            target = sql1;
+        } else if (qname < www) {
+            target = subzone;
+        } else if (qname < wild) {
+            target = www;
+        } else {
+            target = wild;
+        }
+    } else {
+        if (qname >= sql1 || qname < www_sql1) {
+            target = sql1;
+        } else {
+            target = www_sql1;
+        }
+    }
+    return (SUCCESS);
+}
+
+}
+}

Modified: branches/each-ds/src/lib/auth/cpp/unittest_ds.h
==============================================================================
--- branches/each-ds/src/lib/auth/cpp/unittest_ds.h (original)
+++ branches/each-ds/src/lib/auth/cpp/unittest_ds.h Fri Feb 26 01:35:35 2010
@@ -48,48 +48,87 @@
                           const RRType& qtype,
                           RRsetList& target,
                           uint32_t& flags,
-                          Name* zone = NULL) const
-    {
-        return (findRRset(q, qname, qclass, qtype, target, flags, zone));
-    }
+                          Name* zone = NULL) const;
+
+    Result findAddrs(const Query& q,
+                     const Name& qname,
+                     const RRClass& qclass,
+                     RRsetList& target,
+                     uint32_t& flags,
+                     Name* zone = NULL) const;
+
+    Result findReferral(const Query& q,
+                        const Name& qname,
+                        const RRClass& qclass,
+                        RRsetList& target,
+                        uint32_t& flags,
+                        Name* zone = NULL) const;
 
     Result findPreviousName(const Query& q,
                             const Name& qname,
                             Name& target,
-                            Name* zone) const {
-        return (NOT_IMPLEMENTED);
-    }
+                            Name* zone) const;
 
     Result init() { return (SUCCESS); }
     Result close() { return (SUCCESS); }
 
 private:
-    const Name example_name;
-    const Name sql1_name;
+    enum Mode {
+        NORMAL,
+        ADDRESS,
+        DELEGATION
+    };
+
+    void findRecords(const Name& name, const RRType& rdtype,
+                     RRsetList& target, Name* zone, const Mode mode,
+                     uint32_t& flags) const;
+
+    const Name example;
+    const Name sql1;
+    const Name www_sql1;
+    const Name www;
+    const Name foo;
+    const Name dns01;
+    const Name dns02;
+    const Name dns03;
+    const Name cnameint;
+    const Name cnameext;
+    const Name dname;
+    const Name wild;
+    const Name subzone;
     RRsetPtr example_ns;
-    RRsetPtr example_rrsig;
-    RRsetPtr www_example_a;
-    RRsetPtr www_example_rrsig;
-    RRsetPtr foo_example_cname;
-    RRsetPtr foo_example_rrsig;
-    RRsetPtr cnameint_example_cname;
-    RRsetPtr cnameint_example_rrsig;
-    RRsetPtr cnameext_example_cname;
-    RRsetPtr cnameext_example_rrsig;
-    RRsetPtr dns01_example_a;
-    RRsetPtr dns01_example_rrsig;
-    RRsetPtr dns02_example_a;
-    RRsetPtr dns02_example_rrsig;
-    RRsetPtr dns03_example_a;
-    RRsetPtr dns03_example_rrsig;
-    RRsetPtr wild_example_a;
-    RRsetPtr wild_example_rrsig;
-    RRsetPtr dname;
-    RRsetPtr dname_rrsig;
+    RRsetPtr example_soa;
+    RRsetPtr example_nsec;
+    RRsetPtr www_a;
+    RRsetPtr www_nsec;
+    RRsetPtr foo_cname;
+    RRsetPtr foo_nsec;
+    RRsetPtr cnameint_cname;
+    RRsetPtr cnameint_nsec;
+    RRsetPtr cnameext_cname;
+    RRsetPtr cnameext_nsec;
+    RRsetPtr dns01_a;
+    RRsetPtr dns01_nsec;
+    RRsetPtr dns02_a;
+    RRsetPtr dns02_nsec;
+    RRsetPtr dns03_a;
+    RRsetPtr dns03_nsec;
+    RRsetPtr wild_a;
+    RRsetPtr wild_nsec;
+    RRsetPtr dname_dname;
+    RRsetPtr dname_nsec;
     RRsetPtr sql1_ns;
-    RRsetPtr sql1_rrsig;
+    RRsetPtr sql1_soa;
+    RRsetPtr sql1_nsec;
+    RRsetPtr sql1_ds;
+    RRsetPtr sql1_ds_nsec;
     RRsetPtr www_sql1_a;
-    RRsetPtr www_sql1_rrsig;
+    RRsetPtr www_sql1_nsec;
+    RRsetPtr subzone_ns;
+    RRsetPtr subzone_nsec;
+    RRsetPtr subzone_glue1;
+    RRsetPtr subzone_glue2;
+    RRsetPtr subzone_ds;
 };
 
 }




More information about the bind10-changes mailing list