From 08b421023c635939d915cc877e77cbbcf230fd2f Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Thu, 13 Feb 2025 17:14:08 +0100 Subject: [PATCH] dnsdist: Handle response dnstap messages arriving before the query ones Since we now use more than one TCP connection, it is entirely possible for the response message to arrive before the query one, and our tests should just deal with that. --- regression-tests.dnsdist/test_Dnstap.py | 37 ++++++++++++++++--------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/regression-tests.dnsdist/test_Dnstap.py b/regression-tests.dnsdist/test_Dnstap.py index c9457afbe6..c40f52f497 100644 --- a/regression-tests.dnsdist/test_Dnstap.py +++ b/regression-tests.dnsdist/test_Dnstap.py @@ -380,12 +380,23 @@ class TestDnstapOverRemoteLoggerPool(DNSDistTest): cls._remoteLoggerListener.daemon = True cls._remoteLoggerListener.start() - def getFirstDnstap(self): + def getFirstDnstap(self, messageType=None): self.assertFalse(self._remoteLoggerQueue.empty()) - data = self._remoteLoggerQueue.get(False) - self.assertTrue(data) - dnstap = dnstap_pb2.Dnstap() - dnstap.ParseFromString(data) + unused = [] + dnstap = None + while not self._remoteLoggerQueue.empty(): + data = self._remoteLoggerQueue.get(False) + self.assertTrue(data) + dnstap = dnstap_pb2.Dnstap() + dnstap.ParseFromString(data) + if not messageType or dnstap.message.type == messageType: + break + unused.append(data) + + # put back non-matching messages for later + for msg in reversed(unused): + self._remoteLoggerQueue.put(msg) + return dnstap def testDnstap(self): @@ -423,13 +434,13 @@ class TestDnstapOverRemoteLoggerPool(DNSDistTest): time.sleep(1) # check the dnstap message corresponding to the UDP query - dnstap = self.getFirstDnstap() + dnstap = self.getFirstDnstap(dnstap_pb2.Message.CLIENT_QUERY) checkDnstapQuery(self, dnstap, dnstap_pb2.UDP, query) checkDnstapNoExtra(self, dnstap) # check the dnstap message corresponding to the UDP response - dnstap = self.getFirstDnstap() + dnstap = self.getFirstDnstap(dnstap_pb2.Message.CLIENT_RESPONSE) checkDnstapResponse(self, dnstap, dnstap_pb2.UDP, response) checkDnstapNoExtra(self, dnstap) @@ -444,13 +455,13 @@ class TestDnstapOverRemoteLoggerPool(DNSDistTest): time.sleep(1) # check the dnstap message corresponding to the TCP query - dnstap = self.getFirstDnstap() + dnstap = self.getFirstDnstap(dnstap_pb2.Message.CLIENT_QUERY) checkDnstapQuery(self, dnstap, dnstap_pb2.TCP, query) checkDnstapNoExtra(self, dnstap) # check the dnstap message corresponding to the TCP response - dnstap = self.getFirstDnstap() + dnstap = self.getFirstDnstap(dnstap_pb2.Message.CLIENT_RESPONSE) checkDnstapResponse(self, dnstap, dnstap_pb2.TCP, response) checkDnstapNoExtra(self, dnstap) @@ -489,12 +500,12 @@ class TestDnstapOverRemoteLoggerPool(DNSDistTest): time.sleep(1) # check the dnstap message corresponding to the UDP query - dnstap = self.getFirstDnstap() + dnstap = self.getFirstDnstap(dnstap_pb2.Message.CLIENT_QUERY) checkDnstapQuery(self, dnstap, dnstap_pb2.UDP, query) checkDnstapExtra(self, dnstap, b"Type,Query") # check the dnstap message corresponding to the UDP response - dnstap = self.getFirstDnstap() + dnstap = self.getFirstDnstap(dnstap_pb2.Message.CLIENT_RESPONSE) checkDnstapResponse(self, dnstap, dnstap_pb2.UDP, response) checkDnstapExtra(self, dnstap, b"Type,Response") @@ -509,12 +520,12 @@ class TestDnstapOverRemoteLoggerPool(DNSDistTest): time.sleep(1) # check the dnstap message corresponding to the TCP query - dnstap = self.getFirstDnstap() + dnstap = self.getFirstDnstap(dnstap_pb2.Message.CLIENT_QUERY) checkDnstapQuery(self, dnstap, dnstap_pb2.TCP, query) checkDnstapExtra(self, dnstap, b"Type,Query") # check the dnstap message corresponding to the TCP response - dnstap = self.getFirstDnstap() + dnstap = self.getFirstDnstap(dnstap_pb2.Message.CLIENT_RESPONSE) checkDnstapResponse(self, dnstap, dnstap_pb2.TCP, response) checkDnstapExtra(self, dnstap, b"Type,Response") -- 2.47.2