summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorPablo Galindo <Pablogsal@gmail.com>2018-12-11 11:32:12 (GMT)
committerGitHub <noreply@github.com>2018-12-11 11:32:12 (GMT)
commit2ab2afd387084ba38a37f5944fcb0675113b64dc (patch)
tree20024f565d34bbbeb6ab78d9a024baaace8a6e35 /Lib
parenta932d0b496767b5aac14191cbc17093e502b6cb4 (diff)
downloadcpython-2ab2afd387084ba38a37f5944fcb0675113b64dc.zip
cpython-2ab2afd387084ba38a37f5944fcb0675113b64dc.tar.gz
cpython-2ab2afd387084ba38a37f5944fcb0675113b64dc.tar.bz2
bpo-35426: Eliminate race condition in test_interprocess_signal (GH-11087)
The test only except SIGUSR1Exception inside wait_signal(), but the signal can be sent during subprocess_send_signal() call.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/signalinterproctester.py40
1 files changed, 18 insertions, 22 deletions
diff --git a/Lib/test/signalinterproctester.py b/Lib/test/signalinterproctester.py
index 877be51..168b5da 100644
--- a/Lib/test/signalinterproctester.py
+++ b/Lib/test/signalinterproctester.py
@@ -21,25 +21,19 @@ class InterProcessSignalTests(unittest.TestCase):
self.got_signals['SIGUSR1'] += 1
raise SIGUSR1Exception
- def wait_signal(self, child, signame, exc_class=None):
- try:
- if child is not None:
- # This wait should be interrupted by exc_class
- # (if set)
- child.wait()
-
- timeout = 10.0
- deadline = time.monotonic() + timeout
-
- while time.monotonic() < deadline:
- if self.got_signals[signame]:
- return
- signal.pause()
- except BaseException as exc:
- if exc_class is not None and isinstance(exc, exc_class):
- # got the expected exception
+ def wait_signal(self, child, signame):
+ if child is not None:
+ # This wait should be interrupted by exc_class
+ # (if set)
+ child.wait()
+
+ timeout = 10.0
+ deadline = time.monotonic() + timeout
+
+ while time.monotonic() < deadline:
+ if self.got_signals[signame]:
return
- raise
+ signal.pause()
self.fail('signal %s not received after %s seconds'
% (signame, timeout))
@@ -65,8 +59,9 @@ class InterProcessSignalTests(unittest.TestCase):
self.assertEqual(self.got_signals, {'SIGHUP': 1, 'SIGUSR1': 0,
'SIGALRM': 0})
- with self.subprocess_send_signal(pid, "SIGUSR1") as child:
- self.wait_signal(child, 'SIGUSR1', SIGUSR1Exception)
+ with self.assertRaises(SIGUSR1Exception):
+ with self.subprocess_send_signal(pid, "SIGUSR1") as child:
+ self.wait_signal(child, 'SIGUSR1')
self.assertEqual(self.got_signals, {'SIGHUP': 1, 'SIGUSR1': 1,
'SIGALRM': 0})
@@ -75,8 +70,9 @@ class InterProcessSignalTests(unittest.TestCase):
child.wait()
try:
- signal.alarm(1)
- self.wait_signal(None, 'SIGALRM', KeyboardInterrupt)
+ with self.assertRaises(KeyboardInterrupt):
+ signal.alarm(1)
+ self.wait_signal(None, 'SIGALRM')
self.assertEqual(self.got_signals, {'SIGHUP': 1, 'SIGUSR1': 1,
'SIGALRM': 0})
finally: