]>
git.ipfire.org Git - thirdparty/pdns.git/blob - regression-tests.dnsdist/test_AXFR.py
5 from dnsdisttests
import DNSDistTest
, pickAvailablePort
7 class TestAXFR(DNSDistTest
):
9 # this test suite uses a different responder port
10 # because, contrary to the other ones, its
11 # TCP responder allows multiple responses and we don't want
13 _testServerPort
= pickAvailablePort()
14 _config_template
= """
15 newServer{address="127.0.0.1:%s"}
20 def startResponders(cls
):
21 print("Launching responders..")
23 cls
._UDPResponder
= threading
.Thread(name
='UDP Responder', target
=cls
.UDPResponder
, args
=[cls
._testServerPort
, cls
._toResponderQueue
, cls
._fromResponderQueue
])
24 cls
._UDPResponder
.daemon
= True
25 cls
._UDPResponder
.start()
26 cls
._TCPResponder
= threading
.Thread(name
='TCP Responder', target
=cls
.TCPResponder
, args
=[cls
._testServerPort
, cls
._toResponderQueue
, cls
._fromResponderQueue
, False, True, None, None, True])
27 cls
._TCPResponder
.daemon
= True
28 cls
._TCPResponder
.start()
31 # This function is called before every test
32 super(TestAXFR
, self
).setUp()
33 # make sure the TCP connection handlers from the previous test
34 # are not going to read our queue
37 def testOneMessageAXFR(self
):
41 name
= 'one.axfr.tests.powerdns.com.'
42 query
= dns
.message
.make_query(name
, 'AXFR', 'IN')
43 response
= dns
.message
.make_response(query
)
44 soa
= dns
.rrset
.from_text(name
,
48 'ns.' + name
+ ' hostmaster.' + name
+ ' 1 3600 3600 3600 60')
49 response
.answer
.append(soa
)
50 response
.answer
.append(dns
.rrset
.from_text(name
,
55 response
.answer
.append(soa
)
57 (receivedQuery
, receivedResponse
) = self
.sendTCPQuery(query
, response
)
58 receivedQuery
.id = query
.id
59 self
.assertEqual(query
, receivedQuery
)
60 self
.assertEqual(response
, receivedResponse
)
62 def testOneNoSOAAXFR(self
):
64 AXFR: One message, no SOA
66 name
= 'onenosoa.axfr.tests.powerdns.com.'
67 query
= dns
.message
.make_query(name
, 'AXFR', 'IN')
68 response
= dns
.message
.make_response(query
)
69 response
.answer
.append(dns
.rrset
.from_text(name
,
75 (receivedQuery
, receivedResponse
) = self
.sendTCPQuery(query
, response
)
76 receivedQuery
.id = query
.id
77 self
.assertEqual(query
, receivedQuery
)
78 self
.assertEqual(response
, receivedResponse
)
80 def testFourMessagesAXFR(self
):
84 name
= 'four.axfr.tests.powerdns.com.'
85 query
= dns
.message
.make_query(name
, 'AXFR', 'IN')
87 soa
= dns
.rrset
.from_text(name
,
91 'ns.' + name
+ ' hostmaster.' + name
+ ' 1 3600 3600 3600 60')
92 response
= dns
.message
.make_response(query
)
93 response
.answer
.append(soa
)
94 responses
.append(response
)
96 response
= dns
.message
.make_response(query
)
97 response
.answer
.append(dns
.rrset
.from_text(name
,
102 responses
.append(response
)
104 response
= dns
.message
.make_response(query
)
105 rrset
= dns
.rrset
.from_text(name
,
110 response
.answer
.append(rrset
)
111 responses
.append(response
)
113 response
= dns
.message
.make_response(query
)
114 rrset
= dns
.rrset
.from_text(name
,
119 response
.answer
.append(rrset
)
120 responses
.append(response
)
122 response
= dns
.message
.make_response(query
)
123 response
.answer
.append(soa
)
124 responses
.append(response
)
126 (receivedQuery
, receivedResponses
) = self
.sendTCPQueryWithMultipleResponses(query
, responses
)
127 receivedQuery
.id = query
.id
128 self
.assertEqual(query
, receivedQuery
)
129 self
.assertEqual(len(receivedResponses
), len(responses
))
131 def testFourNoFinalSOAAXFR(self
):
133 AXFR: Four messages, no final SOA
135 name
= 'fournosoa.axfr.tests.powerdns.com.'
136 query
= dns
.message
.make_query(name
, 'AXFR', 'IN')
138 soa
= dns
.rrset
.from_text(name
,
142 'ns.' + name
+ ' hostmaster.' + name
+ ' 1 3600 3600 3600 60')
143 response
= dns
.message
.make_response(query
)
144 response
.answer
.append(soa
)
145 responses
.append(response
)
147 response
= dns
.message
.make_response(query
)
148 response
.answer
.append(dns
.rrset
.from_text(name
,
153 responses
.append(response
)
155 response
= dns
.message
.make_response(query
)
156 rrset
= dns
.rrset
.from_text(name
,
161 response
.answer
.append(rrset
)
162 responses
.append(response
)
164 response
= dns
.message
.make_response(query
)
165 rrset
= dns
.rrset
.from_text(name
,
170 response
.answer
.append(rrset
)
171 responses
.append(response
)
173 (receivedQuery
, receivedResponses
) = self
.sendTCPQueryWithMultipleResponses(query
, responses
)
174 receivedQuery
.id = query
.id
175 self
.assertEqual(query
, receivedQuery
)
176 self
.assertEqual(len(receivedResponses
), len(responses
))
178 def testThreePlusTrailingAXFR(self
):
180 AXFR: Three messages including the final SOA, plus a trailing one
182 name
= 'threeplustrailing.axfr.tests.powerdns.com.'
183 query
= dns
.message
.make_query(name
, 'AXFR', 'IN')
185 soa
= dns
.rrset
.from_text(name
,
189 'ns.' + name
+ ' hostmaster.' + name
+ ' 1 3600 3600 3600 60')
191 # the SOA starts the AXFR
192 response
= dns
.message
.make_response(query
)
193 response
.answer
.append(soa
)
194 responses
.append(response
)
197 response
= dns
.message
.make_response(query
)
198 response
.answer
.append(dns
.rrset
.from_text(name
,
203 responses
.append(response
)
206 response
= dns
.message
.make_response(query
)
207 rrset
= dns
.rrset
.from_text(name
,
212 response
.answer
.append(rrset
)
213 responses
.append(response
)
215 # one TXT then the SOA that ends the AXFR
216 response
= dns
.message
.make_response(query
)
217 rrset
= dns
.rrset
.from_text(name
,
222 response
.answer
.append(rrset
)
223 response
.answer
.append(soa
)
224 responses
.append(response
)
226 # and we add a final, dummy TXT message that will
227 # be sent by the backend but that dnsdist should not
228 # pass along to the client
229 response
= dns
.message
.make_response(query
)
230 rrset
= dns
.rrset
.from_text(name
,
235 response
.answer
.append(rrset
)
236 responses
.append(response
)
238 (receivedQuery
, receivedResponses
) = self
.sendTCPQueryWithMultipleResponses(query
, responses
)
239 receivedQuery
.id = query
.id
240 self
.assertEqual(query
, receivedQuery
)
241 self
.assertEqual(len(receivedResponses
), len(responses
) - 1)
243 def testThreePlusTrailingIXFR(self
):
245 IXFR: Three messages including the final SOA, plus a trailing one
247 name
= 'threeplustrailing.ixfr.tests.powerdns.com.'
248 query
= dns
.message
.make_query(name
, 'AXFR', 'IN')
251 finalSoa
= dns
.rrset
.from_text(name
,
255 'ns.' + name
+ ' hostmaster.' + name
+ ' 3 3600 3600 3600 60')
257 # the final SOA starts the IXFR, with first an update from 1 to 2 (one removal, two additions)
258 response
= dns
.message
.make_response(query
)
259 response
.answer
.append(finalSoa
)
261 response
.answer
.append(dns
.rrset
.from_text(name
,
265 'ns.' + name
+ ' hostmaster.' + name
+ ' 1 3600 3600 3600 60'))
267 response
.answer
.append(dns
.rrset
.from_text(name
,
273 response
.answer
.append(dns
.rrset
.from_text(name
,
277 'ns.' + name
+ ' hostmaster.' + name
+ ' 2 3600 3600 3600 60'))
278 # new message in the middle of the additions
279 responses
.append(response
)
280 response
= dns
.message
.make_response(query
)
282 response
.answer
.append(dns
.rrset
.from_text_list(name
,
286 ['192.0.2.2', '192.0.2.3']))
288 response
.answer
.append(dns
.rrset
.from_text(name
,
292 'ns.' + name
+ ' hostmaster.' + name
+ ' 2 3600 3600 3600 60'))
294 responses
.append(response
)
295 response
= dns
.message
.make_response(query
)
299 response
.answer
.append(finalSoa
)
302 response
.answer
.append(dns
.rrset
.from_text(name
,
308 response
.answer
.append(finalSoa
)
309 responses
.append(response
)
311 # and we add a final, dummy TXT message that will
312 # be sent by the backend but that dnsdist should not
313 # pass along to the client
314 response
= dns
.message
.make_response(query
)
315 rrset
= dns
.rrset
.from_text(name
,
320 response
.answer
.append(rrset
)
321 responses
.append(response
)
323 (receivedQuery
, receivedResponses
) = self
.sendTCPQueryWithMultipleResponses(query
, responses
)
324 receivedQuery
.id = query
.id
325 self
.assertEqual(query
, receivedQuery
)
326 self
.assertEqual(len(receivedResponses
), len(responses
) - 1)
328 # def testFourNoFirstSOAAXFR(self):
330 # AXFR: Four messages, no SOA in the first one
332 # name = 'fournosoainfirst.axfr.tests.powerdns.com.'
333 # query = dns.message.make_query(name, 'AXFR', 'IN')
335 # soa = dns.rrset.from_text(name,
339 # 'ns.' + name + ' hostmaster.' + name + ' 1 3600 3600 3600 60')
340 # response = dns.message.make_response(query)
341 # response.answer.append(dns.rrset.from_text(name,
346 # responses.append(response)
348 # response = dns.message.make_response(query)
349 # rrset = dns.rrset.from_text(name,
352 # dns.rdatatype.AAAA,
354 # response.answer.append(soa)
355 # response.answer.append(rrset)
356 # responses.append(response)
358 # response = dns.message.make_response(query)
359 # rrset = dns.rrset.from_text('dummy.' + name,
362 # dns.rdatatype.AAAA,
364 # response.answer.append(rrset)
365 # responses.append(response)
367 # response = dns.message.make_response(query)
368 # rrset = dns.rrset.from_text(name,
373 # response.answer.append(rrset)
374 # response.answer.append(soa)
375 # responses.append(response)
377 # (receivedQuery, receivedResponses) = self.sendTCPQueryWithMultipleResponses(query, responses)
378 # receivedQuery.id = query.id
379 # self.assertEqual(query, receivedQuery)
380 # self.assertEqual(len(receivedResponses), 1)
382 # def testFourLastSOAInSecondAXFR(self):
384 # AXFR: Four messages, SOA in the first one and the second one
386 # name = 'foursecondsoainsecond.axfr.tests.powerdns.com.'
387 # query = dns.message.make_query(name, 'AXFR', 'IN')
389 # soa = dns.rrset.from_text(name,
393 # 'ns.' + name + ' hostmaster.' + name + ' 1 3600 3600 3600 60')
395 # response = dns.message.make_response(query)
396 # response.answer.append(soa)
397 # response.answer.append(dns.rrset.from_text(name,
402 # responses.append(response)
404 # response = dns.message.make_response(query)
405 # response.answer.append(soa)
406 # rrset = dns.rrset.from_text(name,
409 # dns.rdatatype.AAAA,
411 # response.answer.append(rrset)
412 # responses.append(response)
414 # response = dns.message.make_response(query)
415 # rrset = dns.rrset.from_text('dummy.' + name,
418 # dns.rdatatype.AAAA,
420 # response.answer.append(rrset)
421 # responses.append(response)
423 # response = dns.message.make_response(query)
424 # rrset = dns.rrset.from_text(name,
429 # response.answer.append(rrset)
430 # responses.append(response)
432 # (receivedQuery, receivedResponses) = self.sendTCPQueryWithMultipleResponses(query, responses)
433 # receivedQuery.id = query.id
434 # self.assertEqual(query, receivedQuery)
435 # self.assertEqual(len(receivedResponses), 2)