diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2012-04-08 22:47:24 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2012-04-08 22:47:24 (GMT) |
commit | b0a9c66a49b6ced6748c33ecff407812facd723d (patch) | |
tree | 49ee8c590a076e86ca3d0f6adb18ccf569d5872c /Lib/test/test_socketserver.py | |
parent | 317c8d257ebf8bf2f79eaa6a2d5b6e95a107e442 (diff) | |
download | cpython-b0a9c66a49b6ced6748c33ecff407812facd723d.zip cpython-b0a9c66a49b6ced6748c33ecff407812facd723d.tar.gz cpython-b0a9c66a49b6ced6748c33ecff407812facd723d.tar.bz2 |
Issue #7978: socketserver now restarts the select() call when EINTR is returned.
This avoids crashing the server loop when a signal is received.
Patch by Jerzy Kozera.
Diffstat (limited to 'Lib/test/test_socketserver.py')
-rw-r--r-- | Lib/test/test_socketserver.py | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/Lib/test/test_socketserver.py b/Lib/test/test_socketserver.py index b3660c1..0e76c33 100644 --- a/Lib/test/test_socketserver.py +++ b/Lib/test/test_socketserver.py @@ -8,6 +8,8 @@ import os import select import signal import socket +import select +import errno import tempfile import unittest import socketserver @@ -226,6 +228,38 @@ class SocketServerTest(unittest.TestCase): socketserver.DatagramRequestHandler, self.dgram_examine) + @contextlib.contextmanager + def mocked_select_module(self): + """Mocks the select.select() call to raise EINTR for first call""" + old_select = select.select + + class MockSelect: + def __init__(self): + self.called = 0 + + def __call__(self, *args): + self.called += 1 + if self.called == 1: + # raise the exception on first call + raise OSError(errno.EINTR, os.strerror(errno.EINTR)) + else: + # Return real select value for consecutive calls + return old_select(*args) + + select.select = MockSelect() + try: + yield select.select + finally: + select.select = old_select + + def test_InterruptServerSelectCall(self): + with self.mocked_select_module() as mock_select: + pid = self.run_server(socketserver.TCPServer, + socketserver.StreamRequestHandler, + self.stream_examine) + # Make sure select was called again: + self.assertGreater(mock_select.called, 1) + # Alas, on Linux (at least) recvfrom() doesn't return a meaningful # client address so this cannot work: |