]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Add a regression test for the Dynamic cache miss ratio case
authorRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 7 May 2024 12:52:52 +0000 (14:52 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 16 May 2024 09:10:31 +0000 (11:10 +0200)
regression-tests.dnsdist/dnsdistDynBlockTests.py
regression-tests.dnsdist/test_DynBlocksRatio.py

index f9acc85952554c308147987784d5a0fa71d54bdf..6e67d58fc6e4e59514bc73198089fc59f3da3280 100644 (file)
@@ -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)
index 9eb8c1169b8965a9d81877a86602a83b9b724829..72d90bb8e9cda283f4f25e9e3d128f769b64012c 100644 (file)
@@ -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)