|
1 | | -# Test recv on socket that just accepted a connection |
| 1 | +# Test recv on listening socket after accept(), with various listen() arguments |
2 | 2 |
|
3 | 3 | import socket |
4 | 4 |
|
5 | 5 | PORT = 8000 |
6 | 6 |
|
| 7 | +# Test cases for listen() function |
| 8 | +LISTEN_ARGS = [None, 0, 1, 2] # None means no argument |
| 9 | + |
7 | 10 |
|
8 | 11 | # Server |
9 | 12 | def instance0(): |
10 | 13 | multitest.globals(IP=multitest.get_network_ip()) |
11 | | - s = socket.socket() |
12 | | - s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
13 | | - s.bind(socket.getaddrinfo("0.0.0.0", PORT)[0][-1]) |
14 | | - s.listen(1) |
15 | 14 | multitest.next() |
16 | | - s.accept() |
17 | | - try: |
18 | | - print("recv", s.recv(10)) # should raise Errno 107 ENOTCONN |
19 | | - except OSError as er: |
20 | | - print(er.errno in (107, 128)) |
21 | | - s.close() |
| 15 | + |
| 16 | + for i, listen_arg in enumerate(LISTEN_ARGS): |
| 17 | + s = socket.socket() |
| 18 | + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
| 19 | + s.bind(socket.getaddrinfo("0.0.0.0", PORT)[0][-1]) |
| 20 | + |
| 21 | + # Call listen with or without argument based on test case |
| 22 | + if listen_arg is None: |
| 23 | + print(f"Test case {i + 1}/{len(LISTEN_ARGS)}: listen()") |
| 24 | + s.listen() |
| 25 | + else: |
| 26 | + print(f"Test case {i + 1}/{len(LISTEN_ARGS)}: listen({listen_arg})") |
| 27 | + s.listen(listen_arg) |
| 28 | + |
| 29 | + # Signal client that server is ready |
| 30 | + multitest.broadcast(f"server_ready_{i}") |
| 31 | + |
| 32 | + # Wait for client connection |
| 33 | + c, _ = s.accept() |
| 34 | + |
| 35 | + try: |
| 36 | + print("recv", s.recv(10)) # should raise Errno 107 ENOTCONN |
| 37 | + except OSError as er: |
| 38 | + # Verify the error code is either 107 (ENOTCONN) or 128 (ENOTCONN on Windows) |
| 39 | + print(er.errno in (107, 128)) |
| 40 | + |
| 41 | + # Cleanup |
| 42 | + c.close() |
| 43 | + s.close() |
| 44 | + |
| 45 | + # Signal client we're done with this test case |
| 46 | + multitest.broadcast(f"server_done_{i}") |
22 | 47 |
|
23 | 48 |
|
24 | 49 | # Client |
25 | 50 | def instance1(): |
26 | 51 | multitest.next() |
27 | | - s = socket.socket() |
28 | | - s.connect(socket.getaddrinfo(IP, PORT)[0][-1]) |
29 | | - s.send(b"GET / HTTP/1.0\r\n\r\n") |
30 | | - s.close() |
| 52 | + |
| 53 | + for i, _ in enumerate(LISTEN_ARGS): |
| 54 | + # Wait for server to be ready |
| 55 | + multitest.wait(f"server_ready_{i}") |
| 56 | + |
| 57 | + # Connect to server |
| 58 | + s = socket.socket() |
| 59 | + s.connect(socket.getaddrinfo(IP, PORT)[0][-1]) |
| 60 | + s.send(b"GET / HTTP/1.0\r\n\r\n") |
| 61 | + s.close() |
| 62 | + |
| 63 | + # Wait for server to finish this test case |
| 64 | + multitest.wait(f"server_done_{i}") |
0 commit comments