]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
basic testing for async DoH
authorBob Halley <halley@dnspython.org>
Sat, 27 Nov 2021 21:26:41 +0000 (13:26 -0800)
committerBob Halley <halley@dnspython.org>
Sat, 27 Nov 2021 21:26:41 +0000 (13:26 -0800)
tests/test_async.py

index 0782c7a097b7a51f703a1a92fa80412397e79213..c7425e61b457c21a5766642838ce25dec7e50456 100644 (file)
@@ -16,6 +16,7 @@
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 import asyncio
+import random
 import socket
 import sys
 import time
@@ -26,13 +27,14 @@ import dns.asyncquery
 import dns.asyncresolver
 import dns.message
 import dns.name
+import dns.query
 import dns.rdataclass
 import dns.rdatatype
 import dns.resolver
 
 
 # Some tests require TLS so skip those if it's not there.
-from dns.query import ssl
+ssl = dns.query.ssl
 try:
     ssl.create_default_context()
     _ssl_available = True
@@ -73,6 +75,11 @@ for (af, address) in ((socket.AF_INET, '8.8.8.8'),
     except Exception:
         pass
 
+KNOWN_ANYCAST_DOH_RESOLVER_URLS = ['https://cloudflare-dns.com/dns-query',
+                                   'https://dns.google/dns-query',
+                                   # 'https://dns11.quad9.net/dns-query',
+                                   ]
+
 
 class AsyncDetectionTests(unittest.TestCase):
     sniff_result = 'asyncio'
@@ -421,6 +428,56 @@ class AsyncTests(unittest.TestCase):
             self.async_run(arun)
         self.assertRaises(dns.exception.Timeout, run)
 
+    def testDOHGetRequest(self):
+        if self.backend.name() == 'curio':
+            self.skipTest('anyio dropped curio support')
+        async def run():
+            nameserver_url = random.choice(KNOWN_ANYCAST_DOH_RESOLVER_URLS)
+            q = dns.message.make_query('example.com.', dns.rdatatype.A)
+            r = await dns.asyncquery.https(q, nameserver_url, post=False,
+                                           timeout=4)
+            self.assertTrue(q.is_response(r))
+        self.async_run(run)
+
+    def testDOHGetRequestHttp1(self):
+        if self.backend.name() == 'curio':
+            self.skipTest('anyio dropped curio support')
+        async def run():
+            saved_have_http2 = dns.query._have_http2
+            try:
+                dns.query._have_http2 = False
+                nameserver_url = random.choice(KNOWN_ANYCAST_DOH_RESOLVER_URLS)
+                q = dns.message.make_query('example.com.', dns.rdatatype.A)
+                r = await dns.asyncquery.https(q, nameserver_url, post=False,
+                                               timeout=4)
+                self.assertTrue(q.is_response(r))
+            finally:
+                dns.query._have_http2 = saved_have_http2
+        self.async_run(run)
+
+    def testDOHPostRequest(self):
+        if self.backend.name() == 'curio':
+            self.skipTest('anyio dropped curio support')
+        async def run():
+            nameserver_url = random.choice(KNOWN_ANYCAST_DOH_RESOLVER_URLS)
+            q = dns.message.make_query('example.com.', dns.rdatatype.A)
+            r = await dns.asyncquery.https(q, nameserver_url, post=True,
+                                           timeout=4)
+            self.assertTrue(q.is_response(r))
+        self.async_run(run)
+
+    def test_resolver_doh(self):
+        if self.backend.name() == 'curio':
+            self.skipTest('anyio dropped curio support')
+        async def run():
+            res = dns.asyncresolver.Resolver(configure=False)
+            res.nameservers = ['https://dns.google/dns-query']
+            answer = await res.resolve('dns.google', 'A', backend=self.backend)
+            seen = set([rdata.address for rdata in answer])
+            self.assertTrue('8.8.8.8' in seen)
+            self.assertTrue('8.8.4.4' in seen)
+        self.async_run(run)
+
     def testSleep(self):
         async def run():
             before = time.time()