]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Add a 'partial read' case to the backend upgrade tests
authorRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 14 Aug 2023 08:57:38 +0000 (10:57 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 14 Aug 2023 08:57:38 +0000 (10:57 +0200)
regression-tests.dnsdist/dnsdisttests.py
regression-tests.dnsdist/test_BackendDiscovery.py

index ce3e3ccf819d9eeda2280a2e3c5ddd84911954f6..1cd53af708bd02b3835ae9efa58b01dfe3f2a99c 100644 (file)
@@ -296,7 +296,7 @@ class DNSDistTest(AssertEqualDNSMessageMixin, unittest.TestCase):
         sock.close()
 
     @classmethod
-    def handleTCPConnection(cls, conn, fromQueue, toQueue, trailingDataResponse=False, multipleResponses=False, callback=None):
+    def handleTCPConnection(cls, conn, fromQueue, toQueue, trailingDataResponse=False, multipleResponses=False, callback=None, partialWrite=False):
       ignoreTrailing = trailingDataResponse is True
       data = conn.recv(2)
       if not data:
@@ -328,7 +328,13 @@ class DNSDistTest(AssertEqualDNSMessageMixin, unittest.TestCase):
         conn.close()
         return
 
-      conn.send(struct.pack("!H", len(wire)))
+      wireLen = struct.pack("!H", len(wire))
+      if partialWrite:
+        for b in wireLen:
+          conn.send(bytes([b]))
+          time.sleep(0.5)
+      else:
+        conn.send(wireLen)
       conn.send(wire)
 
       while multipleResponses:
@@ -355,7 +361,7 @@ class DNSDistTest(AssertEqualDNSMessageMixin, unittest.TestCase):
       conn.close()
 
     @classmethod
-    def TCPResponder(cls, port, fromQueue, toQueue, trailingDataResponse=False, multipleResponses=False, callback=None, tlsContext=None, multipleConnections=False, listeningAddr='127.0.0.1'):
+    def TCPResponder(cls, port, fromQueue, toQueue, trailingDataResponse=False, multipleResponses=False, callback=None, tlsContext=None, multipleConnections=False, listeningAddr='127.0.0.1', partialWrite=False):
         cls._backgroundThreads[threading.get_native_id()] = True
         # trailingDataResponse=True means "ignore trailing data".
         # Other values are either False (meaning "raise an exception")
@@ -394,11 +400,11 @@ class DNSDistTest(AssertEqualDNSMessageMixin, unittest.TestCase):
             if multipleConnections:
               thread = threading.Thread(name='TCP Connection Handler',
                                         target=cls.handleTCPConnection,
-                                        args=[conn, fromQueue, toQueue, trailingDataResponse, multipleResponses, callback])
+                                        args=[conn, fromQueue, toQueue, trailingDataResponse, multipleResponses, callback, partialWrite])
               thread.setDaemon(True)
               thread.start()
             else:
-              cls.handleTCPConnection(conn, fromQueue, toQueue, trailingDataResponse, multipleResponses, callback)
+              cls.handleTCPConnection(conn, fromQueue, toQueue, trailingDataResponse, multipleResponses, callback, partialWrite)
 
         sock.close()
 
index df54c74e381515c769566e5655e46fcdd867e0d7..0521523ae1f8a6810fb7b6478837ad8622904c3a 100644 (file)
@@ -268,7 +268,8 @@ class TestBackendDiscovery(DNSDistTest):
         TCPNoUpgradeResponder.setDaemon(True)
         TCPNoUpgradeResponder.start()
 
-        TCPUpgradeToDoTResponder = threading.Thread(name='TCP upgrade to DoT Responder', target=cls.TCPResponder, args=[cls._svcUpgradeDoTBackendPort, cls._toResponderQueue, cls._fromResponderQueue, False, False, cls.UpgradeDoTCallback])
+        # this one is special, does partial writes!
+        TCPUpgradeToDoTResponder = threading.Thread(name='TCP upgrade to DoT Responder', target=cls.TCPResponder, args=[cls._svcUpgradeDoTBackendPort, cls._toResponderQueue, cls._fromResponderQueue, False, False, cls.UpgradeDoTCallback, None, False, '127.0.0.1', True])
         TCPUpgradeToDoTResponder.setDaemon(True)
         TCPUpgradeToDoTResponder.start()
         # and the corresponding DoT responder