From: Pieter Lexis Date: Tue, 5 Mar 2019 11:00:51 +0000 (+0100) Subject: Add DNAME cache tests X-Git-Tag: rec-4.2.0-beta1~6^2~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=40e3c9881ae1fcad05204c1bf8d169dfd48359d3;p=thirdparty%2Fpdns.git Add DNAME cache tests --- diff --git a/pdns/recursordist/test-syncres_cc.cc b/pdns/recursordist/test-syncres_cc.cc index e0e4ca17c4..8459786459 100644 --- a/pdns/recursordist/test-syncres_cc.cc +++ b/pdns/recursordist/test-syncres_cc.cc @@ -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(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& srcmask, boost::optional 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(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 } /*