]> git.ipfire.org Git - thirdparty/pdns.git/blob - regression-tests.dnsdist/test_RestartQuery.py
Meson: Separate test files from common files
[thirdparty/pdns.git] / regression-tests.dnsdist / test_RestartQuery.py
1 #!/usr/bin/env python
2 import threading
3 import clientsubnetoption
4 import dns
5 from dnsdisttests import DNSDistTest, pickAvailablePort
6
7 def servFailResponseCallback(request):
8 response = dns.message.make_response(request)
9 response.set_rcode(dns.rcode.SERVFAIL)
10 return response.to_wire()
11
12 def normalResponseCallback(request):
13 response = dns.message.make_response(request)
14 rrset = dns.rrset.from_text(request.question[0].name,
15 3600,
16 dns.rdataclass.IN,
17 dns.rdatatype.A,
18 '127.0.0.1')
19 response.answer.append(rrset)
20 return response.to_wire()
21
22 class TestRestartQuery(DNSDistTest):
23
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()
30
31 function makeQueryRestartable(dq)
32 dq:setRestartable()
33 return DNSAction.None
34 end
35
36 function restartOnServFail(dr)
37 if dr.rcode == DNSRCode.SERVFAIL then
38 dr.pool = 'restarted'
39 dr:restart()
40 end
41
42 return DNSResponseAction.None
43 end
44
45 addAction(AllRule(), LuaAction(makeQueryRestartable))
46 addResponseAction(AllRule(), LuaResponseAction(restartOnServFail))
47 """
48 _config_params = ['_testNormalServerPort', '_testServfailServerPort']
49 _verboseMode = True
50
51 @classmethod
52 def startResponders(cls):
53 print("Launching responders..")
54
55 # servfail
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()
68
69 def testRestartingQuery(self):
70 """
71 Restart: ServFail then restarted to a second pool
72 """
73 name = 'restart.tests.powerdns.com.'
74 query = dns.message.make_query(name, 'A', 'IN')
75 rrset = dns.rrset.from_text(name,
76 3600,
77 dns.rdataclass.IN,
78 dns.rdatatype.A,
79 '127.0.0.1')
80 expectedResponse = dns.message.make_response(query)
81 expectedResponse.answer.append(rrset)
82
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)
88