From: Remi Gacogne Date: Mon, 14 Aug 2023 08:57:38 +0000 (+0200) Subject: dnsdist: Add a 'partial read' case to the backend upgrade tests X-Git-Tag: dnsdist-1.8.1~6^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=72669a3d845c7e1b33b2ef8df8eecd41b03f2d28;p=thirdparty%2Fpdns.git dnsdist: Add a 'partial read' case to the backend upgrade tests (cherry picked from commit e572dbf5b545924785207ff6c6c95f441668a3f1) --- diff --git a/regression-tests.dnsdist/dnsdisttests.py b/regression-tests.dnsdist/dnsdisttests.py index 05de5e1bd6..90fc9e5af3 100644 --- a/regression-tests.dnsdist/dnsdisttests.py +++ b/regression-tests.dnsdist/dnsdisttests.py @@ -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() diff --git a/regression-tests.dnsdist/test_BackendDiscovery.py b/regression-tests.dnsdist/test_BackendDiscovery.py index df54c74e38..0521523ae1 100644 --- a/regression-tests.dnsdist/test_BackendDiscovery.py +++ b/regression-tests.dnsdist/test_BackendDiscovery.py @@ -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