]> git.ipfire.org Git - thirdparty/pdns.git/blame - regression-tests.dnsdist/test_TCPLimits.py
TeeAction: make getStats() order deterministic
[thirdparty/pdns.git] / regression-tests.dnsdist / test_TCPLimits.py
CommitLineData
9396d955
RG
1#!/usr/bin/env python
2import struct
3import time
4import dns
5from dnsdisttests import DNSDistTest
6
7class TestTCPLimits(DNSDistTest):
8
9 _tcpIdleTimeout = 2
10 _maxTCPQueriesPerConn = 5
11 _maxTCPConnsPerClient = 3
12 _maxTCPConnDuration = 5
13 _config_template = """
14 newServer{address="127.0.0.1:%s"}
15 setTCPRecvTimeout(%s)
16 setMaxTCPQueriesPerConnection(%s)
17 setMaxTCPConnectionsPerClient(%s)
18 setMaxTCPConnectionDuration(%s)
19 """
20 _config_params = ['_testServerPort', '_tcpIdleTimeout', '_maxTCPQueriesPerConn', '_maxTCPConnsPerClient', '_maxTCPConnDuration']
21
22 def testTCPQueriesPerConn(self):
23 """
24 TCP Limits: Maximum number of queries
25 """
26 name = 'maxqueriesperconn.tcp.tests.powerdns.com.'
27 query = dns.message.make_query(name, 'A', 'IN')
28 conn = self.openTCPConnection()
29
30 count = 0
31 for idx in xrange(self._maxTCPQueriesPerConn):
32 try:
33 self.sendTCPQueryOverConnection(conn, query)
34 response = self.recvTCPResponseOverConnection(conn)
35 self.assertTrue(response)
36 count = count + 1
37 except:
38 pass
39
40 # this one should fail
41 failed = False
42 try:
43 self.sendTCPQueryOverConnection(conn, query)
44 response = self.recvTCPResponseOverConnection(conn)
45 self.assertFalse(response)
46 if not response:
47 failed = True
48 else:
49 count = count + 1
50 except:
51 failed = True
52
53 conn.close()
54 self.assertTrue(failed)
55 self.assertEqual(count, self._maxTCPQueriesPerConn)
56
57 def testTCPConnsPerClient(self):
58 """
59 TCP Limits: Maximum number of conns per client
60 """
61 name = 'maxconnsperclient.tcp.tests.powerdns.com.'
62 query = dns.message.make_query(name, 'A', 'IN')
63 conns = []
64
65 for idx in xrange(self._maxTCPConnsPerClient + 1):
66 conns.append(self.openTCPConnection())
67
68 count = 0
69 failed = 0
70 for conn in conns:
71 try:
72 self.sendTCPQueryOverConnection(conn, query)
73 response = self.recvTCPResponseOverConnection(conn)
74 if response:
75 count = count + 1
76 else:
77 failed = failed + 1
78 except:
79 failed = failed + 1
80
81 for conn in conns:
82 conn.close()
83
84 self.assertEqual(count, self._maxTCPConnsPerClient)
85 self.assertEqual(failed, 1)
86
87 def testTCPDuration(self):
88 """
89 TCP Limits: Maximum duration
90 """
91 name = 'duration.tcp.tests.powerdns.com.'
92
93 start = time.time()
94 conn = self.openTCPConnection()
95 # immediately send the maximum size
96 conn.send(struct.pack("!H", 65535))
97
98 count = 0
99 while count < (self._maxTCPConnDuration * 2):
100 try:
101 # sleeping for only one second keeps us below the
102 # idle timeout (setTCPRecvTimeout())
103 time.sleep(1)
104 conn.send('A')
105 count = count + 1
106 except:
107 break
108
109 end = time.time()
110
111 self.assertAlmostEquals(count, self._maxTCPConnDuration, delta=2)
112 self.assertAlmostEquals(end - start, self._maxTCPConnDuration, delta=2)
113
114 conn.close()