]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Add `RemotePoolLogger` tests for unix socket based logger
authorEnsar Sarajčić <dev@ensarsarajcic.com>
Mon, 10 Feb 2025 08:39:30 +0000 (09:39 +0100)
committerEnsar Sarajčić <dev@ensarsarajcic.com>
Mon, 10 Feb 2025 08:39:30 +0000 (09:39 +0100)
regression-tests.dnsdist/test_Dnstap.py

index 2278cbaf2e72eac15336762a880152f460e48a47..9947c2899ede79e39eebdf92b976db964b41cc18 100644 (file)
@@ -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()