PageRenderTime 46ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/Lib/unittest/test/test_break.py

https://gitlab.com/unofficial-mirrors/cpython
Python | 291 lines | 215 code | 63 blank | 13 comment | 22 complexity | c7b474ddb1b01c7866789045aba3da9c MD5 | raw file
  1. import gc
  2. import io
  3. import os
  4. import sys
  5. import signal
  6. import weakref
  7. import unittest
  8. @unittest.skipUnless(hasattr(os, 'kill'), "Test requires os.kill")
  9. @unittest.skipIf(sys.platform =="win32", "Test cannot run on Windows")
  10. @unittest.skipIf(sys.platform == 'freebsd6', "Test kills regrtest on freebsd6 "
  11. "if threads have been used")
  12. class TestBreak(unittest.TestCase):
  13. int_handler = None
  14. def setUp(self):
  15. self._default_handler = signal.getsignal(signal.SIGINT)
  16. if self.int_handler is not None:
  17. signal.signal(signal.SIGINT, self.int_handler)
  18. def tearDown(self):
  19. signal.signal(signal.SIGINT, self._default_handler)
  20. unittest.signals._results = weakref.WeakKeyDictionary()
  21. unittest.signals._interrupt_handler = None
  22. def testInstallHandler(self):
  23. default_handler = signal.getsignal(signal.SIGINT)
  24. unittest.installHandler()
  25. self.assertNotEqual(signal.getsignal(signal.SIGINT), default_handler)
  26. try:
  27. pid = os.getpid()
  28. os.kill(pid, signal.SIGINT)
  29. except KeyboardInterrupt:
  30. self.fail("KeyboardInterrupt not handled")
  31. self.assertTrue(unittest.signals._interrupt_handler.called)
  32. def testRegisterResult(self):
  33. result = unittest.TestResult()
  34. unittest.registerResult(result)
  35. for ref in unittest.signals._results:
  36. if ref is result:
  37. break
  38. elif ref is not result:
  39. self.fail("odd object in result set")
  40. else:
  41. self.fail("result not found")
  42. def testInterruptCaught(self):
  43. default_handler = signal.getsignal(signal.SIGINT)
  44. result = unittest.TestResult()
  45. unittest.installHandler()
  46. unittest.registerResult(result)
  47. self.assertNotEqual(signal.getsignal(signal.SIGINT), default_handler)
  48. def test(result):
  49. pid = os.getpid()
  50. os.kill(pid, signal.SIGINT)
  51. result.breakCaught = True
  52. self.assertTrue(result.shouldStop)
  53. try:
  54. test(result)
  55. except KeyboardInterrupt:
  56. self.fail("KeyboardInterrupt not handled")
  57. self.assertTrue(result.breakCaught)
  58. def testSecondInterrupt(self):
  59. # Can't use skipIf decorator because the signal handler may have
  60. # been changed after defining this method.
  61. if signal.getsignal(signal.SIGINT) == signal.SIG_IGN:
  62. self.skipTest("test requires SIGINT to not be ignored")
  63. result = unittest.TestResult()
  64. unittest.installHandler()
  65. unittest.registerResult(result)
  66. def test(result):
  67. pid = os.getpid()
  68. os.kill(pid, signal.SIGINT)
  69. result.breakCaught = True
  70. self.assertTrue(result.shouldStop)
  71. os.kill(pid, signal.SIGINT)
  72. self.fail("Second KeyboardInterrupt not raised")
  73. try:
  74. test(result)
  75. except KeyboardInterrupt:
  76. pass
  77. else:
  78. self.fail("Second KeyboardInterrupt not raised")
  79. self.assertTrue(result.breakCaught)
  80. def testTwoResults(self):
  81. unittest.installHandler()
  82. result = unittest.TestResult()
  83. unittest.registerResult(result)
  84. new_handler = signal.getsignal(signal.SIGINT)
  85. result2 = unittest.TestResult()
  86. unittest.registerResult(result2)
  87. self.assertEqual(signal.getsignal(signal.SIGINT), new_handler)
  88. result3 = unittest.TestResult()
  89. def test(result):
  90. pid = os.getpid()
  91. os.kill(pid, signal.SIGINT)
  92. try:
  93. test(result)
  94. except KeyboardInterrupt:
  95. self.fail("KeyboardInterrupt not handled")
  96. self.assertTrue(result.shouldStop)
  97. self.assertTrue(result2.shouldStop)
  98. self.assertFalse(result3.shouldStop)
  99. def testHandlerReplacedButCalled(self):
  100. # Can't use skipIf decorator because the signal handler may have
  101. # been changed after defining this method.
  102. if signal.getsignal(signal.SIGINT) == signal.SIG_IGN:
  103. self.skipTest("test requires SIGINT to not be ignored")
  104. # If our handler has been replaced (is no longer installed) but is
  105. # called by the *new* handler, then it isn't safe to delay the
  106. # SIGINT and we should immediately delegate to the default handler
  107. unittest.installHandler()
  108. handler = signal.getsignal(signal.SIGINT)
  109. def new_handler(frame, signum):
  110. handler(frame, signum)
  111. signal.signal(signal.SIGINT, new_handler)
  112. try:
  113. pid = os.getpid()
  114. os.kill(pid, signal.SIGINT)
  115. except KeyboardInterrupt:
  116. pass
  117. else:
  118. self.fail("replaced but delegated handler doesn't raise interrupt")
  119. def testRunner(self):
  120. # Creating a TextTestRunner with the appropriate argument should
  121. # register the TextTestResult it creates
  122. runner = unittest.TextTestRunner(stream=io.StringIO())
  123. result = runner.run(unittest.TestSuite())
  124. self.assertIn(result, unittest.signals._results)
  125. def testWeakReferences(self):
  126. # Calling registerResult on a result should not keep it alive
  127. result = unittest.TestResult()
  128. unittest.registerResult(result)
  129. ref = weakref.ref(result)
  130. del result
  131. # For non-reference counting implementations
  132. gc.collect();gc.collect()
  133. self.assertIsNone(ref())
  134. def testRemoveResult(self):
  135. result = unittest.TestResult()
  136. unittest.registerResult(result)
  137. unittest.installHandler()
  138. self.assertTrue(unittest.removeResult(result))
  139. # Should this raise an error instead?
  140. self.assertFalse(unittest.removeResult(unittest.TestResult()))
  141. try:
  142. pid = os.getpid()
  143. os.kill(pid, signal.SIGINT)
  144. except KeyboardInterrupt:
  145. pass
  146. self.assertFalse(result.shouldStop)
  147. def testMainInstallsHandler(self):
  148. failfast = object()
  149. test = object()
  150. verbosity = object()
  151. result = object()
  152. default_handler = signal.getsignal(signal.SIGINT)
  153. class FakeRunner(object):
  154. initArgs = []
  155. runArgs = []
  156. def __init__(self, *args, **kwargs):
  157. self.initArgs.append((args, kwargs))
  158. def run(self, test):
  159. self.runArgs.append(test)
  160. return result
  161. class Program(unittest.TestProgram):
  162. def __init__(self, catchbreak):
  163. self.exit = False
  164. self.verbosity = verbosity
  165. self.failfast = failfast
  166. self.catchbreak = catchbreak
  167. self.tb_locals = False
  168. self.testRunner = FakeRunner
  169. self.test = test
  170. self.result = None
  171. p = Program(False)
  172. p.runTests()
  173. self.assertEqual(FakeRunner.initArgs, [((), {'buffer': None,
  174. 'verbosity': verbosity,
  175. 'failfast': failfast,
  176. 'tb_locals': False,
  177. 'warnings': None})])
  178. self.assertEqual(FakeRunner.runArgs, [test])
  179. self.assertEqual(p.result, result)
  180. self.assertEqual(signal.getsignal(signal.SIGINT), default_handler)
  181. FakeRunner.initArgs = []
  182. FakeRunner.runArgs = []
  183. p = Program(True)
  184. p.runTests()
  185. self.assertEqual(FakeRunner.initArgs, [((), {'buffer': None,
  186. 'verbosity': verbosity,
  187. 'failfast': failfast,
  188. 'tb_locals': False,
  189. 'warnings': None})])
  190. self.assertEqual(FakeRunner.runArgs, [test])
  191. self.assertEqual(p.result, result)
  192. self.assertNotEqual(signal.getsignal(signal.SIGINT), default_handler)
  193. def testRemoveHandler(self):
  194. default_handler = signal.getsignal(signal.SIGINT)
  195. unittest.installHandler()
  196. unittest.removeHandler()
  197. self.assertEqual(signal.getsignal(signal.SIGINT), default_handler)
  198. # check that calling removeHandler multiple times has no ill-effect
  199. unittest.removeHandler()
  200. self.assertEqual(signal.getsignal(signal.SIGINT), default_handler)
  201. def testRemoveHandlerAsDecorator(self):
  202. default_handler = signal.getsignal(signal.SIGINT)
  203. unittest.installHandler()
  204. @unittest.removeHandler
  205. def test():
  206. self.assertEqual(signal.getsignal(signal.SIGINT), default_handler)
  207. test()
  208. self.assertNotEqual(signal.getsignal(signal.SIGINT), default_handler)
  209. @unittest.skipUnless(hasattr(os, 'kill'), "Test requires os.kill")
  210. @unittest.skipIf(sys.platform =="win32", "Test cannot run on Windows")
  211. @unittest.skipIf(sys.platform == 'freebsd6', "Test kills regrtest on freebsd6 "
  212. "if threads have been used")
  213. class TestBreakDefaultIntHandler(TestBreak):
  214. int_handler = signal.default_int_handler
  215. @unittest.skipUnless(hasattr(os, 'kill'), "Test requires os.kill")
  216. @unittest.skipIf(sys.platform =="win32", "Test cannot run on Windows")
  217. @unittest.skipIf(sys.platform == 'freebsd6', "Test kills regrtest on freebsd6 "
  218. "if threads have been used")
  219. class TestBreakSignalIgnored(TestBreak):
  220. int_handler = signal.SIG_IGN
  221. @unittest.skipUnless(hasattr(os, 'kill'), "Test requires os.kill")
  222. @unittest.skipIf(sys.platform =="win32", "Test cannot run on Windows")
  223. @unittest.skipIf(sys.platform == 'freebsd6', "Test kills regrtest on freebsd6 "
  224. "if threads have been used")
  225. class TestBreakSignalDefault(TestBreak):
  226. int_handler = signal.SIG_DFL
  227. if __name__ == "__main__":
  228. unittest.main()