From c59b7182703b059ff82d1a758c724086a38310f8 Mon Sep 17 00:00:00 2001 From: Fantix King Date: Wed, 16 Apr 2025 17:18:52 -0400 Subject: [PATCH] test: fix getaddrinfo test * getaddrinfo() returns non-deterministicly ordered result * fix the AI_CANONNAME patch to only correct the first row --- tests/test_dns.py | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/tests/test_dns.py b/tests/test_dns.py index 66da026b..2647cc0c 100644 --- a/tests/test_dns.py +++ b/tests/test_dns.py @@ -10,9 +10,11 @@ def patched_getaddrinfo(*args, **kwargs): # flag AI_CANONNAME, even if `host` is an IP rv = [] result = socket.getaddrinfo(*args, **kwargs) + first = True for af, sk, proto, canon_name, addr in result: if kwargs.get('flags', 0) & socket.AI_CANONNAME: - if not canon_name: + if not canon_name and first: + first = False canon_name = args[0] if not isinstance(canon_name, str): canon_name = canon_name.decode('ascii') @@ -24,7 +26,7 @@ def patched_getaddrinfo(*args, **kwargs): class BaseTestDNS: - def _test_getaddrinfo(self, *args, _patch=False, **kwargs): + def _test_getaddrinfo(self, *args, _patch=False, _sorted=False, **kwargs): err = None try: if _patch: @@ -50,7 +52,17 @@ def _test_getaddrinfo(self, *args, _patch=False, **kwargs): if err is not None: raise err - self.assertEqual(a1, a2) + if _sorted: + if kwargs.get('flags', 0) & socket.AI_CANONNAME and a1 and a2: + af, sk, proto, canon_name1, addr = a1[0] + a1[0] = (af, sk, proto, '', addr) + af, sk, proto, canon_name2, addr = a2[0] + a2[0] = (af, sk, proto, '', addr) + self.assertEqual(canon_name1, canon_name2) + + self.assertEqual(sorted(a1), sorted(a2)) + else: + self.assertEqual(a1, a2) def _test_getnameinfo(self, *args, **kwargs): err = None @@ -77,11 +89,13 @@ def _test_getnameinfo(self, *args, **kwargs): self.assertEqual(a1, a2) def test_getaddrinfo_1(self): - self._test_getaddrinfo('example.com', 80) - self._test_getaddrinfo('example.com', 80, type=socket.SOCK_STREAM) + self._test_getaddrinfo('example.com', 80, _sorted=True) + self._test_getaddrinfo('example.com', 80, type=socket.SOCK_STREAM, + _sorted=True) def test_getaddrinfo_2(self): - self._test_getaddrinfo('example.com', 80, flags=socket.AI_CANONNAME) + self._test_getaddrinfo('example.com', 80, flags=socket.AI_CANONNAME, + _sorted=True) def test_getaddrinfo_3(self): self._test_getaddrinfo('a' + '1' * 50 + '.wat', 800) @@ -92,12 +106,14 @@ def test_getaddrinfo_4(self): family=-1) def test_getaddrinfo_5(self): - self._test_getaddrinfo('example.com', '80') - self._test_getaddrinfo('example.com', '80', type=socket.SOCK_STREAM) + self._test_getaddrinfo('example.com', '80', _sorted=True) + self._test_getaddrinfo('example.com', '80', type=socket.SOCK_STREAM, + _sorted=True) def test_getaddrinfo_6(self): - self._test_getaddrinfo(b'example.com', b'80') - self._test_getaddrinfo(b'example.com', b'80', type=socket.SOCK_STREAM) + self._test_getaddrinfo(b'example.com', b'80', _sorted=True) + self._test_getaddrinfo(b'example.com', b'80', type=socket.SOCK_STREAM, + _sorted=True) def test_getaddrinfo_7(self): self._test_getaddrinfo(None, 0) @@ -116,8 +132,9 @@ def test_getaddrinfo_10(self): self._test_getaddrinfo(None, None, type=socket.SOCK_STREAM) def test_getaddrinfo_11(self): - self._test_getaddrinfo(b'example.com', '80') - self._test_getaddrinfo(b'example.com', '80', type=socket.SOCK_STREAM) + self._test_getaddrinfo(b'example.com', '80', _sorted=True) + self._test_getaddrinfo(b'example.com', '80', type=socket.SOCK_STREAM, + _sorted=True) def test_getaddrinfo_12(self): # musl always returns ai_canonname but we don't