From: Remi Gacogne Date: Tue, 7 May 2024 12:52:52 +0000 (+0200) Subject: dnsdist: Add a regression test for the Dynamic cache miss ratio case X-Git-Tag: rec-5.1.0-beta1~27^2~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d6c65dc07f8fbe2fb2411a52ea4f74306ab53ba6;p=thirdparty%2Fpdns.git dnsdist: Add a regression test for the Dynamic cache miss ratio case --- diff --git a/regression-tests.dnsdist/dnsdistDynBlockTests.py b/regression-tests.dnsdist/dnsdistDynBlockTests.py index f9acc85952..6e67d58fc6 100644 --- a/regression-tests.dnsdist/dnsdistDynBlockTests.py +++ b/regression-tests.dnsdist/dnsdistDynBlockTests.py @@ -547,3 +547,48 @@ class DynBlocksTest(DNSDistTest): receivedQuery.id = query.id self.assertEqual(query, receivedQuery) self.assertEqual(response, receivedResponse) + + def doTestCacheMissRatio(self, name, cacheHits, cacheMisses): + rrset = dns.rrset.from_text(name, + 60, + dns.rdataclass.IN, + dns.rdatatype.A, + '192.0.2.1') + + for idx in range(cacheMisses): + query = dns.message.make_query(str(idx) + '.' + name, 'A', 'IN') + response = dns.message.make_response(query) + response.answer.append(rrset) + (receivedQuery, receivedResponse) = self.sendUDPQuery(query, response) + if receivedQuery: + receivedQuery.id = query.id + self.assertEqual(query, receivedQuery) + self.assertEqual(response, receivedResponse) + else: + # the query has not reached the responder, + # let's clear the response queue + self.clearToResponderQueue() + + query = dns.message.make_query('0.' + name, 'A', 'IN') + response = dns.message.make_response(query) + response.answer.append(rrset) + for _ in range(cacheHits): + (_, receivedResponse) = self.sendUDPQuery(query, response=None, useQueue=False) + + waitForMaintenanceToRun() + + # we should now be dropped for up to self._dynBlockDuration + self._dynBlockPeriod + (_, receivedResponse) = self.sendUDPQuery(query, response=None, useQueue=False, timeout=0.5) + self.assertEqual(receivedResponse, None) + + # wait until we are not blocked anymore + time.sleep(self._dynBlockDuration + self._dynBlockPeriod) + + # this one should succeed + query = dns.message.make_query(str(cacheMisses + 1) + name, 'A', 'IN') + response = dns.message.make_response(query) + response.answer.append(rrset) + (receivedQuery, receivedResponse) = self.sendUDPQuery(query, response) + receivedQuery.id = query.id + self.assertEqual(query, receivedQuery) + self.assertEqual(response, receivedResponse) diff --git a/regression-tests.dnsdist/test_DynBlocksRatio.py b/regression-tests.dnsdist/test_DynBlocksRatio.py index 9eb8c1169b..72d90bb8e9 100644 --- a/regression-tests.dnsdist/test_DynBlocksRatio.py +++ b/regression-tests.dnsdist/test_DynBlocksRatio.py @@ -29,3 +29,29 @@ class TestDynBlockGroupServFailsRatio(DynBlocksTest): """ name = 'servfailratio.group.dynblocks.tests.powerdns.com.' self.doTestRCodeRatio(name, dns.rcode.SERVFAIL, 10, 10) + +class TestDynBlockGroupCacheMissRatio(DynBlocksTest): + + # we need this period to be quite long because we request the valid + # queries to be still looked at to reach the 20 queries count! + _dynBlockPeriod = 6 + _config_params = ['_dynBlockPeriod', '_dynBlockDuration', '_testServerPort'] + _config_template = """ + local dbr = dynBlockRulesGroup() + dbr:setCacheMissRatio(0.8, %d, "Exceeded cache miss ratio", %d, 20, 0.0) + + function maintenance() + dbr:apply() + end + + newServer{address="127.0.0.1:%s"} + local pc = newPacketCache(1000, {maxTTL=86400, minTTL=1}) + getPool(""):setCache(pc) + """ + + def testDynBlocksCacheMissRatio(self): + """ + Dyn Blocks (group): Cache miss ratio + """ + name = 'cachemissratio.group.dynblocks.tests.powerdns.com.' + self.doTestCacheMissRatio(name, 3, 17)