]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Add regression tests for responses, cache metrics 12552/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 15 Feb 2023 10:47:10 +0000 (11:47 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 15 Feb 2023 10:47:10 +0000 (11:47 +0100)
regression-tests.dnsdist/test_Metrics.py

index a3ad0f6c6b6395971c92f82bd6a03ab14a8a3dc7..d5ef57dc97f052f274d7bdefd6b857bc8c3ef19a 100644 (file)
@@ -11,19 +11,33 @@ from dnsdisttests import DNSDistTest
 class TestRuleMetrics(DNSDistTest):
 
     _config_template = """
-    newServer{address="127.0.0.1:%s"}
+    addTLSLocal("127.0.0.1:%s", "%s", "%s", { provider="openssl" })
+    addDOHLocal("127.0.0.1:%s", "%s", "%s", { "/"})
+
+    newServer{address="127.0.0.1:%s", pool={'', 'cache'}}
     webserver("127.0.0.1:%s")
     setWebserverConfig({apiKey="%s"})
 
     addAction('rcode-nxdomain.metrics.tests.powerdns.com', RCodeAction(DNSRCode.NXDOMAIN))
     addAction('rcode-refused.metrics.tests.powerdns.com', RCodeAction(DNSRCode.REFUSED))
     addAction('rcode-servfail.metrics.tests.powerdns.com', RCodeAction(DNSRCode.SERVFAIL))
+
+    pc = newPacketCache(100)
+    getPool('cache'):setCache(pc)
+    addAction('cache.metrics.tests.powerdns.com', PoolAction('cache'))
     """
     _webTimeout = 2.0
     _webServerPort = 8083
     _webServerAPIKey = 'apisecret'
     _webServerAPIKeyHashed = '$scrypt$ln=10,p=1,r=8$9v8JxDfzQVyTpBkTbkUqYg==$bDQzAOHeK1G9UvTPypNhrX48w974ZXbFPtRKS34+aso='
-    _config_params = ['_testServerPort', '_webServerPort', '_webServerAPIKeyHashed']
+    _serverKey = 'server.key'
+    _serverCert = 'server.chain'
+    _serverName = 'tls.tests.dnsdist.org'
+    _caCert = 'ca.pem'
+    _tlsServerPort = 8453
+    _dohServerPort = 8443
+    _dohBaseURL = ("https://%s:%d/" % (_serverName, _dohServerPort))
+    _config_params = ['_tlsServerPort', '_serverCert', '_serverKey', '_dohServerPort', '_serverCert', '_serverKey', '_testServerPort', '_webServerPort', '_webServerAPIKeyHashed']
 
     def getMetric(self, name):
         headers = {'x-api-key': self._webServerAPIKey}
@@ -60,3 +74,45 @@ class TestRuleMetrics(DNSDistTest):
                 self.assertEqual(receivedResponse, expectedResponse)
 
             self.assertEquals(self.getMetric('rule-' + name), 2)
+
+    def sendDOHQueryWrapper(self, query, response, useQueue=True):
+        return self.sendDOHQuery(self._dohServerPort, self._serverName, self._dohBaseURL, query, response=response, caFile=self._caCert, useQueue=useQueue)
+
+    def sendDOTQueryWrapper(self, query, response, useQueue=True):
+        return self.sendDOTQuery(self._tlsServerPort, self._serverName, query, response, self._caCert, useQueue=useQueue)
+
+    def testCacheMetrics(self):
+        """
+        Metrics: Check that metrics are correctly updated for cache misses and hits
+        """
+
+        for method in ("sendUDPQuery", "sendTCPQuery", "sendDOTQueryWrapper", "sendDOHQueryWrapper"):
+            qname = method + '.cache.metrics.tests.powerdns.com.'
+            query = dns.message.make_query(qname, 'A', 'IN')
+            # dnsdist set RA = RD for spoofed responses
+            query.flags &= ~dns.flags.RD
+            response = dns.message.make_response(query)
+            rrset = dns.rrset.from_text(qname,
+                                        3600,
+                                        dns.rdataclass.IN,
+                                        dns.rdatatype.A,
+                                        '127.0.0.1')
+            response.answer.append(rrset)
+
+            responsesBefore = self.getMetric('responses')
+            cacheHitsBefore = self.getMetric('cache-hits')
+            cacheMissesBefore = self.getMetric('cache-misses')
+
+            sender = getattr(self, method)
+            # first time, cache miss
+            (receivedQuery, receivedResponse) = sender(query, response)
+            receivedQuery.id = query.id
+            self.assertEqual(query, receivedQuery)
+            self.assertEqual(receivedResponse, response)
+            # second time, hit
+            (_, receivedResponse) = sender(query, response=None, useQueue=False)
+            self.assertEqual(receivedResponse, response)
+
+            self.assertEqual(self.getMetric('responses'), responsesBefore + 2)
+            self.assertEqual(self.getMetric('cache-hits'), cacheHitsBefore + 1)
+            self.assertEqual(self.getMetric('cache-misses'), cacheMissesBefore + 1)