]> git.ipfire.org Git - thirdparty/pdns.git/blobdiff - regression-tests.dnsdist/test_TCPKeepAlive.py
Merge pull request #7703 from omoerbeek/fix-test-distributor-pipesize
[thirdparty/pdns.git] / regression-tests.dnsdist / test_TCPKeepAlive.py
index 9f0f3fc54f03f00ffc7524f6c50ebdcdaca62d32..f975c9f403a03d30c6d1481ba207c8d857b86567 100644 (file)
@@ -4,6 +4,11 @@ import time
 import dns
 from dnsdisttests import DNSDistTest
 
+try:
+    range = xrange
+except NameError:
+    pass
+
 class TestTCPKeepAlive(DNSDistTest):
     """
     These tests make sure that dnsdist keeps the TCP connection alive
@@ -13,7 +18,7 @@ class TestTCPKeepAlive(DNSDistTest):
 
     _tcpIdleTimeout = 20
     _maxTCPQueriesPerConn = 99
-    _maxTCPConnsPerClient = 3
+    _maxTCPConnsPerClient = 100
     _maxTCPConnDuration = 99
     _config_template = """
     newServer{address="127.0.0.1:%s"}
@@ -21,9 +26,10 @@ class TestTCPKeepAlive(DNSDistTest):
     setMaxTCPQueriesPerConnection(%s)
     setMaxTCPConnectionsPerClient(%s)
     setMaxTCPConnectionDuration(%s)
-    pc = newPacketCache(100, 86400, 1)
+    pc = newPacketCache(100, {maxTTL=86400, minTTL=1})
     getPool(""):setCache(pc)
-    addAction("refused.tcpka.tests.powerdns.com.", RCodeAction(dnsdist.REFUSED))
+    addAction("largernumberofconnections.tcpka.tests.powerdns.com.", SkipCacheAction())
+    addAction("refused.tcpka.tests.powerdns.com.", RCodeAction(DNSRCode.REFUSED))
     addAction("dropped.tcpka.tests.powerdns.com.", DropAction())
     addResponseAction("dropped-response.tcpka.tests.powerdns.com.", DropResponseAction())
     -- create the pool named "nosuchpool"
@@ -45,7 +51,7 @@ class TestTCPKeepAlive(DNSDistTest):
         conn = self.openTCPConnection()
 
         count = 0
-        for idx in xrange(5):
+        for idx in range(5):
             try:
                 self.sendTCPQueryOverConnection(conn, query)
                 response = self.recvTCPResponseOverConnection(conn)
@@ -84,7 +90,7 @@ class TestTCPKeepAlive(DNSDistTest):
         conn = self.openTCPConnection()
 
         count = 0
-        for idx in xrange(5):
+        for idx in range(5):
             try:
                 self.sendTCPQueryOverConnection(conn, query)
                 response = self.recvTCPResponseOverConnection(conn)
@@ -114,7 +120,7 @@ class TestTCPKeepAlive(DNSDistTest):
         conn = self.openTCPConnection()
 
         count = 0
-        for idx in xrange(5):
+        for idx in range(5):
             try:
                 self.sendTCPQueryOverConnection(conn, query)
                 response = self.recvTCPResponseOverConnection(conn)
@@ -139,7 +145,7 @@ class TestTCPKeepAlive(DNSDistTest):
         conn = self.openTCPConnection()
 
         count = 0
-        for idx in xrange(5):
+        for idx in range(5):
             try:
                 self.sendTCPQueryOverConnection(conn, query)
                 response = self.recvTCPResponseOverConnection(conn)
@@ -163,7 +169,7 @@ class TestTCPKeepAlive(DNSDistTest):
         conn = self.openTCPConnection()
 
         count = 0
-        for idx in xrange(5):
+        for idx in range(5):
             try:
                 self.sendTCPQueryOverConnection(conn, query)
                 response = self.recvTCPResponseOverConnection(conn)
@@ -186,7 +192,7 @@ class TestTCPKeepAlive(DNSDistTest):
         conn = self.openTCPConnection()
 
         count = 0
-        for idx in xrange(5):
+        for idx in range(5):
             try:
                 self.sendTCPQueryOverConnection(conn, query)
                 response = self.recvTCPResponseOverConnection(conn)
@@ -199,6 +205,49 @@ class TestTCPKeepAlive(DNSDistTest):
         conn.close()
         self.assertEqual(count, 0)
 
+    def testTCPKaLargeNumberOfConnections(self):
+        """
+        TCP KeepAlive: Large number of connections
+        """
+        name = 'largernumberofconnections.tcpka.tests.powerdns.com.'
+        query = dns.message.make_query(name, 'A', 'IN')
+        expectedResponse = dns.message.make_response(query)
+        #expectedResponse.set_rcode(dns.rcode.SERVFAIL)
+        rrset = dns.rrset.from_text(name,
+                                    3600,
+                                    dns.rdataclass.IN,
+                                    dns.rdatatype.A,
+                                    '192.0.2.1')
+        expectedResponse.answer.append(rrset)
+
+        # number of connections
+        numConns = 50
+        # number of queries per connections
+        numQueriesPerConn = 4
+
+        conns = []
+        start = time.time()
+        for idx in range(numConns):
+            conns.append(self.openTCPConnection())
+
+        count = 0
+        for idx in range(numConns * numQueriesPerConn):
+            try:
+                conn = conns[idx % numConns]
+                self.sendTCPQueryOverConnection(conn, query, response=expectedResponse)
+                response = self.recvTCPResponseOverConnection(conn)
+                if response is None:
+                    break
+                self.assertEquals(expectedResponse, response)
+                count = count + 1
+            except:
+                pass
+
+        for con in conns:
+          conn.close()
+
+        self.assertEqual(count, numConns * numQueriesPerConn)
+
 class TestTCPKeepAliveNoDownstreamDrop(DNSDistTest):
     """
     This test makes sure that dnsdist drops the TCP connection
@@ -236,7 +285,7 @@ class TestTCPKeepAliveNoDownstreamDrop(DNSDistTest):
         conn = self.openTCPConnection()
 
         count = 0
-        for idx in xrange(5):
+        for idx in range(5):
             try:
                 self.sendTCPQueryOverConnection(conn, query)
                 response = self.recvTCPResponseOverConnection(conn)