]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
more resolver override testing
authorBob Halley <halley@dnspython.org>
Sun, 26 Jul 2020 20:22:33 +0000 (13:22 -0700)
committerBob Halley <halley@dnspython.org>
Sun, 26 Jul 2020 20:22:33 +0000 (13:22 -0700)
dns/resolver.py
tests/test_resolver.py
tests/test_resolver_override.py

index ec068fa50a02ba825cf337f636c0914b0362d54a..46ca30ac9ba620e1ac9ab5aa9a2faa40a031667f 100644 (file)
@@ -1416,8 +1416,7 @@ def _getaddrinfo(host=None, service=None, family=socket.AF_UNSPEC, socktype=0,
                     v4addrs.append(rdata.address)
     except dns.resolver.NXDOMAIN:
         raise socket.gaierror(socket.EAI_NONAME, 'Name or service not known')
-    except Exception as e:
-        print(e)
+    except Exception:
         # We raise EAI_AGAIN here as the failure may be temporary
         # (e.g. a timeout) and EAI_SYSTEM isn't defined on Windows.
         # [Issue #416]
index 6270fd3f85cc17db330b1c3a8c848f5d87378821..d61e8c92eecfe2bca373dbcec825727c2148f951 100644 (file)
@@ -633,7 +633,12 @@ class LiveResolverTests(unittest.TestCase):
         qtype = dns.rdatatype.from_text('A')
         def bad():
             answer = dns.resolver.resolve(qname, qtype)
-        self.assertRaises(dns.resolver.NXDOMAIN, bad)
+        try:
+            dns.resolver.resolve(qname, qtype)
+            self.assertTrue(False)  # should not happen!
+        except dns.resolver.NXDOMAIN as nx:
+            self.assertIn(qname, nx.qnames())
+            self.assertGreaterEqual(len(nx.responses()), 1)
 
     def testResolveCacheHit(self):
         res = dns.resolver.Resolver(configure=False)
index acb8f871db695b448704951b23293a8ad74cd5c6..c7d5a016665012a68c1ea02b5040ffcbc47723d5 100644 (file)
@@ -17,6 +17,7 @@ try:
 except socket.gaierror:
     _network_available = False
 
+
 @unittest.skipIf(not _network_available, "Internet not reachable")
 class OverrideSystemResolverTestCase(unittest.TestCase):
 
@@ -118,6 +119,30 @@ class OverrideSystemResolverTestCase(unittest.TestCase):
         except socket.gaierror as e:
             self.assertEqual(e.errno, socket.EAI_NONAME)
 
+    def test_getaddrinfo_only_service(self):
+        infos = socket.getaddrinfo(service=53, family=socket.AF_INET,
+                                   socktype=socket.SOCK_DGRAM,
+                                   proto=socket.IPPROTO_UDP)
+        self.assertEqual(len(infos), 1)
+        info = infos[0]
+        self.assertEqual(info[0], socket.AF_INET)
+        self.assertEqual(info[1], socket.SOCK_DGRAM)
+        self.assertEqual(info[2], socket.IPPROTO_UDP)
+        self.assertEqual(info[4], ('127.0.0.1', 53))
+
+    def test_unknown_service_fails(self):
+        with self.assertRaises(socket.gaierror):
+            socket.getaddrinfo('dns.google.', 'bogus-service')
+
+    def test_getnameinfo_tcp(self):
+        info = socket.getnameinfo(('8.8.8.8', 53))
+        self.assertEqual(info, ('dns.google', 'domain'))
+
+    def test_getnameinfo_udp(self):
+        info = socket.getnameinfo(('8.8.8.8', 53), socket.NI_DGRAM)
+        self.assertEqual(info, ('dns.google', 'domain'))
+
+
 # Give up on testing this for now as all of the names I've considered
 # using for testing are part of CDNs and there is deep magic in
 # gethostbyaddr() that python's getfqdn() is using.  At any rate,
@@ -145,3 +170,52 @@ class OverrideSystemResolverTestCase(unittest.TestCase):
         b = socket.gethostbyaddr('2001:4860:4860::8888')
         self.assertEqual(a[0], b[0])
         self.assertEqual(a[2], b[2])
+
+
+class FakeResolver:
+    def resolve(self, *args, **kwargs):
+        raise dns.exception.Timeout
+
+
+class OverrideSystemResolverUsingFakeResolverTestCase(unittest.TestCase):
+
+    def setUp(self):
+        self.res = FakeResolver()
+        dns.resolver.override_system_resolver(self.res)
+
+    def tearDown(self):
+        dns.resolver.restore_system_resolver()
+        self.res = None
+
+    def test_temporary_failure(self):
+        with self.assertRaises(socket.gaierror):
+            socket.getaddrinfo('dns.google')
+
+    # We don't need the fake resolver for the following tests, but we
+    # don't need the live network either, so we're testing here.
+
+    def test_no_host_or_service_fails(self):
+        with self.assertRaises(socket.gaierror):
+            socket.getaddrinfo()
+
+    def test_AI_ADDRCONFIG_fails(self):
+        with self.assertRaises(socket.gaierror):
+            socket.getaddrinfo('dns.google', flags=socket.AI_ADDRCONFIG)
+
+    def test_gethostbyaddr_of_name_fails(self):
+        with self.assertRaises(socket.gaierror):
+            socket.gethostbyaddr('bogus')
+
+
+class OverrideSystemResolverUsingDefaultResolverTestCase(unittest.TestCase):
+
+    def setUp(self):
+        self.res = FakeResolver()
+        dns.resolver.override_system_resolver()
+
+    def tearDown(self):
+        dns.resolver.restore_system_resolver()
+        self.res = None
+
+    def test_override(self):
+        self.assertEqual(dns.resolver._resolver, dns.resolver.default_resolver)