7
from cStringIO import StringIO
13
@unittest.skipUnless(hasattr(os, 'kill'), "Test requires os.kill")
14
@unittest.skipIf(sys.platform =="win32", "Test cannot run on Windows")
15
@unittest.skipIf(sys.platform == 'freebsd6', "Test kills regrtest on freebsd6 "
16
"if threads have been used")
17
class TestBreak(unittest.TestCase):
20
self._default_handler = signal.getsignal(signal.SIGINT)
23
signal.signal(signal.SIGINT, self._default_handler)
24
unittest.signals._results = weakref.WeakKeyDictionary()
25
unittest.signals._interrupt_handler = None
28
def testInstallHandler(self):
29
default_handler = signal.getsignal(signal.SIGINT)
30
unittest.installHandler()
31
self.assertNotEqual(signal.getsignal(signal.SIGINT), default_handler)
35
os.kill(pid, signal.SIGINT)
36
except KeyboardInterrupt:
37
self.fail("KeyboardInterrupt not handled")
39
self.assertTrue(unittest.signals._interrupt_handler.called)
41
def testRegisterResult(self):
42
result = unittest.TestResult()
43
unittest.registerResult(result)
45
for ref in unittest.signals._results:
48
elif ref is not result:
49
self.fail("odd object in result set")
51
self.fail("result not found")
54
def testInterruptCaught(self):
55
default_handler = signal.getsignal(signal.SIGINT)
57
result = unittest.TestResult()
58
unittest.installHandler()
59
unittest.registerResult(result)
61
self.assertNotEqual(signal.getsignal(signal.SIGINT), default_handler)
65
os.kill(pid, signal.SIGINT)
66
result.breakCaught = True
67
self.assertTrue(result.shouldStop)
71
except KeyboardInterrupt:
72
self.fail("KeyboardInterrupt not handled")
73
self.assertTrue(result.breakCaught)
76
def testSecondInterrupt(self):
77
result = unittest.TestResult()
78
unittest.installHandler()
79
unittest.registerResult(result)
83
os.kill(pid, signal.SIGINT)
84
result.breakCaught = True
85
self.assertTrue(result.shouldStop)
86
os.kill(pid, signal.SIGINT)
87
self.fail("Second KeyboardInterrupt not raised")
91
except KeyboardInterrupt:
94
self.fail("Second KeyboardInterrupt not raised")
95
self.assertTrue(result.breakCaught)
98
def testTwoResults(self):
99
unittest.installHandler()
101
result = unittest.TestResult()
102
unittest.registerResult(result)
103
new_handler = signal.getsignal(signal.SIGINT)
105
result2 = unittest.TestResult()
106
unittest.registerResult(result2)
107
self.assertEqual(signal.getsignal(signal.SIGINT), new_handler)
109
result3 = unittest.TestResult()
113
os.kill(pid, signal.SIGINT)
117
except KeyboardInterrupt:
118
self.fail("KeyboardInterrupt not handled")
120
self.assertTrue(result.shouldStop)
121
self.assertTrue(result2.shouldStop)
122
self.assertFalse(result3.shouldStop)
125
def testHandlerReplacedButCalled(self):
126
# If our handler has been replaced (is no longer installed) but is
127
# called by the *new* handler, then it isn't safe to delay the
128
# SIGINT and we should immediately delegate to the default handler
129
unittest.installHandler()
131
handler = signal.getsignal(signal.SIGINT)
132
def new_handler(frame, signum):
133
handler(frame, signum)
134
signal.signal(signal.SIGINT, new_handler)
138
os.kill(pid, signal.SIGINT)
139
except KeyboardInterrupt:
142
self.fail("replaced but delegated handler doesn't raise interrupt")
144
def testRunner(self):
145
# Creating a TextTestRunner with the appropriate argument should
146
# register the TextTestResult it creates
147
runner = unittest.TextTestRunner(stream=StringIO())
149
result = runner.run(unittest.TestSuite())
150
self.assertIn(result, unittest.signals._results)
152
def testWeakReferences(self):
153
# Calling registerResult on a result should not keep it alive
154
result = unittest.TestResult()
155
unittest.registerResult(result)
157
ref = weakref.ref(result)
160
# For non-reference counting implementations
161
gc.collect();gc.collect()
162
self.assertIsNone(ref())
165
def testRemoveResult(self):
166
result = unittest.TestResult()
167
unittest.registerResult(result)
169
unittest.installHandler()
170
self.assertTrue(unittest.removeResult(result))
172
# Should this raise an error instead?
173
self.assertFalse(unittest.removeResult(unittest.TestResult()))
177
os.kill(pid, signal.SIGINT)
178
except KeyboardInterrupt:
181
self.assertFalse(result.shouldStop)
183
def testMainInstallsHandler(self):
188
default_handler = signal.getsignal(signal.SIGINT)
190
class FakeRunner(object):
193
def __init__(self, *args, **kwargs):
194
self.initArgs.append((args, kwargs))
196
self.runArgs.append(test)
199
class Program(unittest.TestProgram):
200
def __init__(self, catchbreak):
202
self.verbosity = verbosity
203
self.failfast = failfast
204
self.catchbreak = catchbreak
205
self.testRunner = FakeRunner
212
self.assertEqual(FakeRunner.initArgs, [((), {'buffer': None,
213
'verbosity': verbosity,
214
'failfast': failfast})])
215
self.assertEqual(FakeRunner.runArgs, [test])
216
self.assertEqual(p.result, result)
218
self.assertEqual(signal.getsignal(signal.SIGINT), default_handler)
220
FakeRunner.initArgs = []
221
FakeRunner.runArgs = []
225
self.assertEqual(FakeRunner.initArgs, [((), {'buffer': None,
226
'verbosity': verbosity,
227
'failfast': failfast})])
228
self.assertEqual(FakeRunner.runArgs, [test])
229
self.assertEqual(p.result, result)
231
self.assertNotEqual(signal.getsignal(signal.SIGINT), default_handler)
233
def testRemoveHandler(self):
234
default_handler = signal.getsignal(signal.SIGINT)
235
unittest.installHandler()
236
unittest.removeHandler()
237
self.assertEqual(signal.getsignal(signal.SIGINT), default_handler)
239
# check that calling removeHandler multiple times has no ill-effect
240
unittest.removeHandler()
241
self.assertEqual(signal.getsignal(signal.SIGINT), default_handler)
243
def testRemoveHandlerAsDecorator(self):
244
default_handler = signal.getsignal(signal.SIGINT)
245
unittest.installHandler()
247
@unittest.removeHandler
249
self.assertEqual(signal.getsignal(signal.SIGINT), default_handler)
252
self.assertNotEqual(signal.getsignal(signal.SIGINT), default_handler)