diff options
author | Bob Halley <halley@dnspython.org> | 2020-07-26 13:22:33 -0700 |
---|---|---|
committer | Bob Halley <halley@dnspython.org> | 2020-07-26 13:22:33 -0700 |
commit | 12ef3c47fa39e3bb0b5a8a2dbcd6c657d0afb16b (patch) | |
tree | 887acaeac47aefc6005b9cf8c9dddf6a7625e12d | |
parent | e73550dc1cbc3e01f09a87b013c9f3c0518f3ba3 (diff) | |
download | dnspython-12ef3c47fa39e3bb0b5a8a2dbcd6c657d0afb16b.tar.gz |
more resolver override testing
-rw-r--r-- | dns/resolver.py | 3 | ||||
-rw-r--r-- | tests/test_resolver.py | 7 | ||||
-rw-r--r-- | tests/test_resolver_override.py | 74 |
3 files changed, 81 insertions, 3 deletions
diff --git a/dns/resolver.py b/dns/resolver.py index ec068fa..46ca30a 100644 --- a/dns/resolver.py +++ b/dns/resolver.py @@ -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] diff --git a/tests/test_resolver.py b/tests/test_resolver.py index 6270fd3..d61e8c9 100644 --- a/tests/test_resolver.py +++ b/tests/test_resolver.py @@ -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) diff --git a/tests/test_resolver_override.py b/tests/test_resolver_override.py index acb8f87..c7d5a01 100644 --- a/tests/test_resolver_override.py +++ b/tests/test_resolver_override.py @@ -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) |