]> git.ipfire.org Git - thirdparty/pdns.git/blame - regression-tests.dnsdist/test_TeeAction.py
Merge pull request #8795 from omoerbeek/rec-lua-docs-policytag
[thirdparty/pdns.git] / regression-tests.dnsdist / test_TeeAction.py
CommitLineData
5df86a8a
RG
1#!/usr/bin/env python
2import base64
5df86a8a
RG
3import threading
4import clientsubnetoption
5import dns
b4f23783 6from dnsdisttests import DNSDistTest, Queue
5df86a8a
RG
7
8class TestTeeAction(DNSDistTest):
9
10 _consoleKey = DNSDistTest.generateConsoleKey()
b4f23783 11 _consoleKeyB64 = base64.b64encode(_consoleKey).decode('ascii')
5df86a8a 12 _teeServerPort = 5390
b4f23783
CH
13 _toTeeQueue = Queue()
14 _fromTeeQueue = Queue()
5df86a8a
RG
15 _config_template = """
16 setKey("%s")
17 controlSocket("127.0.0.1:%s")
18 newServer{address="127.0.0.1:%d"}
d3ec24f9
PD
19 addAction(QTypeRule(DNSQType.A), TeeAction("127.0.0.1:%d", true))
20 addAction(QTypeRule(DNSQType.AAAA), TeeAction("127.0.0.1:%d", false))
5df86a8a
RG
21 """
22 _config_params = ['_consoleKeyB64', '_consolePort', '_testServerPort', '_teeServerPort', '_teeServerPort']
23 @classmethod
24 def startResponders(cls):
25 print("Launching responders..")
26
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()
30
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()
34
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()
38
39 def testTeeWithECS(self):
40 """
41 TeeAction: ECS
42 """
43 name = 'ecs.tee.tests.powerdns.com.'
44 query = dns.message.make_query(name, 'A', 'IN')
45 response = dns.message.make_response(query)
46
47 rrset = dns.rrset.from_text(name,
48 3600,
49 dns.rdataclass.IN,
50 dns.rdatatype.A,
51 '192.0.2.1')
52 response.answer.append(rrset)
53
54 numberOfQueries = 10
55 for _ in range(numberOfQueries):
56 # push the response to the Tee server
57 self._toTeeQueue.put(response, True, 2.0)
58
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)
65
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)
72
73 # check the TeeAction stats
74 stats = self.sendConsoleCommand("getAction(0):printStats()")
b8019cf7 75 self.assertEquals(stats, """noerrors\t%d
5df86a8a 76nxdomains\t0
b8019cf7
CH
77other-rcode\t0
78queries\t%d
5df86a8a 79recv-errors\t0
b8019cf7 80refuseds\t0
5df86a8a 81responses\t%d
5df86a8a 82send-errors\t0
b8019cf7
CH
83servfails\t0
84tcp-drops\t0
5df86a8a
RG
85""" % (numberOfQueries, numberOfQueries, numberOfQueries))
86
87 def testTeeWithoutECS(self):
88 """
89 TeeAction: No ECS
90 """
91 name = 'noecs.tee.tests.powerdns.com.'
92 query = dns.message.make_query(name, 'AAAA', 'IN')
93 response = dns.message.make_response(query)
94
95 rrset = dns.rrset.from_text(name,
96 3600,
97 dns.rdataclass.IN,
98 dns.rdatatype.AAAA,
99 '2001:DB8::1')
100 response.answer.append(rrset)
101
102 numberOfQueries = 10
103 for _ in range(numberOfQueries):
104 # push the response to the Tee server
105 self._toTeeQueue.put(response, True, 2.0)
106
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)
113
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)
120
121 # check the TeeAction stats
122 stats = self.sendConsoleCommand("getAction(0):printStats()")
b8019cf7 123 self.assertEquals(stats, """noerrors\t%d
5df86a8a 124nxdomains\t0
b8019cf7
CH
125other-rcode\t0
126queries\t%d
5df86a8a 127recv-errors\t0
b8019cf7 128refuseds\t0
5df86a8a 129responses\t%d
5df86a8a 130send-errors\t0
b8019cf7
CH
131servfails\t0
132tcp-drops\t0
5df86a8a 133""" % (numberOfQueries, numberOfQueries, numberOfQueries))