]>
git.ipfire.org Git - thirdparty/pdns.git/blob - regression-tests.dnsdist/test_DynBlocksServFail.py
6 from dnsdisttests
import DNSDistTest
7 from dnsdistDynBlockTests
import DynBlocksTest
, waitForMaintenanceToRun
, _maintenanceWaitTime
9 class TestDynBlockServFails(DynBlocksTest
):
11 _config_template
= """
12 function maintenance()
13 addDynBlocks(exceedServFails(%d, %d), "Exceeded servfail rate", %d)
15 newServer{address="127.0.0.1:%s"}
18 def testDynBlocksServFailRate(self
):
20 Dyn Blocks: Server Failure Rate
22 name
= 'servfailrate.dynblocks.tests.powerdns.com.'
23 self
.doTestRCodeRate(name
, dns
.rcode
.SERVFAIL
)
25 class TestDynBlockServFailsCached(DynBlocksTest
):
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)
33 newServer{address="127.0.0.1:%s"}
36 def testDynBlocksServFailRateCached(self
):
38 Dyn Blocks: Make sure cache hit responses also gets inserted into rings
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
,
49 response
.answer
.append(rrset
)
50 expectedResponse
= dns
.message
.make_response(query
)
51 expectedResponse
.set_rcode(rcode
)
54 for method
in ("sendUDPQuery", "sendTCPQuery"):
56 sender
= getattr(self
, method
)
59 (receivedQuery
, receivedResponse
) = sender(query
, expectedResponse
)
60 receivedQuery
.id = query
.id
61 self
.assertEqual(query
, receivedQuery
)
62 self
.assertEqual(expectedResponse
, receivedResponse
)
64 waitForMaintenanceToRun()
66 # we should NOT be dropped!
67 (_
, receivedResponse
) = sender(query
, response
=None)
68 self
.assertEqual(receivedResponse
, expectedResponse
)
73 for _
in range((self
._dynBlockQPS
* self
._dynBlockPeriod
) + 1):
74 (_
, receivedResponse
) = sender(query
, expectedResponse
)
76 self
.assertEqual(expectedResponse
, receivedResponse
)
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
)
83 waitForMaintenanceToRun()
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)
89 # wait until we are not blocked anymore
90 time
.sleep(self
._dynBlockDuration
+ self
._dynBlockPeriod
)
92 # this one should succeed
93 (receivedQuery
, receivedResponse
) = sender(query
, response
=None)
94 self
.assertEqual(expectedResponse
, receivedResponse
)
96 class TestDynBlockGroupServFails(DynBlocksTest
):
98 _config_template
= """
99 local dbr = dynBlockRulesGroup()
100 dbr:setRCodeRate(DNSRCode.SERVFAIL, %d, %d, "Exceeded query rate", %d)
102 function maintenance()
106 newServer{address="127.0.0.1:%s"}
109 def testDynBlocksServFailRate(self
):
111 Dyn Blocks (group): Server Failure Rate
113 name
= 'servfailrate.group.dynblocks.tests.powerdns.com.'
114 self
.doTestRCodeRate(name
, dns
.rcode
.SERVFAIL
)