]> git.ipfire.org Git - thirdparty/pdns.git/blobdiff - regression-tests.dnsdist/test_TCPKeepAlive.py
Merge pull request #8795 from omoerbeek/rec-lua-docs-policytag
[thirdparty/pdns.git] / regression-tests.dnsdist / test_TCPKeepAlive.py
index a1672e494128142454619d6676942316fdaa91a6..c0c8ebb675882aadf4dc1636092ab76f484344fc 100644 (file)
@@ -2,7 +2,12 @@
 import struct
 import time
 import dns
-from dnsdisttests import DNSDistTest, range
+from dnsdisttests import DNSDistTest
+
+try:
+    range = xrange
+except NameError:
+    pass
 
 class TestTCPKeepAlive(DNSDistTest):
     """
@@ -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"
@@ -39,6 +45,7 @@ class TestTCPKeepAlive(DNSDistTest):
         """
         name = 'refused.tcpka.tests.powerdns.com.'
         query = dns.message.make_query(name, 'A', 'IN')
+        query.flags &= ~dns.flags.RD
         expectedResponse = dns.message.make_response(query)
         expectedResponse.set_rcode(dns.rcode.REFUSED)
 
@@ -199,6 +206,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