mirror of
https://github.com/python/cpython.git
synced 2025-09-27 18:59:43 +00:00
bpo-31479: Always reset the signal alarm in tests (#3588)
* bpo-31479: Always reset the signal alarm in tests Use "try: ... finally: signal.signal(0)" pattern to make sure that tests don't "leak" a pending fatal signal alarm. * Move two more alarm() calls into the try block Fix also typo: replace signal.signal(0) with signal.alarm(0) * Move another signal.alarm() into the try block
This commit is contained in:
parent
a92941ff12
commit
9abee722d4
6 changed files with 56 additions and 40 deletions
|
@ -74,10 +74,13 @@ class InterProcessSignalTests(unittest.TestCase):
|
||||||
# Nothing should happen: SIGUSR2 is ignored
|
# Nothing should happen: SIGUSR2 is ignored
|
||||||
child.wait()
|
child.wait()
|
||||||
|
|
||||||
signal.alarm(1)
|
try:
|
||||||
self.wait_signal(None, 'SIGALRM', KeyboardInterrupt)
|
signal.alarm(1)
|
||||||
self.assertEqual(self.got_signals, {'SIGHUP': 1, 'SIGUSR1': 1,
|
self.wait_signal(None, 'SIGALRM', KeyboardInterrupt)
|
||||||
'SIGALRM': 0})
|
self.assertEqual(self.got_signals, {'SIGHUP': 1, 'SIGUSR1': 1,
|
||||||
|
'SIGALRM': 0})
|
||||||
|
finally:
|
||||||
|
signal.alarm(0)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
@ -3940,6 +3940,7 @@ class SignalsTest(unittest.TestCase):
|
||||||
if isinstance(exc, RuntimeError):
|
if isinstance(exc, RuntimeError):
|
||||||
self.assertTrue(str(exc).startswith("reentrant call"), str(exc))
|
self.assertTrue(str(exc).startswith("reentrant call"), str(exc))
|
||||||
finally:
|
finally:
|
||||||
|
signal.alarm(0)
|
||||||
wio.close()
|
wio.close()
|
||||||
os.close(r)
|
os.close(r)
|
||||||
|
|
||||||
|
@ -3968,6 +3969,7 @@ class SignalsTest(unittest.TestCase):
|
||||||
# - third raw read() returns b"bar"
|
# - third raw read() returns b"bar"
|
||||||
self.assertEqual(decode(rio.read(6)), "foobar")
|
self.assertEqual(decode(rio.read(6)), "foobar")
|
||||||
finally:
|
finally:
|
||||||
|
signal.alarm(0)
|
||||||
rio.close()
|
rio.close()
|
||||||
os.close(w)
|
os.close(w)
|
||||||
os.close(r)
|
os.close(r)
|
||||||
|
@ -4035,6 +4037,7 @@ class SignalsTest(unittest.TestCase):
|
||||||
self.assertIsNone(error)
|
self.assertIsNone(error)
|
||||||
self.assertEqual(N, sum(len(x) for x in read_results))
|
self.assertEqual(N, sum(len(x) for x in read_results))
|
||||||
finally:
|
finally:
|
||||||
|
signal.alarm(0)
|
||||||
write_finished = True
|
write_finished = True
|
||||||
os.close(w)
|
os.close(w)
|
||||||
os.close(r)
|
os.close(r)
|
||||||
|
|
|
@ -51,14 +51,11 @@ class PtyTest(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
# isatty() and close() can hang on some platforms. Set an alarm
|
# isatty() and close() can hang on some platforms. Set an alarm
|
||||||
# before running the test to make sure we don't hang forever.
|
# before running the test to make sure we don't hang forever.
|
||||||
self.old_alarm = signal.signal(signal.SIGALRM, self.handle_sig)
|
old_alarm = signal.signal(signal.SIGALRM, self.handle_sig)
|
||||||
|
self.addCleanup(signal.signal, signal.SIGALRM, old_alarm)
|
||||||
|
self.addCleanup(signal.alarm, 0)
|
||||||
signal.alarm(10)
|
signal.alarm(10)
|
||||||
|
|
||||||
def tearDown(self):
|
|
||||||
# remove alarm, restore old alarm handler
|
|
||||||
signal.alarm(0)
|
|
||||||
signal.signal(signal.SIGALRM, self.old_alarm)
|
|
||||||
|
|
||||||
def handle_sig(self, sig, frame):
|
def handle_sig(self, sig, frame):
|
||||||
self.fail("isatty hung")
|
self.fail("isatty hung")
|
||||||
|
|
||||||
|
|
|
@ -399,17 +399,19 @@ class BaseSelectorTestCase(unittest.TestCase):
|
||||||
|
|
||||||
orig_alrm_handler = signal.signal(signal.SIGALRM, handler)
|
orig_alrm_handler = signal.signal(signal.SIGALRM, handler)
|
||||||
self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
|
self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
|
||||||
self.addCleanup(signal.alarm, 0)
|
|
||||||
|
|
||||||
signal.alarm(1)
|
try:
|
||||||
|
signal.alarm(1)
|
||||||
|
|
||||||
s.register(rd, selectors.EVENT_READ)
|
s.register(rd, selectors.EVENT_READ)
|
||||||
t = time()
|
t = time()
|
||||||
# select() is interrupted by a signal which raises an exception
|
# select() is interrupted by a signal which raises an exception
|
||||||
with self.assertRaises(InterruptSelect):
|
with self.assertRaises(InterruptSelect):
|
||||||
s.select(30)
|
s.select(30)
|
||||||
# select() was interrupted before the timeout of 30 seconds
|
# select() was interrupted before the timeout of 30 seconds
|
||||||
self.assertLess(time() - t, 5.0)
|
self.assertLess(time() - t, 5.0)
|
||||||
|
finally:
|
||||||
|
signal.alarm(0)
|
||||||
|
|
||||||
@unittest.skipUnless(hasattr(signal, "alarm"),
|
@unittest.skipUnless(hasattr(signal, "alarm"),
|
||||||
"signal.alarm() required for this test")
|
"signal.alarm() required for this test")
|
||||||
|
@ -421,17 +423,19 @@ class BaseSelectorTestCase(unittest.TestCase):
|
||||||
|
|
||||||
orig_alrm_handler = signal.signal(signal.SIGALRM, lambda *args: None)
|
orig_alrm_handler = signal.signal(signal.SIGALRM, lambda *args: None)
|
||||||
self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
|
self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
|
||||||
self.addCleanup(signal.alarm, 0)
|
|
||||||
|
|
||||||
signal.alarm(1)
|
try:
|
||||||
|
signal.alarm(1)
|
||||||
|
|
||||||
s.register(rd, selectors.EVENT_READ)
|
s.register(rd, selectors.EVENT_READ)
|
||||||
t = time()
|
t = time()
|
||||||
# select() is interrupted by a signal, but the signal handler doesn't
|
# select() is interrupted by a signal, but the signal handler doesn't
|
||||||
# raise an exception, so select() should by retries with a recomputed
|
# raise an exception, so select() should by retries with a recomputed
|
||||||
# timeout
|
# timeout
|
||||||
self.assertFalse(s.select(1.5))
|
self.assertFalse(s.select(1.5))
|
||||||
self.assertGreaterEqual(time() - t, 1.0)
|
self.assertGreaterEqual(time() - t, 1.0)
|
||||||
|
finally:
|
||||||
|
signal.alarm(0)
|
||||||
|
|
||||||
|
|
||||||
class ScalableSelectorMixIn:
|
class ScalableSelectorMixIn:
|
||||||
|
|
|
@ -3854,7 +3854,6 @@ class InterruptedTimeoutBase(unittest.TestCase):
|
||||||
orig_alrm_handler = signal.signal(signal.SIGALRM,
|
orig_alrm_handler = signal.signal(signal.SIGALRM,
|
||||||
lambda signum, frame: 1 / 0)
|
lambda signum, frame: 1 / 0)
|
||||||
self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
|
self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
|
||||||
self.addCleanup(self.setAlarm, 0)
|
|
||||||
|
|
||||||
# Timeout for socket operations
|
# Timeout for socket operations
|
||||||
timeout = 4.0
|
timeout = 4.0
|
||||||
|
@ -3891,9 +3890,12 @@ class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
|
||||||
def checkInterruptedRecv(self, func, *args, **kwargs):
|
def checkInterruptedRecv(self, func, *args, **kwargs):
|
||||||
# Check that func(*args, **kwargs) raises
|
# Check that func(*args, **kwargs) raises
|
||||||
# errno of EINTR when interrupted by a signal.
|
# errno of EINTR when interrupted by a signal.
|
||||||
self.setAlarm(self.alarm_time)
|
try:
|
||||||
with self.assertRaises(ZeroDivisionError) as cm:
|
self.setAlarm(self.alarm_time)
|
||||||
func(*args, **kwargs)
|
with self.assertRaises(ZeroDivisionError) as cm:
|
||||||
|
func(*args, **kwargs)
|
||||||
|
finally:
|
||||||
|
self.setAlarm(0)
|
||||||
|
|
||||||
def testInterruptedRecvTimeout(self):
|
def testInterruptedRecvTimeout(self):
|
||||||
self.checkInterruptedRecv(self.serv.recv, 1024)
|
self.checkInterruptedRecv(self.serv.recv, 1024)
|
||||||
|
@ -3948,10 +3950,13 @@ class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
|
||||||
# Check that func(*args, **kwargs), run in a loop, raises
|
# Check that func(*args, **kwargs), run in a loop, raises
|
||||||
# OSError with an errno of EINTR when interrupted by a
|
# OSError with an errno of EINTR when interrupted by a
|
||||||
# signal.
|
# signal.
|
||||||
with self.assertRaises(ZeroDivisionError) as cm:
|
try:
|
||||||
while True:
|
with self.assertRaises(ZeroDivisionError) as cm:
|
||||||
self.setAlarm(self.alarm_time)
|
while True:
|
||||||
func(*args, **kwargs)
|
self.setAlarm(self.alarm_time)
|
||||||
|
func(*args, **kwargs)
|
||||||
|
finally:
|
||||||
|
self.setAlarm(0)
|
||||||
|
|
||||||
# Issue #12958: The following tests have problems on OS X prior to 10.7
|
# Issue #12958: The following tests have problems on OS X prior to 10.7
|
||||||
@support.requires_mac_ver(10, 7)
|
@support.requires_mac_ver(10, 7)
|
||||||
|
@ -4675,8 +4680,8 @@ class TCPTimeoutTest(SocketTCPTest):
|
||||||
raise Alarm
|
raise Alarm
|
||||||
old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
|
old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
|
||||||
try:
|
try:
|
||||||
signal.alarm(2) # POSIX allows alarm to be up to 1 second early
|
|
||||||
try:
|
try:
|
||||||
|
signal.alarm(2) # POSIX allows alarm to be up to 1 second early
|
||||||
foo = self.serv.accept()
|
foo = self.serv.accept()
|
||||||
except socket.timeout:
|
except socket.timeout:
|
||||||
self.fail("caught timeout instead of Alarm")
|
self.fail("caught timeout instead of Alarm")
|
||||||
|
|
|
@ -56,9 +56,11 @@ class ThreadSignals(unittest.TestCase):
|
||||||
# wait for it return.
|
# wait for it return.
|
||||||
if signal_blackboard[signal.SIGUSR1]['tripped'] == 0 \
|
if signal_blackboard[signal.SIGUSR1]['tripped'] == 0 \
|
||||||
or signal_blackboard[signal.SIGUSR2]['tripped'] == 0:
|
or signal_blackboard[signal.SIGUSR2]['tripped'] == 0:
|
||||||
signal.alarm(1)
|
try:
|
||||||
signal.pause()
|
signal.alarm(1)
|
||||||
signal.alarm(0)
|
signal.pause()
|
||||||
|
finally:
|
||||||
|
signal.alarm(0)
|
||||||
|
|
||||||
self.assertEqual( signal_blackboard[signal.SIGUSR1]['tripped'], 1)
|
self.assertEqual( signal_blackboard[signal.SIGUSR1]['tripped'], 1)
|
||||||
self.assertEqual( signal_blackboard[signal.SIGUSR1]['tripped_by'],
|
self.assertEqual( signal_blackboard[signal.SIGUSR1]['tripped_by'],
|
||||||
|
@ -98,6 +100,7 @@ class ThreadSignals(unittest.TestCase):
|
||||||
# after timeout return of lock.acquire() (which can fool assertRaises).
|
# after timeout return of lock.acquire() (which can fool assertRaises).
|
||||||
self.assertLess(dt, 3.0)
|
self.assertLess(dt, 3.0)
|
||||||
finally:
|
finally:
|
||||||
|
signal.alarm(0)
|
||||||
signal.signal(signal.SIGALRM, oldalrm)
|
signal.signal(signal.SIGALRM, oldalrm)
|
||||||
|
|
||||||
@unittest.skipIf(USING_PTHREAD_COND,
|
@unittest.skipIf(USING_PTHREAD_COND,
|
||||||
|
@ -131,6 +134,7 @@ class ThreadSignals(unittest.TestCase):
|
||||||
# See rationale above in test_lock_acquire_interruption
|
# See rationale above in test_lock_acquire_interruption
|
||||||
self.assertLess(dt, 3.0)
|
self.assertLess(dt, 3.0)
|
||||||
finally:
|
finally:
|
||||||
|
signal.alarm(0)
|
||||||
signal.signal(signal.SIGALRM, oldalrm)
|
signal.signal(signal.SIGALRM, oldalrm)
|
||||||
|
|
||||||
def acquire_retries_on_intr(self, lock):
|
def acquire_retries_on_intr(self, lock):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue