X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=pdns%2Frecursordist%2Ftest-syncres_cc2.cc;h=618fb271c3a5608835c18d8fa31f716228954d0e;hb=a06745426b4df4d3946c36cd3429a5c8db9a8cd0;hp=5728011378ece3ca40cfae571968d68c14299962;hpb=dcd113a7934260b1325c725ad40b44585159542a;p=thirdparty%2Fpdns.git diff --git a/pdns/recursordist/test-syncres_cc2.cc b/pdns/recursordist/test-syncres_cc2.cc index 5728011378..618fb271c3 100644 --- a/pdns/recursordist/test-syncres_cc2.cc +++ b/pdns/recursordist/test-syncres_cc2.cc @@ -5,7 +5,7 @@ BOOST_AUTO_TEST_SUITE(syncres_cc2) -BOOST_AUTO_TEST_CASE(test_referral_depth) +static void do_test_referral_depth(bool limited) { std::unique_ptr sr; initSR(sr); @@ -35,36 +35,67 @@ BOOST_AUTO_TEST_CASE(test_referral_depth) } else if (domain == DNSName("ns3.powerdns.org.")) { addRecordToLW(res, domain, QType::NS, "ns4.powerdns.org.", DNSResourceRecord::AUTHORITY, 172800); - } - else if (domain == DNSName("ns4.powerdns.org.")) { - addRecordToLW(res, domain, QType::NS, "ns5.powerdns.org.", DNSResourceRecord::AUTHORITY, 172800); - addRecordToLW(res, domain, QType::A, "192.0.2.1", DNSResourceRecord::AUTHORITY, 172800); + addRecordToLW(res, "ns4.powerdns.org.", QType::A, "192.0.2.1", DNSResourceRecord::ADDITIONAL, 3600); } return 1; } else if (ip == ComboAddress("192.0.2.1:53")) { - setLWResult(res, 0, true, false, false); - addRecordToLW(res, domain, QType::A, "192.0.2.2"); + if (domain == DNSName("www.powerdns.com.")) { + addRecordToLW(res, domain, QType::A, "192.0.2.2"); + } + else { + addRecordToLW(res, domain, QType::A, "192.0.2.1"); + } return 1; } return 0; }); - /* Set the maximum depth low */ - SyncRes::s_maxdepth = 10; - - try { - vector ret; - sr->beginResolve(target, QType(QType::A), QClass::IN, ret); - BOOST_CHECK(false); + if (limited) { + /* Set the maximum depth low */ + SyncRes::s_maxdepth = 4; + try { + vector ret; + sr->beginResolve(target, QType(QType::A), QClass::IN, ret); + BOOST_CHECK(false); + } + catch (const ImmediateServFailException& e) { + BOOST_CHECK(e.reason.find("max-recursion-depth") != string::npos); + } } - catch (const ImmediateServFailException& e) { + else { + // Check if the setup with high limit is OK. + SyncRes::s_maxdepth = 50; + try { + vector ret; + int rcode = sr->beginResolve(target, QType(QType::A), QClass::IN, ret); + BOOST_CHECK_EQUAL(rcode, RCode::NoError); + BOOST_REQUIRE_EQUAL(ret.size(), 1U); + BOOST_CHECK_EQUAL(ret[0].d_name, target); + BOOST_REQUIRE(ret[0].d_type == QType::A); + BOOST_CHECK(getRR(ret[0])->getCA() == ComboAddress("192.0.2.2")); + } + catch (const ImmediateServFailException& e) { + BOOST_CHECK(false); + } } } +BOOST_AUTO_TEST_CASE(test_referral_depth) +{ + // Test with limit + do_test_referral_depth(true); +} + +BOOST_AUTO_TEST_CASE(test_referral_depth_ok) +{ + // Test with default limit + do_test_referral_depth(false); +} + BOOST_AUTO_TEST_CASE(test_cname_qperq) { std::unique_ptr sr; @@ -1244,6 +1275,49 @@ BOOST_AUTO_TEST_CASE(test_completely_flawed_nsset) BOOST_CHECK_EQUAL(queriesCount, 5U); } +BOOST_AUTO_TEST_CASE(test_completely_flawed_big_nsset) +{ + std::unique_ptr sr; + initSR(sr); + + primeHints(); + + const DNSName target("powerdns.com."); + size_t queriesCount = 0; + + sr->setAsyncCallback([&queriesCount, target](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) { + queriesCount++; + + if (isRootServer(ip) && domain == target) { + setLWResult(res, 0, false, false, true); + // 20 NS records + for (int i = 0; i < 20; i++) { + string n = string("pdns-public-ns") + std::to_string(i) + string(".powerdns.com."); + addRecordToLW(res, domain, QType::NS, n, DNSResourceRecord::AUTHORITY, 172800); + } + return 1; + } + else if (domain.toString().length() > 14 && domain.toString().substr(0, 14) == "pdns-public-ns") { + setLWResult(res, 0, true, false, true); + addRecordToLW(res, ".", QType::SOA, "a.root-servers.net. nstld.verisign-grs.com. 2017032800 1800 900 604800 86400", DNSResourceRecord::AUTHORITY, 86400); + return 1; + } + return 0; + }); + + vector ret; + try { + sr->beginResolve(target, QType(QType::A), QClass::IN, ret); + BOOST_CHECK(0); + } + catch (const ImmediateServFailException& ex) { + BOOST_CHECK_EQUAL(ret.size(), 0U); + // one query to get NSs, then A and AAAA for each NS, 5th NS hits the limit + // limit is reduced to 5, because zone publishes many (20) NS + BOOST_CHECK_EQUAL(queriesCount, 11); + } +} + BOOST_AUTO_TEST_CASE(test_cache_hit) { std::unique_ptr sr; @@ -1257,7 +1331,7 @@ BOOST_AUTO_TEST_CASE(test_cache_hit) return 0; }); - /* we populate the cache with eveything we need */ + /* we populate the cache with everything we need */ time_t now = sr->getNow().tv_sec; std::vector records; std::vector> sigs;