blob: f218463bff8c44ae147064740a6ea6e5accd7f3f [file] [log] [blame] [edit]
"""Tests for timeout."""
from __future__ import absolute_import
import signal
import time
import unittest
from . import timeout
LONG_TIME_SECS = 10
class TimeoutTest(unittest.TestCase):
def testRunWithoutTimeout(self):
"""Tests that handler is not called if there is no timeout."""
def _Handler(signum, frame):
del signum, frame # Unused.
self.fail('Timeout should not occur.')
with timeout.timeout(handler=_Handler, timeout_secs=LONG_TIME_SECS):
pass
def testRunWithZeroTimeout(self):
"""Tests that SIGALRM isn't raised with a 0 second timeout."""
def _Handler(signum, frame):
del signum, frame # Unused.
self.fail('Timeout should not occur.')
with timeout.timeout(handler=_Handler, timeout_secs=0):
pass
def testDefaultHandler(self):
"""Tests the default handler raises the correct exception."""
with self.assertRaises(timeout.TimeoutException):
with timeout.timeout(timeout_secs=1):
time.sleep(LONG_TIME_SECS)
def testRunWithTimeout(self):
"""Tests timing out with a custom timeout handler."""
class TestException(Exception):
"""A custom exception for this test."""
def _Handler(signum, frame):
del frame # Unused.
self.assertEqual(signum, signal.SIGALRM)
raise TestException()
with self.assertRaises(TestException):
with timeout.timeout(handler=_Handler, timeout_secs=1):
time.sleep(LONG_TIME_SECS)
def testPreviouslySetHandlerIsCalledWithoutTimeout(self):
"""Tests that previous handler is called if there is no timeout."""
class TestException(Exception):
"""A custom exception for this test."""
def _FirstHandler(signum, frame):
del frame # Unused.
self.assertEqual(signum, signal.SIGALRM)
raise TestException()
def _SecondHandler(signum, frame):
del signum, frame # Unused.
self.fail('Timeout should not occur.')
with self.assertRaises(TestException):
signal.signal(signal.SIGALRM, _FirstHandler)
signal.alarm(2)
with timeout.timeout(handler=_SecondHandler, timeout_secs=LONG_TIME_SECS):
pass
time.sleep(LONG_TIME_SECS)
def testPreviouslySetHandlerIsCalledWithTimeout(self):
"""Tests that previous handler is called if there is a timeout."""
class TestException(Exception):
"""A custom exception for this test."""
def _FirstHandler(signum, frame):
del frame # Unused.
self.assertEqual(signum, signal.SIGALRM)
raise TestException()
def _SecondHandler(signum, frame):
del frame # Unused.
self.assertEqual(signum, signal.SIGALRM)
raise TestException()
with self.assertRaises(TestException):
signal.signal(signal.SIGALRM, _FirstHandler)
signal.alarm(2)
with self.assertRaises(TestException):
with timeout.timeout(handler=_SecondHandler, timeout_secs=1):
time.sleep(LONG_TIME_SECS)
time.sleep(LONG_TIME_SECS)
if __name__ == '__main__':
unittest.main()