From 1b22985f2d67b6dd43259e3c6b853498f1cff712 Mon Sep 17 00:00:00 2001 From: Bob Halley Date: Sat, 27 Jan 2024 12:38:03 -0800 Subject: [PATCH] In tests, work around musl libc and docker issues. Specifically: musl libc's getaddrinfo behavior always returns a canonical name. Docker's resolver proxy doesn't do dangling CNAMEs correctly and also answers NXDOMAIN in some cases where it should say no error, no data. --- tests/test_async.py | 14 +++++++++++--- tests/test_resolver.py | 21 +++++++++++++++------ tests/test_resolver_override.py | 19 ++++++++++++------- tests/util.py | 10 +++++++++- 4 files changed, 47 insertions(+), 17 deletions(-) diff --git a/tests/test_resolver_override.py b/tests/test_resolver_override.py index aed7a53d..be9e53f2 100644 --- a/tests/test_resolver_override.py +++ b/tests/test_resolver_override.py @@ -69,7 +69,7 @@ def test_override(self): dns.resolver.restore_system_resolver() self.assertTrue(socket.getaddrinfo is dns.resolver._original_getaddrinfo) - def equivalent_info(self, a, b): + def equivalent_info(self, a, b, q): if len(a) != len(b): return False for x in a: @@ -78,16 +78,21 @@ def equivalent_info(self, a, b): # looking for a zero protocol. y = (x[0], x[1], 0, x[3], x[4]) if y not in b: - print("NOT EQUIVALENT") - print(a) - print(b) - return False + # musl libc insists on always providing a canonical name, so + # accept that too. + y = (x[0], x[1], x[2], q, x[4]) + if y not in b: + print("NOT EQUIVALENT") + print(a) + print(b) + return False return True def equivalent(self, *args, **kwargs): + q = args[0] a = socket.getaddrinfo(*args, **kwargs) b = dns.resolver._original_getaddrinfo(*args, **kwargs) - return self.equivalent_info(a, b) + return self.equivalent_info(a, b, q) @unittest.skipIf( sys.platform == "win32", "avoid windows original getaddrinfo issues" @@ -139,7 +144,7 @@ def test_getaddrinfo_nxdomain(self): def test_getaddrinfo_service(self): a = socket.getaddrinfo("dns.google", "domain") b = socket.getaddrinfo("dns.google", 53) - self.assertTrue(self.equivalent_info(a, b)) + self.assertTrue(self.equivalent_info(a, b, "dns.google")) try: socket.getaddrinfo("dns.google", "domain", flags=socket.AI_NUMERICSERV) self.assertTrue(False) # should not happen!