]>
git.ipfire.org Git - thirdparty/pdns.git/blob - regression-tests.dnsdist/test_DOQ.py
3 import clientsubnetoption
5 from dnsdisttests
import DNSDistTest
6 from dnsdisttests
import pickAvailablePort
7 from doqclient
import quic_bogus_query
10 class TestDOQBogus(DNSDistTest
):
11 _serverKey
= 'server.key'
12 _serverCert
= 'server.chain'
13 _serverName
= 'tls.tests.dnsdist.org'
15 _doqServerPort
= pickAvailablePort()
16 _config_template
= """
17 newServer{address="127.0.0.1:%d"}
19 addDOQLocal("127.0.0.1:%d", "%s", "%s")
21 _config_params
= ['_testServerPort', '_doqServerPort','_serverCert', '_serverKey']
24 def testDOQBogus(self
):
26 DOQ: Test a bogus query (wrong packed length)
28 name
= 'bogus.doq.tests.powerdns.com.'
29 query
= dns
.message
.make_query(name
, 'A', 'IN', use_edns
=False)
31 expectedQuery
= dns
.message
.make_query(name
, 'A', 'IN', use_edns
=True, payload
=4096)
35 message
= quic_bogus_query(query
, '127.0.0.1', 2.0, self
._doqServerPort
, verify
=self
._caCert
, server_hostname
=self
._serverName
)
36 self
.assertFalse(True)
37 except doqclient
.StreamResetError
as e
:
38 self
.assertEqual(e
.error
, 2);
40 class TestDOQ(DNSDistTest
):
41 _serverKey
= 'server.key'
42 _serverCert
= 'server.chain'
43 _serverName
= 'tls.tests.dnsdist.org'
45 _doqServerPort
= pickAvailablePort()
46 _config_template
= """
47 newServer{address="127.0.0.1:%d"}
49 addAction("drop.doq.tests.powerdns.com.", DropAction())
50 addAction("refused.doq.tests.powerdns.com.", RCodeAction(DNSRCode.REFUSED))
51 addAction("spoof.doq.tests.powerdns.com.", SpoofAction("1.2.3.4"))
52 addAction("no-backend.doq.tests.powerdns.com.", PoolAction('this-pool-has-no-backend'))
54 addDOQLocal("127.0.0.1:%d", "%s", "%s")
56 _config_params
= ['_testServerPort', '_doqServerPort','_serverCert', '_serverKey']
59 def testDOQSimple(self
):
63 name
= 'simple.doq.tests.powerdns.com.'
64 query
= dns
.message
.make_query(name
, 'A', 'IN', use_edns
=False)
66 expectedQuery
= dns
.message
.make_query(name
, 'A', 'IN', use_edns
=True, payload
=4096)
68 response
= dns
.message
.make_response(query
)
69 rrset
= dns
.rrset
.from_text(name
,
74 response
.answer
.append(rrset
)
75 (receivedQuery
, receivedResponse
) = self
.sendDOQQuery(self
._doqServerPort
, query
, response
=response
, caFile
=self
._caCert
, serverName
=self
._serverName
)
76 self
.assertTrue(receivedQuery
)
77 self
.assertTrue(receivedResponse
)
78 receivedQuery
.id = expectedQuery
.id
79 self
.assertEqual(expectedQuery
, receivedQuery
)
81 def testDOQMultipleStreams(self
):
83 DOQ: Test multiple queries using the same connection
86 name
= 'simple.doq.tests.powerdns.com.'
87 query
= dns
.message
.make_query(name
, 'A', 'IN', use_edns
=False)
89 expectedQuery
= dns
.message
.make_query(name
, 'A', 'IN', use_edns
=True, payload
=4096)
91 response
= dns
.message
.make_response(query
)
92 rrset
= dns
.rrset
.from_text(name
,
97 response
.answer
.append(rrset
)
99 connection
= self
.getDOQConnection(self
._doqServerPort
, self
._caCert
)
101 (receivedQuery
, receivedResponse
) = self
.sendDOQQuery(self
._doqServerPort
, query
, response
=response
, caFile
=self
._caCert
, serverName
=self
._serverName
, connection
=connection
)
102 self
.assertTrue(receivedQuery
)
103 self
.assertTrue(receivedResponse
)
104 receivedQuery
.id = expectedQuery
.id
105 self
.assertEqual(expectedQuery
, receivedQuery
)
107 (receivedQuery
, receivedResponse
) = self
.sendDOQQuery(self
._doqServerPort
, query
, response
=response
, caFile
=self
._caCert
, serverName
=self
._serverName
, connection
=connection
)
108 self
.assertTrue(receivedQuery
)
109 self
.assertTrue(receivedResponse
)
110 receivedQuery
.id = expectedQuery
.id
111 self
.assertEqual(expectedQuery
, receivedQuery
)
113 def testDropped(self
):
117 name
= 'drop.doq.tests.powerdns.com.'
118 query
= dns
.message
.make_query(name
, 'A', 'IN')
121 (_
, receivedResponse
) = self
.sendDOQQuery(self
._doqServerPort
, query
, response
=None, caFile
=self
._caCert
, useQueue
=False, serverName
=self
._serverName
)
122 self
.assertTrue(False)
123 except doqclient
.StreamResetError
as e
:
124 self
.assertEqual(e
.error
, 5);
126 def testRefused(self
):
130 name
= 'refused.doq.tests.powerdns.com.'
131 query
= dns
.message
.make_query(name
, 'A', 'IN')
133 query
.flags
&= ~dns
.flags
.RD
134 expectedResponse
= dns
.message
.make_response(query
)
135 expectedResponse
.set_rcode(dns
.rcode
.REFUSED
)
137 (_
, receivedResponse
) = self
.sendDOQQuery(self
._doqServerPort
, query
, response
=None, caFile
=self
._caCert
, useQueue
=False, serverName
=self
._serverName
)
138 self
.assertEqual(receivedResponse
, expectedResponse
)
144 name
= 'spoof.doq.tests.powerdns.com.'
145 query
= dns
.message
.make_query(name
, 'A', 'IN')
147 query
.flags
&= ~dns
.flags
.RD
148 expectedResponse
= dns
.message
.make_response(query
)
149 rrset
= dns
.rrset
.from_text(name
,
154 expectedResponse
.answer
.append(rrset
)
156 (_
, receivedResponse
) = self
.sendDOQQuery(self
._doqServerPort
, query
, response
=None, caFile
=self
._caCert
, useQueue
=False, serverName
=self
._serverName
)
157 self
.assertEqual(receivedResponse
, expectedResponse
)
159 def testDOQNoBackend(self
):
163 name
= 'no-backend.doq.tests.powerdns.com.'
164 query
= dns
.message
.make_query(name
, 'A', 'IN', use_edns
=False)
167 (_
, receivedResponse
) = self
.sendDOQQuery(self
._doqServerPort
, query
, response
=None, caFile
=self
._caCert
, useQueue
=False, serverName
=self
._serverName
)
168 self
.assertTrue(False)
169 except doqclient
.StreamResetError
as e
:
170 self
.assertEqual(e
.error
, 5);
172 class TestDOQWithCache(DNSDistTest
):
173 _serverKey
= 'server.key'
174 _serverCert
= 'server.chain'
175 _serverName
= 'tls.tests.dnsdist.org'
177 _doqServerPort
= pickAvailablePort()
178 _config_template
= """
179 newServer{address="127.0.0.1:%d"}
181 addDOQLocal("127.0.0.1:%d", "%s", "%s")
183 pc = newPacketCache(100, {maxTTL=86400, minTTL=1})
184 getPool(""):setCache(pc)
186 _config_params
= ['_testServerPort', '_doqServerPort','_serverCert', '_serverKey']
189 def testCached(self
):
191 Cache: Served from cache
193 dnsdist is configured to cache entries, we are sending several
194 identical requests and checking that the backend only receive
198 name
= 'cached.cache.tests.powerdns.com.'
199 query
= dns
.message
.make_query(name
, 'AAAA', 'IN')
201 response
= dns
.message
.make_response(query
)
202 rrset
= dns
.rrset
.from_text(name
,
207 response
.answer
.append(rrset
)
209 # first query to fill the cache
210 (receivedQuery
, receivedResponse
) = self
.sendDOQQuery(self
._doqServerPort
, query
, response
=response
, caFile
=self
._caCert
, serverName
=self
._serverName
)
211 self
.assertTrue(receivedQuery
)
212 self
.assertTrue(receivedResponse
)
213 receivedQuery
.id = query
.id
214 self
.assertEqual(query
, receivedQuery
)
215 self
.assertEqual(receivedResponse
, response
)
217 for _
in range(numberOfQueries
):
218 (_
, receivedResponse
) = self
.sendDOQQuery(self
._doqServerPort
, query
, response
=None, caFile
=self
._caCert
, useQueue
=False, serverName
=self
._serverName
)
219 self
.assertEqual(receivedResponse
, response
)
222 for key
in self
._responsesCounter
:
223 total
+= self
._responsesCounter
[key
]
224 TestDOQWithCache
._responsesCounter
[key
] = 0
226 self
.assertEqual(total
, 1)