]> git.ipfire.org Git - thirdparty/pdns.git/blob - regression-tests.dnsdist/test_DynBlocksServFail.py
dnsdist: Preserve 'LLVM_PROFILE_FILE' in sudo-enabled regression tests
[thirdparty/pdns.git] / regression-tests.dnsdist / test_DynBlocksServFail.py
1 #!/usr/bin/env python
2 import base64
3 import socket
4 import time
5 import dns
6 from dnsdisttests import DNSDistTest
7 from dnsdistDynBlockTests import DynBlocksTest, waitForMaintenanceToRun, _maintenanceWaitTime
8
9 class TestDynBlockServFails(DynBlocksTest):
10
11 _config_template = """
12 function maintenance()
13 addDynBlocks(exceedServFails(%d, %d), "Exceeded servfail rate", %d)
14 end
15 newServer{address="127.0.0.1:%s"}
16 """
17
18 def testDynBlocksServFailRate(self):
19 """
20 Dyn Blocks: Server Failure Rate
21 """
22 name = 'servfailrate.dynblocks.tests.powerdns.com.'
23 self.doTestRCodeRate(name, dns.rcode.SERVFAIL)
24
25 class TestDynBlockServFailsCached(DynBlocksTest):
26
27 _config_template = """
28 pc = newPacketCache(10000, {maxTTL=86400, minTTL=0, temporaryFailureTTL=60, staleTTL=60, dontAge=false})
29 getPool(""):setCache(pc)
30 function maintenance()
31 addDynBlocks(exceedServFails(%d, %d), "Exceeded servfail rate", %d)
32 end
33 newServer{address="127.0.0.1:%s"}
34 """
35
36 def testDynBlocksServFailRateCached(self):
37 """
38 Dyn Blocks: Make sure cache hit responses also gets inserted into rings
39 """
40 name = 'servfailrate.dynblocks.tests.powerdns.com.'
41 rcode = dns.rcode.SERVFAIL
42 query = dns.message.make_query(name, 'A', 'IN')
43 response = dns.message.make_response(query)
44 rrset = dns.rrset.from_text(name,
45 60,
46 dns.rdataclass.IN,
47 dns.rdatatype.A,
48 '192.0.2.1')
49 response.answer.append(rrset)
50 expectedResponse = dns.message.make_response(query)
51 expectedResponse.set_rcode(rcode)
52
53
54 for method in ("sendUDPQuery", "sendTCPQuery"):
55 print(method, "()")
56 sender = getattr(self, method)
57
58 # fill the cache
59 (receivedQuery, receivedResponse) = sender(query, expectedResponse)
60 receivedQuery.id = query.id
61 self.assertEqual(query, receivedQuery)
62 self.assertEqual(expectedResponse, receivedResponse)
63
64 waitForMaintenanceToRun()
65
66 # we should NOT be dropped!
67 (_, receivedResponse) = sender(query, response=None)
68 self.assertEqual(receivedResponse, expectedResponse)
69
70 # now with rcode!
71 sent = 0
72 allowed = 0
73 for _ in range((self._dynBlockQPS * self._dynBlockPeriod) + 1):
74 (_, receivedResponse) = sender(query, expectedResponse)
75 sent = sent + 1
76 self.assertEqual(expectedResponse, receivedResponse)
77 allowed = allowed + 1
78 # we might be already blocked, but we should have been able to send
79 # at least self._dynBlockQPS queries
80 self.assertGreaterEqual(allowed, self._dynBlockQPS)
81
82 if allowed == sent:
83 waitForMaintenanceToRun()
84
85 # we should now be dropped for up to self._dynBlockDuration + self._dynBlockPeriod
86 (_, receivedResponse) = sender(query, response=None, useQueue=False)
87 self.assertEqual(receivedResponse, None)
88
89 # wait until we are not blocked anymore
90 time.sleep(self._dynBlockDuration + self._dynBlockPeriod)
91
92 # this one should succeed
93 (receivedQuery, receivedResponse) = sender(query, response=None)
94 self.assertEqual(expectedResponse, receivedResponse)
95
96 class TestDynBlockGroupServFails(DynBlocksTest):
97
98 _config_template = """
99 local dbr = dynBlockRulesGroup()
100 dbr:setRCodeRate(DNSRCode.SERVFAIL, %d, %d, "Exceeded query rate", %d)
101
102 function maintenance()
103 dbr:apply()
104 end
105
106 newServer{address="127.0.0.1:%s"}
107 """
108
109 def testDynBlocksServFailRate(self):
110 """
111 Dyn Blocks (group): Server Failure Rate
112 """
113 name = 'servfailrate.group.dynblocks.tests.powerdns.com.'
114 self.doTestRCodeRate(name, dns.rcode.SERVFAIL)