]> git.ipfire.org Git - thirdparty/pdns.git/blame - regression-tests.dnsdist/test_AXFR.py
dnsdist: Add bindings for the `DNSResponse` object
[thirdparty/pdns.git] / regression-tests.dnsdist / test_AXFR.py
CommitLineData
548c8b66
RG
1#!/usr/bin/env python
2import threading
3import dns
4from dnsdisttests import DNSDistTest
5
6class TestAXFR(DNSDistTest):
7
8 # this test suite uses a different responder port
9 # because, contrary to the other ones, its
10 # TCP responder allows multiple responses and we don't want
11 # to mix things up.
12 _testServerPort = 5370
13 _config_template = """
14 newServer{address="127.0.0.1:%s"}
15 """
16 @classmethod
17 def startResponders(cls):
18 print("Launching responders..")
19
20 cls._UDPResponder = threading.Thread(name='UDP Responder', target=cls.UDPResponder, args=[cls._testServerPort])
21 cls._UDPResponder.setDaemon(True)
22 cls._UDPResponder.start()
23 cls._TCPResponder = threading.Thread(name='TCP Responder', target=cls.TCPResponder, args=[cls._testServerPort, False, True])
24 cls._TCPResponder.setDaemon(True)
25 cls._TCPResponder.start()
26
27 _config_template = """
28 newServer{address="127.0.0.1:%s"}
29 """
30
31 def testOneMessageAXFR(self):
32 """
33 AXFR: One message
34 """
35 name = 'one.axfr.tests.powerdns.com.'
36 query = dns.message.make_query(name, 'AXFR', 'IN')
37 response = dns.message.make_response(query)
38 soa = dns.rrset.from_text(name,
39 60,
40 dns.rdataclass.IN,
41 dns.rdatatype.SOA,
42 'ns.' + name + ' hostmaster.' + name + ' 1 3600 3600 3600 60')
43 response.answer.append(soa)
44 response.answer.append(dns.rrset.from_text(name,
45 60,
46 dns.rdataclass.IN,
47 dns.rdatatype.A,
48 '192.0.2.1'))
49 response.answer.append(soa)
50
51 (receivedQuery, receivedResponse) = self.sendTCPQuery(query, response)
52 receivedQuery.id = query.id
53 self.assertEqual(query, receivedQuery)
54 self.assertEqual(response, receivedResponse)
55
56 def testOneNoSOAAXFR(self):
57 """
58 AXFR: One message, no SOA
59 """
60 name = 'onenosoa.axfr.tests.powerdns.com.'
61 query = dns.message.make_query(name, 'AXFR', 'IN')
62 response = dns.message.make_response(query)
63 response.answer.append(dns.rrset.from_text(name,
64 60,
65 dns.rdataclass.IN,
66 dns.rdatatype.A,
67 '192.0.2.1'))
68
69 (receivedQuery, receivedResponse) = self.sendTCPQuery(query, response)
70 receivedQuery.id = query.id
71 self.assertEqual(query, receivedQuery)
72 self.assertEqual(response, receivedResponse)
73
74 def testFourMessagesAXFR(self):
75 """
76 AXFR: Four messages
77 """
78 name = 'four.axfr.tests.powerdns.com.'
79 query = dns.message.make_query(name, 'AXFR', 'IN')
80 responses = []
81 soa = dns.rrset.from_text(name,
82 60,
83 dns.rdataclass.IN,
84 dns.rdatatype.SOA,
85 'ns.' + name + ' hostmaster.' + name + ' 1 3600 3600 3600 60')
86 response = dns.message.make_response(query)
87 response.answer.append(soa)
88 responses.append(response)
89
90 response = dns.message.make_response(query)
91 response.answer.append(dns.rrset.from_text(name,
92 60,
93 dns.rdataclass.IN,
94 dns.rdatatype.A,
95 '192.0.2.1'))
96 responses.append(response)
97
98 response = dns.message.make_response(query)
99 rrset = dns.rrset.from_text(name,
100 60,
101 dns.rdataclass.IN,
102 dns.rdatatype.AAAA,
103 '2001:DB8::1')
104 response.answer.append(rrset)
105 responses.append(response)
106
107 response = dns.message.make_response(query)
108 rrset = dns.rrset.from_text(name,
109 60,
110 dns.rdataclass.IN,
111 dns.rdatatype.TXT,
112 'dummy')
113 response.answer.append(rrset)
114 responses.append(response)
115
116 response = dns.message.make_response(query)
117 response.answer.append(soa)
118 responses.append(response)
119
120 (receivedQuery, receivedResponses) = self.sendTCPQueryWithMultipleResponses(query, responses)
121 receivedQuery.id = query.id
122 self.assertEqual(query, receivedQuery)
123 self.assertEqual(len(receivedResponses), len(responses))
124
125 def testFourNoFinalSOAAXFR(self):
126 """
127 AXFR: Four messages, no final SOA
128 """
129 name = 'fournosoa.axfr.tests.powerdns.com.'
130 query = dns.message.make_query(name, 'AXFR', 'IN')
131 responses = []
132 soa = dns.rrset.from_text(name,
133 60,
134 dns.rdataclass.IN,
135 dns.rdatatype.SOA,
136 'ns.' + name + ' hostmaster.' + name + ' 1 3600 3600 3600 60')
137 response = dns.message.make_response(query)
138 response.answer.append(soa)
139 responses.append(response)
140
141 response = dns.message.make_response(query)
142 response.answer.append(dns.rrset.from_text(name,
143 60,
144 dns.rdataclass.IN,
145 dns.rdatatype.A,
146 '192.0.2.1'))
147 responses.append(response)
148
149 response = dns.message.make_response(query)
150 rrset = dns.rrset.from_text(name,
151 60,
152 dns.rdataclass.IN,
153 dns.rdatatype.AAAA,
154 '2001:DB8::1')
155 response.answer.append(rrset)
156 responses.append(response)
157
158 response = dns.message.make_response(query)
159 rrset = dns.rrset.from_text(name,
160 60,
161 dns.rdataclass.IN,
162 dns.rdatatype.TXT,
163 'dummy')
164 response.answer.append(rrset)
165 responses.append(response)
166
167 (receivedQuery, receivedResponses) = self.sendTCPQueryWithMultipleResponses(query, responses)
168 receivedQuery.id = query.id
169 self.assertEqual(query, receivedQuery)
170 self.assertEqual(len(receivedResponses), len(responses))
171
172 def testFourNoFirstSOAAXFR(self):
173 """
174 AXFR: Four messages, no SOA in the first one
175 """
176 name = 'fournosoainfirst.axfr.tests.powerdns.com.'
177 query = dns.message.make_query(name, 'AXFR', 'IN')
178 responses = []
179 soa = dns.rrset.from_text(name,
180 60,
181 dns.rdataclass.IN,
182 dns.rdatatype.SOA,
183 'ns.' + name + ' hostmaster.' + name + ' 1 3600 3600 3600 60')
184 response = dns.message.make_response(query)
185 response.answer.append(dns.rrset.from_text(name,
186 60,
187 dns.rdataclass.IN,
188 dns.rdatatype.A,
189 '192.0.2.1'))
190 responses.append(response)
191
192 response = dns.message.make_response(query)
193 rrset = dns.rrset.from_text(name,
194 60,
195 dns.rdataclass.IN,
196 dns.rdatatype.AAAA,
197 '2001:DB8::1')
198 response.answer.append(soa)
199 response.answer.append(rrset)
200 responses.append(response)
201
202 response = dns.message.make_response(query)
203 rrset = dns.rrset.from_text('dummy.' + name,
204 60,
205 dns.rdataclass.IN,
206 dns.rdatatype.AAAA,
207 '2001:DB8::1')
208 response.answer.append(rrset)
209 responses.append(response)
210
211 response = dns.message.make_response(query)
212 rrset = dns.rrset.from_text(name,
213 60,
214 dns.rdataclass.IN,
215 dns.rdatatype.TXT,
216 'dummy')
217 response.answer.append(rrset)
218 response.answer.append(soa)
219 responses.append(response)
220
221 (receivedQuery, receivedResponses) = self.sendTCPQueryWithMultipleResponses(query, responses)
222 receivedQuery.id = query.id
223 self.assertEqual(query, receivedQuery)
224 self.assertEqual(len(receivedResponses), 1)
225
226 def testFourLastSOAInSecondAXFR(self):
227 """
228 AXFR: Four messages, SOA in the first one and the second one
229 """
230 name = 'foursecondsoainsecond.axfr.tests.powerdns.com.'
231 query = dns.message.make_query(name, 'AXFR', 'IN')
232 responses = []
233 soa = dns.rrset.from_text(name,
234 60,
235 dns.rdataclass.IN,
236 dns.rdatatype.SOA,
237 'ns.' + name + ' hostmaster.' + name + ' 1 3600 3600 3600 60')
238
239 response = dns.message.make_response(query)
240 response.answer.append(soa)
241 response.answer.append(dns.rrset.from_text(name,
242 60,
243 dns.rdataclass.IN,
244 dns.rdatatype.A,
245 '192.0.2.1'))
246 responses.append(response)
247
248 response = dns.message.make_response(query)
249 response.answer.append(soa)
250 rrset = dns.rrset.from_text(name,
251 60,
252 dns.rdataclass.IN,
253 dns.rdatatype.AAAA,
254 '2001:DB8::1')
255 response.answer.append(rrset)
256 responses.append(response)
257
258 response = dns.message.make_response(query)
259 rrset = dns.rrset.from_text('dummy.' + name,
260 60,
261 dns.rdataclass.IN,
262 dns.rdatatype.AAAA,
263 '2001:DB8::1')
264 response.answer.append(rrset)
265 responses.append(response)
266
267 response = dns.message.make_response(query)
268 rrset = dns.rrset.from_text(name,
269 60,
270 dns.rdataclass.IN,
271 dns.rdatatype.TXT,
272 'dummy')
273 response.answer.append(rrset)
274 responses.append(response)
275
276 (receivedQuery, receivedResponses) = self.sendTCPQueryWithMultipleResponses(query, responses)
277 receivedQuery.id = query.id
278 self.assertEqual(query, receivedQuery)
279 self.assertEqual(len(receivedResponses), 2)