Browse Source

[trac505] Test for synthesis resulting in too long name

Michal 'vorner' Vaner 14 years ago
parent
commit
c5f4af2f74
1 changed files with 35 additions and 2 deletions
  1. 35 2
      src/bin/auth/tests/query_unittest.cc

+ 35 - 2
src/bin/auth/tests/query_unittest.cc

@@ -79,6 +79,13 @@ const char* const dname_txt =
     "dname.example.com. 3600 IN DNAME dnametarget.example.com.\n";
 const char* const dname_a_txt =
     "dname.example.com. 3600 IN A 192.0.2.5\n";
+const char* const dname_long_txt =
+    "longdname.example.com. 3600 IN DNAME "
+    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."
+    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."
+    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."
+    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."
+    "example.com.\n";
 // This is not inside the zone, this is created at runtime
 const char* const synthetized_cname_txt =
     "www.dname.example.com. 3600 IN CNAME www.dnametarget.example.com.\n";
@@ -103,6 +110,7 @@ public:
         origin_(Name("example.com")),
         delegation_name_("delegation.example.com"),
         dname_name_("dname.example.com"),
+        longdname_name_("longdname.example.com"),
         has_SOA_(true),
         has_apex_NS_(true),
         rrclass_(RRClass::IN())
@@ -111,7 +119,7 @@ public:
         zone_stream << soa_txt << zone_ns_txt << ns_addrs_txt <<
             delegation_txt << mx_txt << www_a_txt << cname_txt <<
             cname_nxdom_txt << cname_out_txt << dname_txt << dname_a_txt <<
-            other_zone_rrs;
+            dname_long_txt << other_zone_rrs;
 
         masterLoad(zone_stream, origin_, rrclass_,
                    boost::bind(&MockZone::loadRRset, this, _1));
@@ -144,16 +152,22 @@ private:
             rrset->getType() == RRType::DNAME())
         {
             dname_rrset_ = rrset;
+        } else if (rrset->getName() == longdname_name_ &&
+            rrset->getType() == RRType::DNAME())
+        {
+            longdname_rrset_ = rrset;
         }
     }
 
     const Name origin_;
     const Name delegation_name_;
     const Name dname_name_;
+    const Name longdname_name_;
     bool has_SOA_;
     bool has_apex_NS_;
     ConstRRsetPtr delegation_rrset_;
     ConstRRsetPtr dname_rrset_;
+    ConstRRsetPtr longdname_rrset_;
     const RRClass rrclass_;
 };
 
@@ -180,6 +194,10 @@ MockZone::find(const Name& name, const RRType& type,
         NameComparisonResult::SUBDOMAIN)
     {
         return (FindResult(DNAME, dname_rrset_));
+    } else if (name.compare(longdname_name_).getRelation() ==
+        NameComparisonResult::SUBDOMAIN)
+    {
+        return (FindResult(DNAME, longdname_rrset_));
     }
 
     // normal cases.  names are searched for only per exact-match basis
@@ -359,7 +377,7 @@ TEST_F(QueryTest, nodomainANY) {
                   NULL, soa_txt, NULL, mock_zone->getOrigin());
 }
 
-// This tests that when we need to look up Zone's apex NS records for
+
 // authoritative answer, and there is no apex NS records. It should
 // throw in that case.
 TEST_F(QueryTest, noApexNS) {
@@ -612,4 +630,19 @@ TEST_F(QueryTest, DNAME_NX_RRSET) {
         NULL, soa_txt, NULL, mock_zone->getOrigin());
 }
 
+/*
+ * Constructing the CNAME will result in a name that is too long. This,
+ * however, should not throw (and crash the server), but respond with
+ * YXDOMAIN.
+ */
+TEST_F(QueryTest, LongDNAME) {
+    EXPECT_NO_THROW(Query(memory_datasrc,
+        Name("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."
+        "somethingveryveryverylong.longdname.example.com"), RRType::A(),
+        response).process());
+
+    responseCheck(response, Rcode::YXDOMAIN(), AA_FLAG, 1, 3, 3,
+        dname_long_txt, zone_ns_txt, ns_addrs_txt);
+}
+
 }