]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Test that we can iterate on DNSCrypt binds and reload their certificates
authorRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 24 Apr 2025 13:04:35 +0000 (15:04 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 25 Apr 2025 12:19:33 +0000 (14:19 +0200)
regression-tests.dnsdist/test_DNSCrypt.py

index 9a9a91b23fe0fca375b4372069ab40747c9869bc..05f96d94e42768dcf618d1e6c506b917c992b1fb 100644 (file)
@@ -375,45 +375,60 @@ class TestDNSCryptWithCache(DNSCryptTest):
 class TestDNSCryptAutomaticRotation(DNSCryptTest):
     _config_template = """
     setKey("%s")
-    controlSocket("127.0.0.1:%s")
+    controlSocket("127.0.0.1:%d")
     generateDNSCryptCertificate("DNSCryptProviderPrivate.key", "DNSCryptResolver.cert", "DNSCryptResolver.key", %d, %d, %d)
     addDNSCryptBind("127.0.0.1:%d", "%s", "DNSCryptResolver.cert", "DNSCryptResolver.key")
-    newServer{address="127.0.0.1:%s"}
+    addDNSCryptBind("127.0.0.1:%d", "%s", "DNSCryptResolver.cert", "DNSCryptResolver.key")
+    newServer{address="127.0.0.1:%d"}
 
     local last = 0
-    serial = %d
+    local serial = %d
+    dnscrypt_errors = 0
+
     function reloadCallback()
       local now = os.time()
       if ((now - last) > 2) then
         serial = serial + 1
-        getDNSCryptBind(0):generateAndLoadInMemoryCertificate('DNSCryptProviderPrivate.key', serial, now - 60, now + 120)
+        for idx = 0, getDNSCryptBindCount() - 1 do
+          if not getDNSCryptBind(idx):generateAndLoadInMemoryCertificate('DNSCryptProviderPrivate.key', serial, now - 60, now + 120) then
+            dnscrypt_errors = dnscrypt_errors + 1
+            break
+          end
+        end
         last = now
       end
     end
+
     addMaintenanceCallback(reloadCallback)
     """
 
-    _config_params = ['_consoleKeyB64', '_consolePort', '_resolverCertificateSerial', '_resolverCertificateValidFrom', '_resolverCertificateValidUntil', '_dnsDistPortDNSCrypt', '_providerName', '_testServerPort', '_resolverCertificateSerial']
+    _dnsDistPortDNSCrypt2 = pickAvailablePort()
+    _config_params = ['_consoleKeyB64', '_consolePort', '_resolverCertificateSerial', '_resolverCertificateValidFrom', '_resolverCertificateValidUntil', '_dnsDistPortDNSCrypt', '_providerName', '_dnsDistPortDNSCrypt2', '_providerName', '_testServerPort', '_resolverCertificateSerial']
 
     def testCertRotation(self):
         """
         DNSCrypt: automatic certificate rotation
         """
-        client = dnscrypt.DNSCryptClient(self._providerName, self._providerFingerprint, "127.0.0.1", self._dnsDistPortDNSCrypt)
-
-        client.refreshResolverCertificates()
-        cert = client.getResolverCertificate()
-        self.assertTrue(cert)
-        firstSerial = cert.serial
-        self.assertGreaterEqual(cert.serial, self._resolverCertificateSerial)
+        clients = []
+        serials = {}
+        for port in [self._dnsDistPortDNSCrypt, self._dnsDistPortDNSCrypt2]:
+            clients.append(dnscrypt.DNSCryptClient(self._providerName, self._providerFingerprint, "127.0.0.1", port))
+
+        for client in clients:
+            client.refreshResolverCertificates()
+            cert = client.getResolverCertificate()
+            self.assertTrue(cert)
+            serials[client] = cert.serial
+            self.assertGreaterEqual(cert.serial, self._resolverCertificateSerial)
 
         time.sleep(3)
 
-        client.refreshResolverCertificates()
-        cert = client.getResolverCertificate()
-        self.assertTrue(cert)
-        secondSerial = cert.serial
-        self.assertGreater(cert.serial, firstSerial)
+        for client in clients:
+            client.refreshResolverCertificates()
+            cert = client.getResolverCertificate()
+            self.assertTrue(cert)
+            secondSerial = cert.serial
+            self.assertGreater(cert.serial, serials[client])
 
         name = 'automatic-rotation.dnscrypt.tests.powerdns.com.'
         query = dns.message.make_query(name, 'A', 'IN')
@@ -425,5 +440,9 @@ class TestDNSCryptAutomaticRotation(DNSCryptTest):
                                     '192.2.0.1')
         response.answer.append(rrset)
 
-        self.doDNSCryptQuery(client, query, response, False)
-        self.doDNSCryptQuery(client, query, response, True)
+        for client in clients:
+            self.doDNSCryptQuery(client, query, response, False)
+            self.doDNSCryptQuery(client, query, response, True)
+
+        counter = self.sendConsoleCommand("return dnscrypt_errors")
+        self.assertEqual(counter.strip(), "0")