[3.6] bpo-33540, socketserver: Add _block_on_close for tests by vstinner · Pull Request #7317 · python/cpython
class ForkingUnixDatagramServer(socketserver.ForkingMixIn, socketserver.UnixDatagramServer): pass _block_on_close = True
@contextlib.contextmanager
def close_server(server): server.server_close()
if hasattr(server, 'active_children'): # ForkingMixIn: Manually reap all child processes, since server_close() # calls waitpid() in non-blocking mode using the WNOHANG flag. for pid in server.active_children.copy(): try: os.waitpid(pid, 0) except ChildProcessError: pass server.active_children.clear() try: yield None except: raise finally: pid2, status = os.waitpid(pid, 0) testcase.assertEqual(pid2, pid) testcase.assertEqual(72 << 8, status)
@unittest.skipUnless(threading, 'Threading required for this test.')
def make_server(self, addr, svrcls, hdlrbase): class MyServer(svrcls): _block_on_close = True
def handle_error(self, request, client_address): self.close_request(request) raise
def stream_examine(self, proto, addr):
def test_tcpserver_bind_leak(self): # Issue #22435: the server socket wouldn't be closed if bind()/listen()
class BaseErrorTestServer(socketserver.TCPServer): _block_on_close = True
def __init__(self, exception): self.exception = exception super().__init__((HOST, 0), BadHandler)
def handle_error(self, request, client_address):
if HAVE_FORKING: class ForkingErrorTestServer(socketserver.ForkingMixIn, BaseErrorTestServer): pass _block_on_close = True
class SocketWriterTest(unittest.TestCase):
server = socketserver.TCPServer((HOST, 0), Handler) self.addCleanup(close_server, server) self.addCleanup(server.server_close) s = socket.socket( server.address_family, socket.SOCK_STREAM, socket.IPPROTO_TCP) with s:
server = socketserver.TCPServer((HOST, 0), Handler) self.addCleanup(close_server, server) self.addCleanup(server.server_close) interrupted = threading.Event()
def signal_handler(signum, frame):
if __name__ == "__main__":