]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Add DNAME cache tests
authorPieter Lexis <pieter.lexis@powerdns.com>
Tue, 5 Mar 2019 11:00:51 +0000 (12:00 +0100)
committerPieter Lexis <pieter.lexis@powerdns.com>
Tue, 5 Mar 2019 11:00:51 +0000 (12:00 +0100)
pdns/recursordist/test-syncres_cc.cc

index e0e4ca17c4a0f15179746cca12773e31c8b61fbb..8459786459abe046d2c5f8f9c4b9e16ecdca8349 100644 (file)
@@ -10857,7 +10857,24 @@ BOOST_AUTO_TEST_CASE(test_dname_processing) {
   BOOST_CHECK(ret[2].d_type == QType::A);
   BOOST_CHECK_EQUAL(ret[2].d_name, cnameTarget);
 
-  // TODO add cached tests once the caching of DNAME is implemented
+  // Now check the cache
+  ret.clear();
+  res = sr->beginResolve(target, QType(QType::A), QClass::IN, ret);
+
+  BOOST_CHECK_EQUAL(res, RCode::NoError);
+  BOOST_REQUIRE_EQUAL(ret.size(), 3);
+
+  BOOST_CHECK_EQUAL(queries, 4);
+
+  BOOST_CHECK(ret[0].d_type == QType::DNAME);
+  BOOST_CHECK(ret[0].d_name == dnameOwner);
+  BOOST_CHECK_EQUAL(getRR<DNAMERecordContent>(ret[0])->getTarget(), dnameTarget);
+
+  BOOST_CHECK(ret[1].d_type == QType::CNAME);
+  BOOST_CHECK_EQUAL(ret[1].d_name, target);
+
+  BOOST_CHECK(ret[2].d_type == QType::A);
+  BOOST_CHECK_EQUAL(ret[2].d_name, cnameTarget);
 }
 
 BOOST_AUTO_TEST_CASE(test_dname_dnssec_secure) {
@@ -10887,17 +10904,20 @@ BOOST_AUTO_TEST_CASE(test_dname_dnssec_secure) {
   sr->setAsyncCallback([dnameOwner, dnameTarget, target, cnameTarget, keys, &queries](const ComboAddress& ip, const DNSName& domain, int type, bool doTCP, bool sendRDQuery, int EDNS0Level, struct timeval* now, boost::optional<Netmask>& srcmask, boost::optional<const ResolveContext&> context, LWResult* res, bool* chained) {
       queries++;
 
-      if (type == QType::DS || type == QType::DNSKEY) {
-        bool proveCut=true;
-        auto auth{domain};
-        if (domain.countLabels() > 1) {
-          auth.chopOff();
-          proveCut = false;
-        }
-        return genericDSAndDNSKEYHandler(res, domain, auth, type, keys, proveCut);
-      }
-
       if (isRootServer(ip)) {
+        if (domain.countLabels() == 0 && type == QType::DNSKEY) { // .|DNSKEY
+          setLWResult(res, 0, true, false, true);
+          addDNSKEY(keys, domain, 300, res->d_records);
+          addRRSIG(keys, res->d_records, DNSName("."), 300);
+          return 1;
+        }
+        if (domain.countLabels() == 1 && type == QType::DS) { // powerdns|DS or example|DS
+          setLWResult(res, 0, true, false, true);
+          addDS(domain, 300, res->d_records, keys);
+          addRRSIG(keys, res->d_records, DNSName("."), 300);
+          return 1;
+        }
+        // For the rest, delegate!
         if (domain.isPartOf(dnameOwner)) {
           setLWResult(res, 0, false, false, true);
           addRecordToLW(res, dnameOwner, QType::NS, "a.gtld-servers.net.", DNSResourceRecord::AUTHORITY, 172800);
@@ -10915,18 +10935,36 @@ BOOST_AUTO_TEST_CASE(test_dname_dnssec_secure) {
           return 1;
         }
       } else if (ip == ComboAddress("192.0.2.1:53")) {
+        if (domain.countLabels() == 1 && type == QType::DNSKEY) { // powerdns|DNSKEY
+          setLWResult(res, 0, true, false, true);
+          addDNSKEY(keys, domain, 300, res->d_records);
+          addRRSIG(keys, res->d_records, domain, 300);
+          return 1;
+        }
+        if (domain == target && type == QType::DS) { // dname.powerdns|DS
+          return genericDSAndDNSKEYHandler(res, domain, dnameOwner, type, keys);
+        }
         if (domain == target) {
           setLWResult(res, 0, true, false, false);
           addRecordToLW(res, dnameOwner, QType::DNAME, dnameTarget.toString());
-          addRRSIG(keys, res->d_records, DNSName("."), 300);
+          addRRSIG(keys, res->d_records, dnameOwner, 300);
           addRecordToLW(res, domain, QType::CNAME, cnameTarget.toString());
           return 1;
         }
       } else if (ip == ComboAddress("192.0.2.2:53")) {
+        if (domain.countLabels() == 1 && type == QType::DNSKEY) { // example|DNSKEY
+          setLWResult(res, 0, true, false, true);
+          addDNSKEY(keys, domain, 300, res->d_records);
+          addRRSIG(keys, res->d_records, domain, 300);
+          return 1;
+        }
+        if (domain == target && type == QType::DS) { // dname.example|DS
+          return genericDSAndDNSKEYHandler(res, domain, dnameTarget, type, keys);
+        }
         if (domain == cnameTarget) {
           setLWResult(res, 0, true, false, false);
           addRecordToLW(res, domain, QType::A, "192.0.2.2");
-          addRRSIG(keys, res->d_records, DNSName("."), 300);
+          addRRSIG(keys, res->d_records, dnameTarget, 300);
         }
         return 1;
       }
@@ -10940,7 +10978,33 @@ BOOST_AUTO_TEST_CASE(test_dname_dnssec_secure) {
   BOOST_CHECK_EQUAL(sr->getValidationState(), Secure);
   BOOST_REQUIRE_EQUAL(ret.size(), 5); /* DNAME + RRSIG(DNAME) + CNAME + A + RRSIG(A) */
 
-  BOOST_CHECK_EQUAL(queries, 9);
+  BOOST_CHECK_EQUAL(queries, 11);
+
+  BOOST_CHECK(ret[0].d_type == QType::DNAME);
+  BOOST_CHECK(ret[0].d_name == dnameOwner);
+  BOOST_CHECK_EQUAL(getRR<DNAMERecordContent>(ret[0])->getTarget(), dnameTarget);
+
+  BOOST_CHECK(ret[1].d_type == QType::RRSIG);
+  BOOST_CHECK_EQUAL(ret[1].d_name, dnameOwner);
+
+  BOOST_CHECK(ret[2].d_type == QType::CNAME);
+  BOOST_CHECK_EQUAL(ret[2].d_name, target);
+
+  BOOST_CHECK(ret[3].d_type == QType::A);
+  BOOST_CHECK_EQUAL(ret[3].d_name, cnameTarget);
+
+  BOOST_CHECK(ret[4].d_type == QType::RRSIG);
+  BOOST_CHECK_EQUAL(ret[4].d_name, cnameTarget);
+
+  // And the cache
+  ret.clear();
+  res = sr->beginResolve(target, QType(QType::A), QClass::IN, ret);
+
+  BOOST_CHECK_EQUAL(res, RCode::NoError);
+  BOOST_CHECK_EQUAL(sr->getValidationState(), Secure);
+  BOOST_REQUIRE_EQUAL(ret.size(), 5); /* DNAME + RRSIG(DNAME) + CNAME + A + RRSIG(A) */
+
+  BOOST_CHECK_EQUAL(queries, 11);
 
   BOOST_CHECK(ret[0].d_type == QType::DNAME);
   BOOST_CHECK(ret[0].d_name == dnameOwner);
@@ -10958,7 +11022,6 @@ BOOST_AUTO_TEST_CASE(test_dname_dnssec_secure) {
   BOOST_CHECK(ret[4].d_type == QType::RRSIG);
   BOOST_CHECK_EQUAL(ret[4].d_name, cnameTarget);
 
-  // TODO add cached tests once the caching of DNAME is implemented
 }
 
 /*