|
17 | 17 | from weakref import proxy |
18 | 18 | import signal |
19 | 19 |
|
| 20 | +def try_address(host, port=0, family=socket.AF_INET): |
| 21 | + """Try to bind a socket on the given host:port and return True |
| 22 | + if that has been possible.""" |
| 23 | + try: |
| 24 | + sock = socket.socket(family, socket.SOCK_STREAM) |
| 25 | + sock.bind((host, port)) |
| 26 | + except (socket.error, socket.gaierror): |
| 27 | + return False |
| 28 | + else: |
| 29 | + sock.close() |
| 30 | + return True |
| 31 | + |
20 | 32 | HOST = support.HOST |
21 | 33 | MSG = b'Michael Gilfix was here\n' |
| 34 | +SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6) |
22 | 35 |
|
23 | 36 | class SocketTCPTest(unittest.TestCase): |
24 | 37 |
|
@@ -554,6 +567,44 @@ def test_sock_ioctl(self): |
554 | 567 | self.assertTrue(hasattr(socket, 'RCVALL_ON')) |
555 | 568 | self.assertTrue(hasattr(socket, 'RCVALL_OFF')) |
556 | 569 |
|
| 570 | + def testGetaddrinfo(self): |
| 571 | + try: |
| 572 | + socket.getaddrinfo('localhost', 80) |
| 573 | + except socket.gaierror as err: |
| 574 | + if err.errno == socket.EAI_SERVICE: |
| 575 | + # see http://bugs.python.org/issue1282647 |
| 576 | + self.skipTest("buggy libc version") |
| 577 | + raise |
| 578 | + # len of every sequence is supposed to be == 5 |
| 579 | + for info in socket.getaddrinfo(HOST, None): |
| 580 | + self.assertEqual(len(info), 5) |
| 581 | + # host can be a domain name, a string representation of an |
| 582 | + # IPv4/v6 address or None |
| 583 | + socket.getaddrinfo('localhost', 80) |
| 584 | + socket.getaddrinfo('127.0.0.1', 80) |
| 585 | + socket.getaddrinfo(None, 80) |
| 586 | + if SUPPORTS_IPV6: |
| 587 | + socket.getaddrinfo('::1', 80) |
| 588 | + # port can be a string service name such as "http", a numeric |
| 589 | + # port number or None |
| 590 | + socket.getaddrinfo(HOST, "http") |
| 591 | + socket.getaddrinfo(HOST, 80) |
| 592 | + socket.getaddrinfo(HOST, None) |
| 593 | + # test family and socktype filters |
| 594 | + infos = socket.getaddrinfo(HOST, None, socket.AF_INET) |
| 595 | + for family, _, _, _, _ in infos: |
| 596 | + self.assertEqual(family, socket.AF_INET) |
| 597 | + infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM) |
| 598 | + for _, socktype, _, _, _ in infos: |
| 599 | + self.assertEqual(socktype, socket.SOCK_STREAM) |
| 600 | + # test proto and flags arguments |
| 601 | + socket.getaddrinfo(HOST, None, 0, 0, socket.AI_CANONNAME) |
| 602 | + socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE) |
| 603 | + # a server willing to support both IPv4 and IPv6 will |
| 604 | + # usually do this |
| 605 | + socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0, |
| 606 | + socket.AI_PASSIVE) |
| 607 | + |
557 | 608 |
|
558 | 609 | class BasicTCPTest(SocketConnectedTest): |
559 | 610 |
|
|
0 commit comments