From: Remi Gacogne Date: Wed, 9 May 2018 08:02:19 +0000 (+0200) Subject: rec: Add unit tests for wiping the cache X-Git-Tag: rec-4.1.3~7^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9d9310932afa2b06df561d87336a6f80fc42ecd5;p=pdns rec: Add unit tests for wiping the cache (cherry picked from commit ce3697ad69dd79be40fbe1f2b00a480c84a8f17a) --- diff --git a/pdns/recursordist/test-recursorcache_cc.cc b/pdns/recursordist/test-recursorcache_cc.cc index 953253d18..6695de3a2 100644 --- a/pdns/recursordist/test-recursorcache_cc.cc +++ b/pdns/recursordist/test-recursorcache_cc.cc @@ -762,4 +762,93 @@ BOOST_AUTO_TEST_CASE(test_RecursorCacheECSIndex) { BOOST_CHECK_EQUAL(MRC.ecsIndexSize(), 0); } +BOOST_AUTO_TEST_CASE(test_RecursorCache_Wipe) { + MemRecursorCache MRC; + + const DNSName power("powerdns.com."); + std::vector records; + std::vector> authRecords; + std::vector> signatures; + time_t now = time(nullptr); + std::vector retrieved; + ComboAddress who("192.0.2.1"); + + time_t ttl = 10; + time_t ttd = now + ttl; + DNSRecord dr1; + ComboAddress dr1Content("192.0.2.255"); + dr1.d_name = power; + dr1.d_type = QType::A; + dr1.d_class = QClass::IN; + dr1.d_content = std::make_shared(dr1Content); + dr1.d_ttl = static_cast(ttd); + dr1.d_place = DNSResourceRecord::ANSWER; + + BOOST_CHECK_EQUAL(MRC.size(), 0); + BOOST_CHECK_EQUAL(MRC.ecsIndexSize(), 0); + + /* no entry in the ECS index, no non-specific entry either */ + retrieved.clear(); + BOOST_CHECK_EQUAL(MRC.get(now, power, QType(QType::A), false, &retrieved, who), -1); + + /* insert a specific entry */ + records.push_back(dr1); + MRC.replace(now, power, QType(QType::A), records, signatures, authRecords, true, Netmask("192.0.2.0/31")); + + BOOST_CHECK_EQUAL(MRC.size(), 1); + BOOST_CHECK_EQUAL(MRC.ecsIndexSize(), 1); + + /* insert two sub-domains entries */ + DNSName sub1("a.powerdns.com."); + dr1.d_name = sub1; + records.clear(); + records.push_back(dr1); + MRC.replace(now, sub1, QType(QType::A), records, signatures, authRecords, true, Netmask("192.0.2.0/31")); + + BOOST_CHECK_EQUAL(MRC.size(), 2); + BOOST_CHECK_EQUAL(MRC.ecsIndexSize(), 2); + + DNSName sub2("z.powerdns.com."); + dr1.d_name = sub2; + records.clear(); + records.push_back(dr1); + MRC.replace(now, sub2, QType(QType::A), records, signatures, authRecords, true, Netmask("192.0.2.0/31")); + + BOOST_CHECK_EQUAL(MRC.size(), 3); + BOOST_CHECK_EQUAL(MRC.ecsIndexSize(), 3); + + /* insert two entries for different domains */ + DNSName other1("b\bpowerdns.com."); + dr1.d_name = other1; + records.clear(); + records.push_back(dr1); + MRC.replace(now, other1, QType(QType::A), records, signatures, authRecords, true, Netmask("192.0.2.0/31")); + + BOOST_CHECK_EQUAL(MRC.size(), 4); + BOOST_CHECK_EQUAL(MRC.ecsIndexSize(), 4); + + DNSName other2("c\bpowerdns.com."); + dr1.d_name = other2; + records.clear(); + records.push_back(dr1); + MRC.replace(now, other2, QType(QType::A), records, signatures, authRecords, true, Netmask("192.0.2.0/31")); + + BOOST_CHECK_EQUAL(MRC.size(), 5); + BOOST_CHECK_EQUAL(MRC.ecsIndexSize(), 5); + + /* wipe everything under the powerdns.com domain */ + BOOST_CHECK_EQUAL(MRC.doWipeCache(power, true), 3); + BOOST_CHECK_EQUAL(MRC.size(), 2); + BOOST_CHECK_EQUAL(MRC.ecsIndexSize(), 2); + + /* now wipe the other domains too */ + BOOST_CHECK_EQUAL(MRC.doWipeCache(other1, true), 1); + BOOST_CHECK_EQUAL(MRC.size(), 1); + BOOST_CHECK_EQUAL(MRC.ecsIndexSize(), 1); + + BOOST_CHECK_EQUAL(MRC.doWipeCache(other2, true), 1); + BOOST_CHECK_EQUAL(MRC.size(), 0); + BOOST_CHECK_EQUAL(MRC.ecsIndexSize(), 0); +} + BOOST_AUTO_TEST_SUITE_END()