Browse Source

another set of refactoring of query tests: checking response messages
using the new rrsetsCheck() framework.

JINMEI Tatuya 14 years ago
parent
commit
107229aeff
1 changed files with 148 additions and 163 deletions
  1. 148 163
      src/bin/auth/tests/query_unittest.cc

+ 148 - 163
src/bin/auth/tests/query_unittest.cc

@@ -12,7 +12,7 @@
 // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 // PERFORMANCE OF THIS SOFTWARE.
 
-#include <vector>
+#include <sstream>
 
 #include <dns/message.h>
 #include <dns/name.h>
@@ -26,7 +26,7 @@
 
 #include <auth/query.h>
 
-#include <testutils/srv_test.h>
+#include <testutils/dnsmessage_test.h>
 
 #include <gtest/gtest.h>
 
@@ -51,7 +51,7 @@ public:
         rrclass_(RRClass::IN()),
         rrttl_(RRTTL(3600)),
         // delegation.example.com. NS glue.ns.example.com.
-        //                         NS noglue.ns.example.com.
+        //                         NS noglue.example.com.
         //                         NS cname.example.com.
         //                         NS example.org.
         delegation_rrset(RRsetPtr(new RRset(Name("delegation.example.com"),
@@ -60,7 +60,7 @@ public:
         cname_rrset(RRsetPtr(new RRset(Name("cname.example.com"), rrclass_,
                                        RRType::CNAME(), rrttl_))),
         // example.com. NS glue.ns.example.com.
-        //              NS noglue.ns.example.com.
+        //              NS noglue.example.com.
         //              NS example.net.
         auth_ns_rrset(RRsetPtr(new RRset(Name("example.com"), rrclass_,
                                          RRType::NS(), rrttl_))),
@@ -68,7 +68,7 @@ public:
         mx_cname_rrset_(new RRset(Name("cnamemailer.example.com"), rrclass_,
                                   RRType::CNAME(), rrttl_)),
         // mx.example.com. MX 10 www.example.com.
-        //                 MX 20 mailer.example.com.
+        //                 MX 20 mailer.example.org.
         //                 MX 30 mx.delegation.example.com.
         mx_rrset_(new RRset(Name("mx.example.com"), rrclass_, RRType::MX(),
                             rrttl_)),
@@ -81,17 +81,19 @@ public:
         // glue.ns.example.com. A 192.0.2.153
         glue_a_rrset(new RRset(Name("glue.ns.example.com"), rrclass_,
                                RRType::A(), rrttl_)),
-        // glue.ns.example.com. A 2001:db8::53
+        // glue.ns.example.com. AAAA 2001:db8::53
         glue_aaaa_rrset(new RRset(Name("glue.ns.example.com"), rrclass_,
                                   RRType::AAAA(), rrttl_)),
 
-        // The following RRsets will be used without RDATA for now.
+        // example.com. SOA . . 0 0 0 0 0
         soa_rrset(new RRset(Name("example.com"), rrclass_, RRType::SOA(),
                             rrttl_)),
-        ns_rrset(new RRset(Name("ns.example.com"), rrclass_,RRType::NS(),
-                           rrttl_)),
+
+        // noglue.example.com. A 192.0.2.53
         noglue_a_rrset(new RRset(Name("noglue.example.com"), rrclass_,
                                  RRType::A(), rrttl_)),
+
+        // The following RRsets will be used without RDATA for now.
         delegated_mx_a_rrset(new RRset(Name("mx.delegation.example.com"),
                                        rrclass_, RRType::A(), rrttl_))
     {
@@ -113,6 +115,7 @@ public:
         noglue_a_rrset->addRdata(in::A("192.0.2.53"));
         glue_a_rrset->addRdata(in::A("192.0.2.153"));
         glue_aaaa_rrset->addRdata(in::AAAA("2001:db8::53"));
+        soa_rrset->addRdata(generic::SOA(". . 0 0 0 0 0"));
         a_rrset->addRdata(in::A("192.0.2.80"));
     }
     virtual const isc::dns::Name& getOrigin() const;
@@ -140,7 +143,6 @@ private:
     RRsetPtr glue_a_rrset;
     RRsetPtr glue_aaaa_rrset;
     RRsetPtr soa_rrset;
-    RRsetPtr ns_rrset;
     RRsetPtr noglue_a_rrset;
     RRsetPtr delegated_mx_a_rrset;
 };
@@ -190,8 +192,6 @@ MockZone::find(const Name& name, const RRType& type,
         NameComparisonResult::SUBDOMAIN)
     {
         return (FindResult(DELEGATION, delegation_rrset));
-    } else if (name == Name("ns.example.com")) {
-        return (FindResult(DELEGATION, ns_rrset));
     } else if (name == Name("nxdomain.example.com")) {
         return (FindResult(NXDOMAIN, RRsetPtr()));
     } else if (name == Name("nxrrset.example.com")) {
@@ -209,6 +209,16 @@ MockZone::find(const Name& name, const RRType& type,
     }
 }
 
+const char* const soa_txt = "example.com. 3600 IN SOA . . 0 0 0 0 0";
+const char* const zone_ns_txt =
+    "example.com. 3600 IN NS glue.ns.example.com.\n"
+    "example.com. 3600 IN NS noglue.example.com.\n"
+    "example.com. 3600 IN NS example.net.";
+const char* const glue_txt =
+    "glue.ns.example.com. 3600 IN A 192.0.2.153\n"
+    "glue.ns.example.com. 3600 IN AAAA 2001:db8::53\n"
+    "noglue.example.com. 3600 IN A 192.0.2.53\n";
+
 class QueryTest : public ::testing::Test {
 protected:
     QueryTest() :
@@ -230,6 +240,9 @@ protected:
     Message response;
     const qid_t qid;
     const uint16_t query_code;
+    stringstream expected_answer;
+    stringstream expected_authority;
+    stringstream expected_additional;
 };
 
 TEST_F(QueryTest, noZone) {
@@ -245,23 +258,23 @@ TEST_F(QueryTest, exactMatch) {
     Query query(memory_datasrc, qname, qtype, response);
     EXPECT_NO_THROW(query.process());
     // find match rrset
-    EXPECT_TRUE(response.getHeaderFlag(Message::HEADERFLAG_AA));
-    EXPECT_EQ(Rcode::NOERROR(), response.getRcode());
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_ANSWER,
-                                  Name("www.example.com"), RRClass::IN(),
-                                  RRType::A()));
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_AUTHORITY,
-                                  Name("example.com"), RRClass::IN(),
-                                  RRType::NS()));
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_ADDITIONAL,
-                                  Name("glue.ns.example.com"),
-                                  RRClass::IN(), RRType::A()));
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_ADDITIONAL,
-                                  Name("glue.ns.example.com"),
-                                  RRClass::IN(), RRType::AAAA()));
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_ADDITIONAL,
-                                  Name("noglue.example.com"),
-                                  RRClass::IN(), RRType::A()));
+    headerCheck(response, qid, Rcode::NOERROR(), query_code,
+                AA_FLAG, 0, 1, 3, 3);
+
+    expected_answer << "www.example.com. 3600 IN A 192.0.2.80\n";
+    rrsetsCheck(expected_answer,
+                response.beginSection(Message::SECTION_ANSWER),
+                response.endSection(Message::SECTION_ANSWER));
+
+    expected_authority << zone_ns_txt;
+    rrsetsCheck(expected_authority,
+                response.beginSection(Message::SECTION_AUTHORITY),
+                response.endSection(Message::SECTION_AUTHORITY));
+
+    expected_additional << glue_txt;
+    rrsetsCheck(expected_additional,
+                response.beginSection(Message::SECTION_ADDITIONAL),
+                response.endSection(Message::SECTION_ADDITIONAL));
 }
 
 TEST_F(QueryTest, exactAddrMatch) {
@@ -270,23 +283,25 @@ TEST_F(QueryTest, exactAddrMatch) {
     const Name noglue_name(Name("noglue.example.com"));
     Query noglue_query(memory_datasrc, noglue_name, qtype, response);
     EXPECT_NO_THROW(noglue_query.process());
-    EXPECT_TRUE(response.getHeaderFlag(Message::HEADERFLAG_AA));
-    EXPECT_EQ(Rcode::NOERROR(), response.getRcode());
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_ANSWER,
-                                  Name("noglue.example.com"), RRClass::IN(),
-                                  RRType::A()));
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_AUTHORITY,
-                                  Name("example.com"), RRClass::IN(),
-                                  RRType::NS()));
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_ADDITIONAL,
-                                  Name("glue.ns.example.com"),
-                                  RRClass::IN(), RRType::A()));
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_ADDITIONAL,
-                                  Name("glue.ns.example.com"),
-                                  RRClass::IN(), RRType::AAAA()));
-    EXPECT_FALSE(response.hasRRset(Message::SECTION_ADDITIONAL,
-                                  Name("noglue.example.com"),
-                                  RRClass::IN(), RRType::A()));
+
+    headerCheck(response, qid, Rcode::NOERROR(), query_code,
+                AA_FLAG, 0, 1, 3, 2);
+
+    expected_answer << "noglue.example.com. 3600 IN A 192.0.2.53\n";
+    rrsetsCheck(expected_answer,
+                response.beginSection(Message::SECTION_ANSWER),
+                response.endSection(Message::SECTION_ANSWER));
+
+    expected_authority << zone_ns_txt;
+    rrsetsCheck(expected_authority,
+                response.beginSection(Message::SECTION_AUTHORITY),
+                response.endSection(Message::SECTION_AUTHORITY));
+
+    expected_additional << "glue.ns.example.com. 3600 IN A 192.0.2.153\n"
+        "glue.ns.example.com. 3600 IN AAAA 2001:db8::53\n";
+    rrsetsCheck(expected_additional,
+                response.beginSection(Message::SECTION_ADDITIONAL),
+                response.endSection(Message::SECTION_ADDITIONAL));
 }
 
 TEST_F(QueryTest, apexNSMatch) {
@@ -295,23 +310,19 @@ TEST_F(QueryTest, apexNSMatch) {
     const Name apex_name(Name("example.com"));
     Query apex_ns_query(memory_datasrc, apex_name, RRType::NS(), response);
     EXPECT_NO_THROW(apex_ns_query.process());
-    EXPECT_TRUE(response.getHeaderFlag(Message::HEADERFLAG_AA));
-    EXPECT_EQ(Rcode::NOERROR(), response.getRcode());
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_ANSWER,
-                                  Name("example.com"), RRClass::IN(),
-                                  RRType::NS()));
-    EXPECT_FALSE(response.hasRRset(Message::SECTION_AUTHORITY,
-                                  Name("example.com"), RRClass::IN(),
-                                  RRType::NS()));
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_ADDITIONAL,
-                                  Name("glue.ns.example.com"),
-                                  RRClass::IN(), RRType::A()));
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_ADDITIONAL,
-                                  Name("glue.ns.example.com"),
-                                  RRClass::IN(), RRType::AAAA()));
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_ADDITIONAL,
-                                  Name("noglue.example.com"),
-                                  RRClass::IN(), RRType::A()));
+
+    headerCheck(response, qid, Rcode::NOERROR(), query_code,
+                AA_FLAG, 0, 3, 0, 3);
+
+    expected_answer << zone_ns_txt;
+    rrsetsCheck(expected_answer,
+                response.beginSection(Message::SECTION_ANSWER),
+                response.endSection(Message::SECTION_ANSWER));
+
+    expected_additional << glue_txt;
+    rrsetsCheck(expected_additional,
+                response.beginSection(Message::SECTION_ADDITIONAL),
+                response.endSection(Message::SECTION_ADDITIONAL));
 }
 
 TEST_F(QueryTest, exactAnyMatch) {
@@ -320,23 +331,25 @@ TEST_F(QueryTest, exactAnyMatch) {
     const Name noglue_name(Name("noglue.example.com"));
     Query noglue_query(memory_datasrc, noglue_name, RRType::ANY(), response);
     EXPECT_NO_THROW(noglue_query.process());
-    EXPECT_TRUE(response.getHeaderFlag(Message::HEADERFLAG_AA));
-    EXPECT_EQ(Rcode::NOERROR(), response.getRcode());
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_ANSWER,
-                                  Name("noglue.example.com"), RRClass::IN(),
-                                  RRType::A()));
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_AUTHORITY,
-                                  Name("example.com"), RRClass::IN(),
-                                  RRType::NS()));
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_ADDITIONAL,
-                                  Name("glue.ns.example.com"),
-                                  RRClass::IN(), RRType::A()));
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_ADDITIONAL,
-                                  Name("glue.ns.example.com"),
-                                  RRClass::IN(), RRType::AAAA()));
-    EXPECT_FALSE(response.hasRRset(Message::SECTION_ADDITIONAL,
-                                  Name("noglue.example.com"),
-                                  RRClass::IN(), RRType::A()));
+
+    headerCheck(response, qid, Rcode::NOERROR(), query_code,
+                AA_FLAG, 0, 1, 3, 2);
+
+    expected_answer << "noglue.example.com. 3600 IN A 192.0.2.53\n";
+    rrsetsCheck(expected_answer,
+                response.beginSection(Message::SECTION_ANSWER),
+                response.endSection(Message::SECTION_ANSWER));
+
+    expected_authority << zone_ns_txt;
+    rrsetsCheck(expected_authority,
+                response.beginSection(Message::SECTION_AUTHORITY),
+                response.endSection(Message::SECTION_AUTHORITY));
+
+    expected_additional << "glue.ns.example.com. 3600 IN A 192.0.2.153\n"
+        "glue.ns.example.com. 3600 IN AAAA 2001:db8::53\n";
+    rrsetsCheck(expected_additional,
+                response.beginSection(Message::SECTION_ADDITIONAL),
+                response.endSection(Message::SECTION_ADDITIONAL));
 }
 
 // This tests that when we need to look up Zone's apex NS records for
