mirror of
https://github.com/python/cpython.git
synced 2025-09-29 19:56:59 +00:00
bpo-31593: test_socketserver waits child processes (#3766)
This commit is contained in:
parent
02c3cdcef8
commit
fdcf3e9629
1 changed files with 22 additions and 10 deletions
|
@ -68,6 +68,20 @@ def simple_subprocess(testcase):
|
||||||
testcase.assertEqual(72 << 8, status)
|
testcase.assertEqual(72 << 8, status)
|
||||||
|
|
||||||
|
|
||||||
|
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()
|
||||||
|
|
||||||
|
|
||||||
@unittest.skipUnless(threading, 'Threading required for this test.')
|
@unittest.skipUnless(threading, 'Threading required for this test.')
|
||||||
class SocketServerTest(unittest.TestCase):
|
class SocketServerTest(unittest.TestCase):
|
||||||
"""Test all socket servers."""
|
"""Test all socket servers."""
|
||||||
|
@ -142,7 +156,7 @@ class SocketServerTest(unittest.TestCase):
|
||||||
if verbose: print("waiting for server")
|
if verbose: print("waiting for server")
|
||||||
server.shutdown()
|
server.shutdown()
|
||||||
t.join()
|
t.join()
|
||||||
server.server_close()
|
close_server(server)
|
||||||
self.assertEqual(-1, server.socket.fileno())
|
self.assertEqual(-1, server.socket.fileno())
|
||||||
if verbose: print("done")
|
if verbose: print("done")
|
||||||
|
|
||||||
|
@ -266,7 +280,7 @@ class SocketServerTest(unittest.TestCase):
|
||||||
s.shutdown()
|
s.shutdown()
|
||||||
for t, s in threads:
|
for t, s in threads:
|
||||||
t.join()
|
t.join()
|
||||||
s.server_close()
|
close_server(s)
|
||||||
|
|
||||||
def test_tcpserver_bind_leak(self):
|
def test_tcpserver_bind_leak(self):
|
||||||
# Issue #22435: the server socket wouldn't be closed if bind()/listen()
|
# Issue #22435: the server socket wouldn't be closed if bind()/listen()
|
||||||
|
@ -292,6 +306,7 @@ class ErrorHandlerTest(unittest.TestCase):
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
test.support.unlink(test.support.TESTFN)
|
test.support.unlink(test.support.TESTFN)
|
||||||
|
reap_children()
|
||||||
|
|
||||||
def test_sync_handled(self):
|
def test_sync_handled(self):
|
||||||
BaseErrorTestServer(ValueError)
|
BaseErrorTestServer(ValueError)
|
||||||
|
@ -337,7 +352,7 @@ class BaseErrorTestServer(socketserver.TCPServer):
|
||||||
try:
|
try:
|
||||||
self.handle_request()
|
self.handle_request()
|
||||||
finally:
|
finally:
|
||||||
self.server_close()
|
close_server(self)
|
||||||
self.wait_done()
|
self.wait_done()
|
||||||
|
|
||||||
def handle_error(self, request, client_address):
|
def handle_error(self, request, client_address):
|
||||||
|
@ -371,10 +386,7 @@ class ThreadingErrorTestServer(socketserver.ThreadingMixIn,
|
||||||
|
|
||||||
if HAVE_FORKING:
|
if HAVE_FORKING:
|
||||||
class ForkingErrorTestServer(socketserver.ForkingMixIn, BaseErrorTestServer):
|
class ForkingErrorTestServer(socketserver.ForkingMixIn, BaseErrorTestServer):
|
||||||
def wait_done(self):
|
pass
|
||||||
[child] = self.active_children
|
|
||||||
os.waitpid(child, 0)
|
|
||||||
self.active_children.clear()
|
|
||||||
|
|
||||||
|
|
||||||
class SocketWriterTest(unittest.TestCase):
|
class SocketWriterTest(unittest.TestCase):
|
||||||
|
@ -386,7 +398,7 @@ class SocketWriterTest(unittest.TestCase):
|
||||||
self.server.request_fileno = self.request.fileno()
|
self.server.request_fileno = self.request.fileno()
|
||||||
|
|
||||||
server = socketserver.TCPServer((HOST, 0), Handler)
|
server = socketserver.TCPServer((HOST, 0), Handler)
|
||||||
self.addCleanup(server.server_close)
|
self.addCleanup(close_server, server)
|
||||||
s = socket.socket(
|
s = socket.socket(
|
||||||
server.address_family, socket.SOCK_STREAM, socket.IPPROTO_TCP)
|
server.address_family, socket.SOCK_STREAM, socket.IPPROTO_TCP)
|
||||||
with s:
|
with s:
|
||||||
|
@ -410,7 +422,7 @@ class SocketWriterTest(unittest.TestCase):
|
||||||
self.server.sent2 = self.wfile.write(big_chunk)
|
self.server.sent2 = self.wfile.write(big_chunk)
|
||||||
|
|
||||||
server = socketserver.TCPServer((HOST, 0), Handler)
|
server = socketserver.TCPServer((HOST, 0), Handler)
|
||||||
self.addCleanup(server.server_close)
|
self.addCleanup(close_server, server)
|
||||||
interrupted = threading.Event()
|
interrupted = threading.Event()
|
||||||
|
|
||||||
def signal_handler(signum, frame):
|
def signal_handler(signum, frame):
|
||||||
|
@ -486,7 +498,7 @@ class MiscTestCase(unittest.TestCase):
|
||||||
s.close()
|
s.close()
|
||||||
server.handle_request()
|
server.handle_request()
|
||||||
self.assertEqual(server.shutdown_called, 1)
|
self.assertEqual(server.shutdown_called, 1)
|
||||||
server.server_close()
|
close_server(server)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue