From: Ensar Sarajčić Date: Mon, 10 Feb 2025 08:39:30 +0000 (+0100) Subject: Add `RemotePoolLogger` tests for unix socket based logger X-Git-Tag: dnsdist-2.0.0-alpha1~111^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d7c88c966c87cb4a024c4b87c3472220477ffaba;p=thirdparty%2Fpdns.git Add `RemotePoolLogger` tests for unix socket based logger --- diff --git a/regression-tests.dnsdist/test_Dnstap.py b/regression-tests.dnsdist/test_Dnstap.py index 2278cbaf2e..9947c2899e 100644 --- a/regression-tests.dnsdist/test_Dnstap.py +++ b/regression-tests.dnsdist/test_Dnstap.py @@ -433,6 +433,103 @@ class TestDnstapOverFrameStreamUnixLogger(DNSDistTest): checkDnstapQuery(self, dnstap, dnstap_pb2.UDP, query) checkDnstapNoExtra(self, dnstap) +class TestDnstapOverRemotePoolUnixLogger(DNSDistTest): + _fstrmLoggerAddress = '/tmp/fslutest.sock' + _fstrmLoggerQueue = Queue() + _fstrmLoggerCounter = 0 + _poolConnectionCount = 5 + _config_params = ['_testServerPort', '_fstrmLoggerAddress', '_poolConnectionCount'] + _config_template = """ + newServer{address="127.0.0.1:%d", useClientSubnet=true} + fslu = newFrameStreamUnixLogger('%s', { connectionCount = %d }) + + addAction(AllRule(), DnstapLogAction("a.server", fslu)) + """ + + @classmethod + def FrameStreamUnixListener(cls, path): + try: + os.unlink(path) + except OSError: + pass # Assume file not found + sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + try: + sock.bind(path) + except socket.error as e: + print("Error binding in the framestream listener: %s" % str(e)) + sys.exit(1) + + sock.listen(100) + + def handle_connection(conn): + fstrm_handle_bidir_connection(conn, lambda data: \ + cls._fstrmLoggerQueue.put(data, True, timeout=2.0), exit_early=True) + conn.close() + + threads = [] + while True: + (conn, _) = sock.accept() + thread = threading.Thread(target=handle_connection, args=[conn]) + threads.append(thread) + thread.start() + + for thread in threads: + thread.join() + sock.close() + + @classmethod + def startResponders(cls): + DNSDistTest.startResponders() + + cls._fstrmLoggerListener = threading.Thread(name='FrameStreamUnixListener', target=cls.FrameStreamUnixListener, args=[cls._fstrmLoggerAddress]) + cls._fstrmLoggerListener.daemon = True + cls._fstrmLoggerListener.start() + + def getFirstDnstap(self): + data = self._fstrmLoggerQueue.get(True, timeout=2.0) + self.assertTrue(data) + dnstap = dnstap_pb2.Dnstap() + dnstap.ParseFromString(data) + return dnstap + + def testDnstapOverFrameStreamUnix(self): + """ + Dnstap: Send query packed in dnstap to a unix socket fstrmlogger server + """ + for i in range(self._poolConnectionCount): + name = 'query.dnstap.tests.powerdns.com.' + + target = 'target.dnstap.tests.powerdns.com.' + query = dns.message.make_query(name, 'A', 'IN') + response = dns.message.make_response(query) + + rrset = dns.rrset.from_text(name, + 3600, + dns.rdataclass.IN, + dns.rdatatype.CNAME, + target) + response.answer.append(rrset) + + rrset = dns.rrset.from_text(target, + 3600, + dns.rdataclass.IN, + dns.rdatatype.A, + '127.0.0.1') + response.answer.append(rrset) + + (receivedQuery, receivedResponse) = self.sendUDPQuery(query, response) + self.assertTrue(receivedQuery) + self.assertTrue(receivedResponse) + receivedQuery.id = query.id + self.assertEqual(query, receivedQuery) + self.assertEqual(response, receivedResponse) + + # check the dnstap message corresponding to the UDP query + dnstap = self.getFirstDnstap() + + checkDnstapQuery(self, dnstap, dnstap_pb2.UDP, query) + checkDnstapNoExtra(self, dnstap) + class TestDnstapOverFrameStreamTcpLogger(DNSDistTest): _fstrmLoggerPort = pickAvailablePort()