]>
git.ipfire.org Git - thirdparty/pdns.git/blob - regression-tests.dnsdist/test_RestartQuery.py
3 import clientsubnetoption
5 from dnsdisttests
import DNSDistTest
, pickAvailablePort
7 def servFailResponseCallback(request
):
8 response
= dns
.message
.make_response(request
)
9 response
.set_rcode(dns
.rcode
.SERVFAIL
)
10 return response
.to_wire()
12 def normalResponseCallback(request
):
13 response
= dns
.message
.make_response(request
)
14 rrset
= dns
.rrset
.from_text(request
.question
[0].name
,
19 response
.answer
.append(rrset
)
20 return response
.to_wire()
22 class TestRestartQuery(DNSDistTest
):
24 # this test suite uses different responder ports
25 _testNormalServerPort
= pickAvailablePort()
26 _testServfailServerPort
= pickAvailablePort()
27 _config_template
= """
28 newServer{address="127.0.0.1:%d", pool='restarted'}:setUp()
29 newServer{address="127.0.0.1:%d", pool=''}:setUp()
31 function makeQueryRestartable(dq)
36 function restartOnServFail(dr)
37 if dr.rcode == DNSRCode.SERVFAIL then
42 return DNSResponseAction.None
45 addAction(AllRule(), LuaAction(makeQueryRestartable))
46 addResponseAction(AllRule(), LuaResponseAction(restartOnServFail))
48 _config_params
= ['_testNormalServerPort', '_testServfailServerPort']
52 def startResponders(cls
):
53 print("Launching responders..")
56 cls
._UDPResponder
= threading
.Thread(name
='UDP Responder', target
=cls
.UDPResponder
, args
=[cls
._testServfailServerPort
, cls
._toResponderQueue
, cls
._fromResponderQueue
, False, servFailResponseCallback
])
57 cls
._UDPResponder
.daemon
= True
58 cls
._UDPResponder
.start()
59 cls
._TCPResponder
= threading
.Thread(name
='TCP Responder', target
=cls
.TCPResponder
, args
=[cls
._testServfailServerPort
, cls
._toResponderQueue
, cls
._fromResponderQueue
, False, False, servFailResponseCallback
])
60 cls
._TCPResponder
.daemon
= True
61 cls
._TCPResponder
.start()
62 cls
._UDPResponderNormal
= threading
.Thread(name
='UDP ResponderNormal', target
=cls
.UDPResponder
, args
=[cls
._testNormalServerPort
, cls
._toResponderQueue
, cls
._fromResponderQueue
, False, normalResponseCallback
])
63 cls
._UDPResponderNormal
.daemon
= True
64 cls
._UDPResponderNormal
.start()
65 cls
._TCPResponderNormal
= threading
.Thread(name
='TCP ResponderNormal', target
=cls
.TCPResponder
, args
=[cls
._testNormalServerPort
, cls
._toResponderQueue
, cls
._fromResponderQueue
, False, False, normalResponseCallback
])
66 cls
._TCPResponderNormal
.daemon
= True
67 cls
._TCPResponderNormal
.start()
69 def testRestartingQuery(self
):
71 Restart: ServFail then restarted to a second pool
73 name
= 'restart.tests.powerdns.com.'
74 query
= dns
.message
.make_query(name
, 'A', 'IN')
75 rrset
= dns
.rrset
.from_text(name
,
80 expectedResponse
= dns
.message
.make_response(query
)
81 expectedResponse
.answer
.append(rrset
)
83 for method
in ("sendUDPQuery", "sendTCPQuery"):
84 sender
= getattr(self
, method
)
85 (_
, receivedResponse
) = sender(query
, response
=None, useQueue
=False)
86 self
.assertTrue(receivedResponse
)
87 self
.assertEqual(receivedResponse
, expectedResponse
)