]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Test that DoH answers are stored as received over UDP in the cache
authorRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 28 Jun 2021 13:34:19 +0000 (15:34 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 29 Jun 2021 14:49:52 +0000 (16:49 +0200)
regression-tests.dnsdist/test_DOH.py

index 26f4d84f83877d41f9fcbb8bac55b574ae8f3a5b..a7a4135fef3a7579a58fcda9d861259e8fe4c11a 100644 (file)
@@ -933,6 +933,64 @@ class TestDOHWithCache(DNSDistDOHTest):
         self.assertEqual(receivedResponse, response)
         self.checkHasHeader('cache-control', 'max-age=' + str(receivedResponse.answer[0].ttl))
 
+    def testDOHGetFromUDPCache(self):
+        """
+        DOH with cache: Check that we can retrieve an answer received for a UDP query
+        """
+        name = 'doh-query-insert-udp.doh-with-cache.tests.powerdns.com.'
+        query = dns.message.make_query(name, 'A', 'IN', use_edns=True, payload=4096)
+        expectedQuery = dns.message.make_query(name, 'A', 'IN', use_edns=True, payload=4096)
+        expectedQuery.id = 0
+        response = dns.message.make_response(query)
+        rrset = dns.rrset.from_text(name,
+                                    3600,
+                                    dns.rdataclass.IN,
+                                    dns.rdatatype.A,
+                                    '192.0.2.84')
+        response.answer.append(rrset)
+
+        # first query to fill the cache
+        (receivedQuery, receivedResponse) = self.sendUDPQuery(query, response)
+        self.assertTrue(receivedQuery)
+        self.assertTrue(receivedResponse)
+        receivedQuery.id = expectedQuery.id
+        self.assertEqual(expectedQuery, receivedQuery)
+        self.assertEqual(response, receivedResponse)
+
+        # now we send the exact same query over DoH, we should get a cache hit
+        (_, receivedResponse) = self.sendDOHQuery(self._dohServerPort, self._serverName, self._dohBaseURL, query, caFile=self._caCert, useQueue=False)
+        self.assertTrue(receivedResponse)
+        self.assertEqual(response, receivedResponse)
+
+    def testDOHInsertIntoUDPCache(self):
+        """
+        DOH with cache: Check that we can retrieve an answer received for a DoH query from UDP
+        """
+        name = 'udp-query-get-doh.doh-with-cache.tests.powerdns.com.'
+        query = dns.message.make_query(name, 'A', 'IN', use_edns=True, payload=4096)
+        expectedQuery = dns.message.make_query(name, 'A', 'IN', use_edns=True, payload=4096)
+        expectedQuery.id = 0
+        response = dns.message.make_response(query)
+        rrset = dns.rrset.from_text(name,
+                                    3600,
+                                    dns.rdataclass.IN,
+                                    dns.rdatatype.A,
+                                    '192.0.2.84')
+        response.answer.append(rrset)
+
+        # first query to fill the cache
+        (receivedQuery, receivedResponse) = self.sendDOHQuery(self._dohServerPort, self._serverName, self._dohBaseURL, query, response=response, caFile=self._caCert)
+        self.assertTrue(receivedQuery)
+        self.assertTrue(receivedResponse)
+        receivedQuery.id = expectedQuery.id
+        self.assertEqual(expectedQuery, receivedQuery)
+        self.assertEqual(response, receivedResponse)
+
+        # now we send the exact same query over DoH, we should get a cache hit
+        (_, receivedResponse) = self.sendUDPQuery(query, response=None, useQueue=False)
+        self.assertTrue(receivedResponse)
+        self.assertEqual(response, receivedResponse)
+
 class TestDOHWithoutCacheControl(DNSDistDOHTest):
 
     _serverKey = 'server.key'