]>
Commit | Line | Data |
---|---|---|
5df86a8a RG |
1 | #!/usr/bin/env python |
2 | import base64 | |
5df86a8a RG |
3 | import threading |
4 | import clientsubnetoption | |
5 | import dns | |
b4f23783 | 6 | from dnsdisttests import DNSDistTest, Queue |
5df86a8a RG |
7 | |
8 | class 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"} | |
19 | addAction(QTypeRule(dnsdist.A), TeeAction("127.0.0.1:%d", true)) | |
20 | addAction(QTypeRule(dnsdist.AAAA), TeeAction("127.0.0.1:%d", false)) | |
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 | 76 | nxdomains\t0 |
b8019cf7 CH |
77 | other-rcode\t0 |
78 | queries\t%d | |
5df86a8a | 79 | recv-errors\t0 |
b8019cf7 | 80 | refuseds\t0 |
5df86a8a | 81 | responses\t%d |
5df86a8a | 82 | send-errors\t0 |
b8019cf7 CH |
83 | servfails\t0 |
84 | tcp-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 | 124 | nxdomains\t0 |
b8019cf7 CH |
125 | other-rcode\t0 |
126 | queries\t%d | |
5df86a8a | 127 | recv-errors\t0 |
b8019cf7 | 128 | refuseds\t0 |
5df86a8a | 129 | responses\t%d |
5df86a8a | 130 | send-errors\t0 |
b8019cf7 CH |
131 | servfails\t0 |
132 | tcp-drops\t0 | |
5df86a8a | 133 | """ % (numberOfQueries, numberOfQueries, numberOfQueries)) |