diff options
author | Pablo Galindo <Pablogsal@gmail.com> | 2018-12-11 11:32:12 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-11 11:32:12 (GMT) |
commit | 2ab2afd387084ba38a37f5944fcb0675113b64dc (patch) | |
tree | 20024f565d34bbbeb6ab78d9a024baaace8a6e35 /Lib | |
parent | a932d0b496767b5aac14191cbc17093e502b6cb4 (diff) | |
download | cpython-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.py | 40 |
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: |