summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_socketserver.py
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2012-04-08 22:47:24 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2012-04-08 22:47:24 (GMT)
commitb0a9c66a49b6ced6748c33ecff407812facd723d (patch)
tree49ee8c590a076e86ca3d0f6adb18ccf569d5872c /Lib/test/test_socketserver.py
parent317c8d257ebf8bf2f79eaa6a2d5b6e95a107e442 (diff)
downloadcpython-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.py34
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: