From: Remi Gacogne Date: Fri, 2 Jul 2021 13:12:53 +0000 (+0200) Subject: dnsdist: Add a UDP vs TCP packet cache unit test X-Git-Tag: dnsdist-1.7.0-alpha1~100^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F10537%2Fhead;p=thirdparty%2Fpdns.git dnsdist: Add a UDP vs TCP packet cache unit test --- diff --git a/pdns/test-dnsdistpacketcache_cc.cc b/pdns/test-dnsdistpacketcache_cc.cc index 07c9c8cb60..40759684df 100644 --- a/pdns/test-dnsdistpacketcache_cc.cc +++ b/pdns/test-dnsdistpacketcache_cc.cc @@ -124,6 +124,7 @@ BOOST_AUTO_TEST_CASE(test_PacketCacheSimple) { } } + BOOST_AUTO_TEST_CASE(test_PacketCacheSharded) { const size_t maxEntries = 150000; const size_t numberOfShards = 10; @@ -224,6 +225,70 @@ BOOST_AUTO_TEST_CASE(test_PacketCacheSharded) { } } +BOOST_AUTO_TEST_CASE(test_PacketCacheTCP) { + const size_t maxEntries = 150000; + DNSDistPacketCache PC(maxEntries, 86400, 1); + struct timespec queryTime; + gettime(&queryTime); // does not have to be accurate ("realTime") in tests + + ComboAddress remote; + bool dnssecOK = false; + try { + DNSName a = DNSName("tcp"); + BOOST_CHECK_EQUAL(DNSName(a.toString()), a); + + PacketBuffer query; + GenericDNSPacketWriter pwQ(query, a, QType::AAAA, QClass::IN, 0); + pwQ.getHeader()->rd = 1; + + PacketBuffer response; + GenericDNSPacketWriter pwR(response, a, QType::AAAA, QClass::IN, 0); + pwR.getHeader()->rd = 1; + pwR.getHeader()->ra = 1; + pwR.getHeader()->qr = 1; + pwR.getHeader()->id = pwQ.getHeader()->id; + pwR.startRecord(a, QType::AAAA, 7200, QClass::IN, DNSResourceRecord::ANSWER); + ComboAddress v6("2001:db8::1"); + pwR.xfrIP6(std::string(reinterpret_cast(v6.sin6.sin6_addr.s6_addr), 16)); + pwR.xfr32BitInt(0x01020304); + pwR.commit(); + + { + /* UDP */ + uint32_t key = 0; + boost::optional subnet; + DNSQuestion dq(&a, QType::A, QClass::IN, &remote, &remote, query, DNSQuestion::Protocol::DoUDP, &queryTime); + bool found = PC.get(dq, 0, &key, subnet, dnssecOK, receivedOverUDP); + BOOST_CHECK_EQUAL(found, false); + BOOST_CHECK(!subnet); + + PC.insert(key, subnet, *(getFlagsFromDNSHeader(dq.getHeader())), dnssecOK, a, QType::A, QClass::IN, response, receivedOverUDP, RCode::NoError, boost::none); + found = PC.get(dq, pwR.getHeader()->id, &key, subnet, dnssecOK, receivedOverUDP, 0, true); + BOOST_CHECK_EQUAL(found, true); + BOOST_CHECK(!subnet); + } + + { + /* same but over TCP */ + uint32_t key = 0; + boost::optional subnet; + DNSQuestion dq(&a, QType::A, QClass::IN, &remote, &remote, query, DNSQuestion::Protocol::DoTCP, &queryTime); + bool found = PC.get(dq, 0, &key, subnet, dnssecOK, !receivedOverUDP); + BOOST_CHECK_EQUAL(found, false); + BOOST_CHECK(!subnet); + + PC.insert(key, subnet, *(getFlagsFromDNSHeader(dq.getHeader())), dnssecOK, a, QType::A, QClass::IN, response, !receivedOverUDP, RCode::NoError, boost::none); + found = PC.get(dq, pwR.getHeader()->id, &key, subnet, dnssecOK, !receivedOverUDP, 0, true); + BOOST_CHECK_EQUAL(found, true); + BOOST_CHECK(!subnet); + } + } + catch(PDNSException& e) { + cerr<<"Had error: "<