From: Otto Moerbeek Date: Fri, 5 Jun 2020 08:37:28 +0000 (+0200) Subject: Add/modify tests. Also re-check for the cache case. It *is* a bit X-Git-Tag: dnsdist-1.5.0-rc3~17^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=15f159a8a869658250b4721614f095a929a90296;p=thirdparty%2Fpdns.git Add/modify tests. Also re-check for the cache case. It *is* a bit unsettling that case causes an ImmediateServFailException, but I do not like to touch the general flow right now. That would be required to make the CNAME cache case more similar to the non-cached case. --- diff --git a/pdns/recursordist/test-syncres_cc1.cc b/pdns/recursordist/test-syncres_cc1.cc index 1e048cd32d..2640c279c0 100644 --- a/pdns/recursordist/test-syncres_cc1.cc +++ b/pdns/recursordist/test-syncres_cc1.cc @@ -1127,6 +1127,83 @@ BOOST_AUTO_TEST_CASE(test_cname_loop) BOOST_CHECK_EQUAL(res, RCode::ServFail); BOOST_CHECK_EQUAL(ret.size(), 0U); BOOST_CHECK_EQUAL(count, 2U); + + // Again to check cache + try { + res = sr->beginResolve(target, QType(QType::A), QClass::IN, ret); + BOOST_CHECK(false); + } + catch (const ImmediateServFailException& ex) { + BOOST_CHECK(true); + } +} + +BOOST_AUTO_TEST_CASE(test_cname_long_loop) +{ + std::unique_ptr sr; + initSR(sr); + + primeHints(); + + size_t count = 0; + const DNSName target1("cname1.powerdns.com."); + const DNSName target2("cname2.powerdns.com."); + const DNSName target3("cname3.powerdns.com."); + const DNSName target4("cname4.powerdns.com."); + + sr->setAsyncCallback([target1, target2, target3, target4, &count](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) { + count++; + + if (isRootServer(ip)) { + + setLWResult(res, 0, false, false, true); + addRecordToLW(res, domain, QType::NS, "a.gtld-servers.net.", DNSResourceRecord::AUTHORITY, 172800); + addRecordToLW(res, "a.gtld-servers.net.", QType::A, "192.0.2.1", DNSResourceRecord::ADDITIONAL, 3600); + return 1; + } + else if (ip == ComboAddress("192.0.2.1:53")) { + + if (domain == target1) { + setLWResult(res, 0, true, false, false); + addRecordToLW(res, domain, QType::CNAME, target2.toString()); + return 1; + } + else if (domain == target2) { + setLWResult(res, 0, true, false, false); + addRecordToLW(res, domain, QType::CNAME, target3.toString()); + return 1; + } + else if (domain == target3) { + setLWResult(res, 0, true, false, false); + addRecordToLW(res, domain, QType::CNAME, target4.toString()); + return 1; + } + else if (domain == target4) { + setLWResult(res, 0, true, false, false); + addRecordToLW(res, domain, QType::CNAME, target1.toString()); + return 1; + } + + return 1; + } + + return 0; + }); + + vector ret; + int res = sr->beginResolve(target1, QType(QType::A), QClass::IN, ret); + BOOST_CHECK_EQUAL(res, RCode::ServFail); + BOOST_CHECK_EQUAL(ret.size(), 0U); + BOOST_CHECK_EQUAL(count, 8U); + + // And again to check cache + try { + res = sr->beginResolve(target1, QType(QType::A), QClass::IN, ret); + BOOST_CHECK(false); + } + catch (const ImmediateServFailException& ex) { + BOOST_CHECK(true); + } } BOOST_AUTO_TEST_CASE(test_cname_depth)