diff --git a/Lib/unittest/signals.py b/Lib/unittest/signals.py index e6a5fc5..251b488 100644 --- a/Lib/unittest/signals.py +++ b/Lib/unittest/signals.py @@ -35,8 +35,13 @@ class _InterruptHandler(object): if self.called: self.default_handler(signum, frame) self.called = True + stopped = False for result in _results.keys(): result.stop() + stopped = True + if not stopped: + # if there aren't any registered results, delegate immediately + self.default_handler(signum, frame) _results = weakref.WeakKeyDictionary() def registerResult(result): diff --git a/Lib/unittest/test/test_break.py b/Lib/unittest/test/test_break.py index 2c75019..ff9c69e 100644 --- a/Lib/unittest/test/test_break.py +++ b/Lib/unittest/test/test_break.py @@ -31,6 +31,9 @@ class TestBreak(unittest.TestCase): unittest.installHandler() self.assertNotEqual(signal.getsignal(signal.SIGINT), default_handler) + result = unittest.TestResult() + unittest.registerResult(result) + try: pid = os.getpid() os.kill(pid, signal.SIGINT) @@ -39,6 +42,22 @@ class TestBreak(unittest.TestCase): self.assertTrue(unittest.signals._interrupt_handler.called) + def testNoResultsRegistered(self): + # Can't use skipIf decorator because the signal handler may have + # been changed after defining this method. + if signal.getsignal(signal.SIGINT) == signal.SIG_IGN: + self.skipTest("test requires SIGINT to not be ignored") + + unittest.installHandler() + + self.assertEqual(list(unittest.signals._results.keys()), []) + + with self.assertRaises(KeyboardInterrupt): + pid = os.getpid() + os.kill(pid, signal.SIGINT) + + self.assertTrue(unittest.signals._interrupt_handler.called) + def testRegisterResult(self): result = unittest.TestResult() unittest.registerResult(result)