]>
git.ipfire.org Git - thirdparty/pdns.git/blob - regression-tests.dnsdist/test_TeeAction.py
4 import clientsubnetoption
6 from dnsdisttests
import DNSDistTest
, Queue
8 class TestTeeAction(DNSDistTest
):
10 _consoleKey
= DNSDistTest
.generateConsoleKey()
11 _consoleKeyB64
= base64
.b64encode(_consoleKey
).decode('ascii')
14 _fromTeeQueue
= Queue()
15 _config_template
= """
17 controlSocket("127.0.0.1:%s")
18 newServer{address="127.0.0.1:%d"}
19 addAction(QTypeRule(dnsdist.A), TeeAction("127.0.0.1:%d", true))
20 addAction(QTypeRule(dnsdist.AAAA), TeeAction("127.0.0.1:%d", false))
22 _config_params
= ['_consoleKeyB64', '_consolePort', '_testServerPort', '_teeServerPort', '_teeServerPort']
24 def startResponders(cls
):
25 print("Launching responders..")
27 cls
._UDPResponder
= threading
.Thread(name
='UDP Responder', target
=cls
.UDPResponder
, args
=[cls
._testServerPort
, cls
._toResponderQueue
, cls
._fromResponderQueue
])
28 cls
._UDPResponder
.setDaemon(True)
29 cls
._UDPResponder
.start()
31 cls
._TCPResponder
= threading
.Thread(name
='TCP Responder', target
=cls
.TCPResponder
, args
=[cls
._testServerPort
, cls
._toResponderQueue
, cls
._fromResponderQueue
, False, True])
32 cls
._TCPResponder
.setDaemon(True)
33 cls
._TCPResponder
.start()
35 cls
._TeeResponder
= threading
.Thread(name
='Tee Responder', target
=cls
.UDPResponder
, args
=[cls
._teeServerPort
, cls
._toTeeQueue
, cls
._fromTeeQueue
])
36 cls
._TeeResponder
.setDaemon(True)
37 cls
._TeeResponder
.start()
39 def testTeeWithECS(self
):
43 name
= 'ecs.tee.tests.powerdns.com.'
44 query
= dns
.message
.make_query(name
, 'A', 'IN')
45 response
= dns
.message
.make_response(query
)
47 rrset
= dns
.rrset
.from_text(name
,
52 response
.answer
.append(rrset
)
55 for _
in range(numberOfQueries
):
56 # push the response to the Tee server
57 self
._toTeeQueue
.put(response
, True, 2.0)
59 (receivedQuery
, receivedResponse
) = self
.sendUDPQuery(query
, response
)
60 self
.assertTrue(receivedQuery
)
61 self
.assertTrue(receivedResponse
)
62 receivedQuery
.id = query
.id
63 self
.assertEquals(query
, receivedQuery
)
64 self
.assertEquals(response
, receivedResponse
)
66 # retrieve the query from the Tee server
67 teedQuery
= self
._fromTeeQueue
.get(True, 2.0)
68 ecso
= clientsubnetoption
.ClientSubnetOption('127.0.0.1', 24)
69 expectedQuery
= dns
.message
.make_query(name
, 'A', 'IN', use_edns
=True, options
=[ecso
], payload
=512)
70 expectedQuery
.id = query
.id
71 self
.checkQueryEDNSWithECS(expectedQuery
, teedQuery
)
73 # check the TeeAction stats
74 stats
= self
.sendConsoleCommand("getAction(0):printStats()")
75 self
.assertEquals(stats
, """noerrors\t%d
85 """ % (numberOfQueries
, numberOfQueries
, numberOfQueries
))
87 def testTeeWithoutECS(self
):
91 name
= 'noecs.tee.tests.powerdns.com.'
92 query
= dns
.message
.make_query(name
, 'AAAA', 'IN')
93 response
= dns
.message
.make_response(query
)
95 rrset
= dns
.rrset
.from_text(name
,
100 response
.answer
.append(rrset
)
103 for _
in range(numberOfQueries
):
104 # push the response to the Tee server
105 self
._toTeeQueue
.put(response
, True, 2.0)
107 (receivedQuery
, receivedResponse
) = self
.sendUDPQuery(query
, response
)
108 self
.assertTrue(receivedQuery
)
109 self
.assertTrue(receivedResponse
)
110 receivedQuery
.id = query
.id
111 self
.assertEquals(query
, receivedQuery
)
112 self
.assertEquals(response
, receivedResponse
)
114 # retrieve the query from the Tee server
115 teedQuery
= self
._fromTeeQueue
.get(True, 2.0)
116 ecso
= clientsubnetoption
.ClientSubnetOption('127.0.0.1', 24)
117 expectedQuery
= dns
.message
.make_query(name
, 'AAAA', 'IN', use_edns
=True, options
=[ecso
], payload
=512)
118 expectedQuery
.id = query
.id
119 self
.checkMessageNoEDNS(expectedQuery
, teedQuery
)
121 # check the TeeAction stats
122 stats
= self
.sendConsoleCommand("getAction(0):printStats()")
123 self
.assertEquals(stats
, """noerrors\t%d
133 """ % (numberOfQueries
, numberOfQueries
, numberOfQueries
))