@@ -356,52 +369,52 @@ TEST_F(QueryTest, delegation) {
     const Name delegation_name(Name("delegation.example.com"));
     Query delegation_query(memory_datasrc, delegation_name, qtype, response);
     EXPECT_NO_THROW(delegation_query.process());
-    EXPECT_FALSE(response.getHeaderFlag(Message::HEADERFLAG_AA));
-    EXPECT_EQ(Rcode::NOERROR(), response.getRcode());
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_AUTHORITY,
-                                  Name("delegation.example.com"),
-                                  RRClass::IN(), RRType::NS()));
-    // glue address records
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_ADDITIONAL,
-                                  Name("glue.ns.example.com"),
-                                  RRClass::IN(), RRType::A()));
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_ADDITIONAL,
-                                  Name("glue.ns.example.com"),
-                                  RRClass::IN(), RRType::AAAA()));
-    // noglue address records
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_ADDITIONAL,
-                                  Name("noglue.example.com"),
-                                  RRClass::IN(), RRType::A()));
-    // NS name has a CNAME
-    EXPECT_FALSE(response.hasRRset(Message::SECTION_ADDITIONAL,
-                                  Name("www.example.com"),
-                                  RRClass::IN(), RRType::A()));
-    // NS name is out of zone
-    EXPECT_FALSE(response.hasRRset(Message::SECTION_ADDITIONAL,
-                                  Name("example.org"),
-                                  RRClass::IN(), RRType::A()));
+
+    headerCheck(response, qid, Rcode::NOERROR(), query_code,
+                0, 0, 0, 4, 3);
+
+    stringstream expected_authority;
+    expected_authority <<
+        "delegation.example.com. 3600 IN NS glue.ns.example.com.\n"
+        "delegation.example.com. 3600 IN NS noglue.example.com.\n"
+        "delegation.example.com. 3600 IN NS cname.example.com.\n"
+        "delegation.example.com. 3600 IN NS example.org.\n";
+    rrsetsCheck(expected_authority,
+                response.beginSection(Message::SECTION_AUTHORITY),
+                response.endSection(Message::SECTION_AUTHORITY));
+
+    stringstream expected_additional;
+    expected_additional << glue_txt;
+    rrsetsCheck(expected_additional,
+                response.beginSection(Message::SECTION_ADDITIONAL),
+                response.endSection(Message::SECTION_ADDITIONAL));
 }
 
 TEST_F(QueryTest, nxdomain) {
     const Name nxdomain_name(Name("nxdomain.example.com"));
     Query nxdomain_query(memory_datasrc, nxdomain_name, qtype, response);
     EXPECT_NO_THROW(nxdomain_query.process());
-    EXPECT_EQ(Rcode::NXDOMAIN(), response.getRcode());
-    EXPECT_EQ(0, response.getRRCount(Message::SECTION_ANSWER));
-    EXPECT_EQ(0, response.getRRCount(Message::SECTION_ADDITIONAL));
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_AUTHORITY,
-        Name("example.com"), RRClass::IN(), RRType::SOA()));
+    headerCheck(response, qid, Rcode::NXDOMAIN(), query_code,
+                AA_FLAG, 0, 0, 1, 0);
+    expected_authority << soa_txt;
+    rrsetsCheck(expected_authority,
+                response.beginSection(Message::SECTION_AUTHORITY),
+                response.endSection(Message::SECTION_AUTHORITY),
+                Name("example.com"));
 }
 
 TEST_F(QueryTest, nxrrset) {
     const Name nxrrset_name(Name("nxrrset.example.com"));
     Query nxrrset_query(memory_datasrc, nxrrset_name, qtype, response);
     EXPECT_NO_THROW(nxrrset_query.process());
-    EXPECT_EQ(Rcode::NOERROR(), response.getRcode());
-    EXPECT_EQ(0, response.getRRCount(Message::SECTION_ANSWER));
-    EXPECT_EQ(0, response.getRRCount(Message::SECTION_ADDITIONAL));
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_AUTHORITY,
-        Name("example.com"), RRClass::IN(), RRType::SOA()));
+
+    headerCheck(response, qid, Rcode::NOERROR(), query_code,
+                AA_FLAG, 0, 0, 1, 0);
+    expected_authority << soa_txt;
+    rrsetsCheck(expected_authority,
+                response.beginSection(Message::SECTION_AUTHORITY),
+                response.endSection(Message::SECTION_AUTHORITY),
+                Name("example.com"));
 }
 
 /*
@@ -443,55 +456,22 @@ TEST_F(QueryTest, MX) {
     Name qname("mx.example.com");
     Query mx_query(memory_datasrc, qname, RRType::MX(), response);
     EXPECT_NO_THROW(mx_query.process());
-    EXPECT_EQ(Rcode::NOERROR(), response.getRcode());
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_ANSWER,
-        Name("mx.example.com"), RRClass::IN(), RRType::MX()));
-    EXPECT_TRUE(response.hasRRset(Message::SECTION_ADDITIONAL,
-        Name("www.example.com"), RRClass::IN(), RRType::A()));
-    // We want to skip the additional ones related to authoritative
-    RRsetPtr ns;
-    for (SectionIterator<RRsetPtr> ai(response.beginSection(
-        Message::SECTION_AUTHORITY)); ai != response.endSection(
-        Message::SECTION_AUTHORITY); ++ai)
-    {
-        if ((*ai)->getName() == Name("example.com") && (*ai)->getType() ==
-            RRType::NS())
-        {
-            ns = *ai;
-            break;
-        }
-    }
-    /*
-     * In fact, the MX RRset mentions three names, but we don't know anything
-     * about one of them and one is under a zone cut, so we should have just
-     * one RRset (A for www.example.com)
-     */
-    // We can't use getRRCount, as it counts RRs, not RRsets
-    unsigned additional_count(0);
-    for (SectionIterator<RRsetPtr> ai(response.beginSection(
-        Message::SECTION_ADDITIONAL)); ai != response.endSection(
-        Message::SECTION_ADDITIONAL); ++ai)
-    {
-        // Skip the ones for the NS record
-        if (ns) {
-            for (RdataIteratorPtr nsi(ns->getRdataIterator()); !nsi->isLast();
-                nsi->next())
-            {
-                if ((*ai)->getName() ==
-                    dynamic_cast<const isc::dns::rdata::generic::NS&>(
-                    nsi->getCurrent()).getNSName())
-                {
-                    goto NS_ADDITIONAL_DATA;
-                }
-            }
-        }
-        // It is not related to the NS, then it must be related to the MX
-        ++additional_count;
-        EXPECT_EQ(Name("www.example.com"), (*ai)->getName());
-        EXPECT_EQ(RRType::A(), (*ai)->getType());
-        NS_ADDITIONAL_DATA:;
-    }
-    EXPECT_EQ(1, additional_count);
+
+    headerCheck(response, qid, Rcode::NOERROR(), query_code,
+                AA_FLAG, 0, 3, 3, 4);
+
+    expected_answer << "mx.example.com. 3600 IN MX 10 www.example.com.\n"
+        "mx.example.com. 3600 IN MX 20 mailer.example.org.\n"
+        "mx.example.com. 3600 IN MX 30 mx.delegation.example.com.\n";
+    rrsetsCheck(expected_answer,
+                response.beginSection(Message::SECTION_ANSWER),
+                response.endSection(Message::SECTION_ANSWER));
+
+    expected_additional << glue_txt;
+    expected_additional << "www.example.com. 3600 IN A 192.0.2.80\n";
+    rrsetsCheck(expected_additional,
+                response.beginSection(Message::SECTION_ADDITIONAL),
+                response.endSection(Message::SECTION_ADDITIONAL));
 }
 
 /*
@@ -508,5 +488,10 @@ TEST_F(QueryTest, MXAlias) {
     // RRs for the NS)
     headerCheck(response, qid, Rcode::NOERROR(), query_code,
                 AA_FLAG, 0, 1, 3, 3);
+
+    expected_additional << glue_txt;
+    rrsetsCheck(expected_additional,
+                response.beginSection(Message::SECTION_ADDITIONAL),
+                response.endSection(Message::SECTION_ADDITIONAL));
 }
 }