]>
git.ipfire.org Git - thirdparty/pdns.git/blob - regression-tests.dnsdist/test_TCPLimits.py
5 from dnsdisttests
import DNSDistTest
, pickAvailablePort
12 class TestTCPLimits(DNSDistTest
):
14 # this test suite uses a different responder port
15 # because it uses a different health check configuration
16 _testServerPort
= pickAvailablePort()
17 _answerUnexpected
= True
20 _maxTCPQueriesPerConn
= 5
21 _maxTCPConnsPerClient
= 3
22 _maxTCPConnDuration
= 5
23 _config_template
= """
24 newServer{address="127.0.0.1:%s"}
26 setMaxTCPQueriesPerConnection(%s)
27 setMaxTCPConnectionsPerClient(%s)
28 setMaxTCPConnectionDuration(%s)
30 _config_params
= ['_testServerPort', '_tcpIdleTimeout', '_maxTCPQueriesPerConn', '_maxTCPConnsPerClient', '_maxTCPConnDuration']
33 def testTCPQueriesPerConn(self
):
35 TCP Limits: Maximum number of queries
37 name
= 'maxqueriesperconn.tcp.tests.powerdns.com.'
38 query
= dns
.message
.make_query(name
, 'A', 'IN')
39 conn
= self
.openTCPConnection()
42 for idx
in range(self
._maxTCPQueriesPerConn
):
44 self
.sendTCPQueryOverConnection(conn
, query
)
45 response
= self
.recvTCPResponseOverConnection(conn
)
46 self
.assertTrue(response
)
51 # this one should fail
54 self
.sendTCPQueryOverConnection(conn
, query
)
55 response
= self
.recvTCPResponseOverConnection(conn
)
56 self
.assertFalse(response
)
65 self
.assertTrue(failed
)
66 self
.assertEqual(count
, self
._maxTCPQueriesPerConn
)
68 def testTCPConnsPerClient(self
):
70 TCP Limits: Maximum number of conns per client
72 name
= 'maxconnsperclient.tcp.tests.powerdns.com.'
73 query
= dns
.message
.make_query(name
, 'A', 'IN')
76 for idx
in range(self
._maxTCPConnsPerClient
+ 1):
77 conns
.append(self
.openTCPConnection())
83 self
.sendTCPQueryOverConnection(conn
, query
)
84 response
= self
.recvTCPResponseOverConnection(conn
)
95 # wait a bit to be sure that dnsdist closed the connections
96 # and decremented the counters on its side, otherwise subsequent
97 # connections will be dropped
100 self
.assertEqual(count
, self
._maxTCPConnsPerClient
)
101 self
.assertEqual(failed
, 1)
103 def testTCPDuration(self
):
105 TCP Limits: Maximum duration
107 name
= 'duration.tcp.tests.powerdns.com.'
110 conn
= self
.openTCPConnection()
111 # immediately send the maximum size
112 conn
.send(struct
.pack("!H", 65535))
115 while count
< (self
._maxTCPConnDuration
* 20):
117 # sleeping for only one second keeps us below the
118 # idle timeout (setTCPRecvTimeout())
122 except Exception as e
:
123 print("Exception: %s!" % (e
))
128 self
.assertAlmostEqual(count
/ 10, self
._maxTCPConnDuration
, delta
=2)
129 self
.assertAlmostEqual(end
- start
, self
._maxTCPConnDuration
, delta
=2)
133 class TestTCPFrontendLimits(DNSDistTest
):
135 # this test suite uses a different responder port
136 # because it uses a different health check configuration
137 _testServerPort
= pickAvailablePort()
138 _answerUnexpected
= True
140 _skipListeningOnCL
= True
142 _maxTCPConnsPerFrontend
= 10
143 _config_template
= """
144 newServer{address="127.0.0.1:%s"}
145 setLocal("%s:%d", {maxConcurrentTCPConnections=%d})
147 _config_params
= ['_testServerPort', '_dnsDistListeningAddr', '_dnsDistPort', '_maxTCPConnsPerFrontend']
150 def testTCPConnsPerFrontend(self
):
152 TCP Frontend Limits: Maximum number of conns per frontend
154 name
= 'maxconnsperfrontend.tcp.tests.powerdns.com.'
155 query
= dns
.message
.make_query(name
, 'A', 'IN')
158 for idx
in range(self
._maxTCPConnsPerFrontend
+ 1):
159 conns
.append(self
.openTCPConnection())
165 self
.sendTCPQueryOverConnection(conn
, query
)
166 response
= self
.recvTCPResponseOverConnection(conn
)
177 # wait a bit to be sure that dnsdist closed the connections
178 # and decremented the counters on its side, otherwise subsequent
179 # connections will be dropped
182 self
.assertEqual(count
, self
._maxTCPConnsPerFrontend
)
183 self
.assertEqual(failed
, 1)