Skip to content

Commit 5680792

Browse files
authored
test: fix getaddrinfo test (#663)
* getaddrinfo() returns non-deterministicly ordered result * fix the AI_CANONNAME patch to only correct the first row
1 parent 7bb12a1 commit 5680792

File tree

1 file changed

+29
-12
lines changed

1 file changed

+29
-12
lines changed

tests/test_dns.py

+29-12
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@ def patched_getaddrinfo(*args, **kwargs):
1010
# flag AI_CANONNAME, even if `host` is an IP
1111
rv = []
1212
result = socket.getaddrinfo(*args, **kwargs)
13+
first = True
1314
for af, sk, proto, canon_name, addr in result:
1415
if kwargs.get('flags', 0) & socket.AI_CANONNAME:
15-
if not canon_name:
16+
if not canon_name and first:
17+
first = False
1618
canon_name = args[0]
1719
if not isinstance(canon_name, str):
1820
canon_name = canon_name.decode('ascii')
@@ -24,7 +26,7 @@ def patched_getaddrinfo(*args, **kwargs):
2426

2527
class BaseTestDNS:
2628

27-
def _test_getaddrinfo(self, *args, _patch=False, **kwargs):
29+
def _test_getaddrinfo(self, *args, _patch=False, _sorted=False, **kwargs):
2830
err = None
2931
try:
3032
if _patch:
@@ -50,7 +52,17 @@ def _test_getaddrinfo(self, *args, _patch=False, **kwargs):
5052
if err is not None:
5153
raise err
5254

53-
self.assertEqual(a1, a2)
55+
if _sorted:
56+
if kwargs.get('flags', 0) & socket.AI_CANONNAME and a1 and a2:
57+
af, sk, proto, canon_name1, addr = a1[0]
58+
a1[0] = (af, sk, proto, '', addr)
59+
af, sk, proto, canon_name2, addr = a2[0]
60+
a2[0] = (af, sk, proto, '', addr)
61+
self.assertEqual(canon_name1, canon_name2)
62+
63+
self.assertEqual(sorted(a1), sorted(a2))
64+
else:
65+
self.assertEqual(a1, a2)
5466

5567
def _test_getnameinfo(self, *args, **kwargs):
5668
err = None
@@ -77,11 +89,13 @@ def _test_getnameinfo(self, *args, **kwargs):
7789
self.assertEqual(a1, a2)
7890

7991
def test_getaddrinfo_1(self):
80-
self._test_getaddrinfo('example.com', 80)
81-
self._test_getaddrinfo('example.com', 80, type=socket.SOCK_STREAM)
92+
self._test_getaddrinfo('example.com', 80, _sorted=True)
93+
self._test_getaddrinfo('example.com', 80, type=socket.SOCK_STREAM,
94+
_sorted=True)
8295

8396
def test_getaddrinfo_2(self):
84-
self._test_getaddrinfo('example.com', 80, flags=socket.AI_CANONNAME)
97+
self._test_getaddrinfo('example.com', 80, flags=socket.AI_CANONNAME,
98+
_sorted=True)
8599

86100
def test_getaddrinfo_3(self):
87101
self._test_getaddrinfo('a' + '1' * 50 + '.wat', 800)
@@ -92,12 +106,14 @@ def test_getaddrinfo_4(self):
92106
family=-1)
93107

94108
def test_getaddrinfo_5(self):
95-
self._test_getaddrinfo('example.com', '80')
96-
self._test_getaddrinfo('example.com', '80', type=socket.SOCK_STREAM)
109+
self._test_getaddrinfo('example.com', '80', _sorted=True)
110+
self._test_getaddrinfo('example.com', '80', type=socket.SOCK_STREAM,
111+
_sorted=True)
97112

98113
def test_getaddrinfo_6(self):
99-
self._test_getaddrinfo(b'example.com', b'80')
100-
self._test_getaddrinfo(b'example.com', b'80', type=socket.SOCK_STREAM)
114+
self._test_getaddrinfo(b'example.com', b'80', _sorted=True)
115+
self._test_getaddrinfo(b'example.com', b'80', type=socket.SOCK_STREAM,
116+
_sorted=True)
101117

102118
def test_getaddrinfo_7(self):
103119
self._test_getaddrinfo(None, 0)
@@ -116,8 +132,9 @@ def test_getaddrinfo_10(self):
116132
self._test_getaddrinfo(None, None, type=socket.SOCK_STREAM)
117133

118134
def test_getaddrinfo_11(self):
119-
self._test_getaddrinfo(b'example.com', '80')
120-
self._test_getaddrinfo(b'example.com', '80', type=socket.SOCK_STREAM)
135+
self._test_getaddrinfo(b'example.com', '80', _sorted=True)
136+
self._test_getaddrinfo(b'example.com', '80', type=socket.SOCK_STREAM,
137+
_sorted=True)
121138

122139
def test_getaddrinfo_12(self):
123140
# musl always returns ai_canonname but we don't

0 commit comments

Comments
 (0)