Show More
@@ -11,6 +11,8 b' import warnings' | |||||
11 | from tempfile import NamedTemporaryFile |
|
11 | from tempfile import NamedTemporaryFile | |
12 | from subprocess import check_output, CalledProcessError, PIPE |
|
12 | from subprocess import check_output, CalledProcessError, PIPE | |
13 | import subprocess |
|
13 | import subprocess | |
|
14 | from unittest.mock import patch | |||
|
15 | import builtins | |||
14 |
|
16 | |||
15 | import nose.tools as nt |
|
17 | import nose.tools as nt | |
16 |
|
18 | |||
@@ -227,72 +229,20 b' def can_exit():' | |||||
227 | ''' |
|
229 | ''' | |
228 |
|
230 | |||
229 |
|
231 | |||
230 | interruptible_debugger = """\ |
|
|||
231 | import sys |
|
|||
232 | import threading |
|
|||
233 | import time |
|
|||
234 | from os import _exit |
|
|||
235 | from bdb import BdbQuit |
|
|||
236 |
|
||||
237 | from IPython.core.debugger import set_trace |
|
|||
238 |
|
||||
239 | # Timeout if the interrupt doesn't happen: |
|
|||
240 | def timeout(): |
|
|||
241 | time.sleep(5) |
|
|||
242 | _exit(7) |
|
|||
243 | threading.Thread(target=timeout, daemon=True).start() |
|
|||
244 |
|
||||
245 | def break_handler(*args): |
|
|||
246 | print("BREAK!") |
|
|||
247 | raise KeyboardInterrupt() |
|
|||
248 |
|
||||
249 | def main(): |
|
|||
250 | import signal |
|
|||
251 | signal.signal(signal.SIGBREAK, break_handler) |
|
|||
252 | set_trace() |
|
|||
253 |
|
||||
254 | if __name__ == '__main__': |
|
|||
255 | try: |
|
|||
256 | print("Starting debugger...") |
|
|||
257 | main() |
|
|||
258 | print("Debugger exited without error.") |
|
|||
259 | except (KeyboardInterrupt, BdbQuit): |
|
|||
260 | print("Caught KeyboardInterrupt or BdbQuit, PASSED") |
|
|||
261 | except Exception as e: |
|
|||
262 | print("Got wrong exception...") |
|
|||
263 | raise e |
|
|||
264 | """ |
|
|||
265 |
|
||||
266 |
|
||||
267 | def test_interruptible_core_debugger(): |
|
232 | def test_interruptible_core_debugger(): | |
268 | """The debugger can be interrupted. |
|
233 | """The debugger can be interrupted. | |
269 |
|
234 | |||
270 | See https://stackoverflow.com/a/35792192 for details on Windows. |
|
235 | The presumption is there is some mechanism that causes a KeyboardInterrupt | |
|
236 | (this is implemented in ipykernel). We want to ensure the | |||
|
237 | KeyboardInterrupt cause debugging to cease. | |||
271 | """ |
|
238 | """ | |
272 | with NamedTemporaryFile("w", delete=False) as f: |
|
239 | def raising_input(msg=""): | |
273 | f.write(interruptible_debugger) |
|
240 | raise KeyboardInterrupt() | |
274 | f.flush() |
|
241 | ||
275 | start = time.time() |
|
242 | with patch.object(builtins, "input", raising_input): | |
276 |
|
243 | debugger.set_trace() | ||
277 | p = subprocess.Popen([sys.executable, "-u", f.name], |
|
244 | # The way this test will fail is by set_trace() never exiting, | |
278 | creationflags=subprocess.CREATE_NEW_PROCESS_GROUP, # TODO disable on posix |
|
245 | # resulting in a timeout by the test runner. The alternative | |
279 | encoding=sys.getdefaultencoding(), |
|
246 | # implementation would involve a subprocess, but that adds issues with | |
280 | stderr=PIPE, stdout=PIPE) |
|
247 | # interrupting subprocesses that are rather complex, so it's simpler | |
281 | time.sleep(1) # wait for it to hit pdb |
|
248 | # just to do it this way. | |
282 | if sys.platform == "win32": |
|
|||
283 | # Yes, this has to happen once. I have no idea why. |
|
|||
284 | p.send_signal(signal.CTRL_BREAK_EVENT) |
|
|||
285 | p.send_signal(signal.CTRL_BREAK_EVENT) |
|
|||
286 | else: |
|
|||
287 | p.send_signal(signal.SIGINT) |
|
|||
288 | exit_code = p.wait() |
|
|||
289 | stdout = p.stdout.read() |
|
|||
290 | stderr = p.stderr.read() |
|
|||
291 | print("STDOUT", stdout, file=sys.__stderr__) |
|
|||
292 | print("STDERR", stderr, file=sys.__stderr__) |
|
|||
293 | assert exit_code == 0 |
|
|||
294 | print("SUCCESS!", file=sys.__stderr__) |
|
|||
295 | # Make sure it exited cleanly, and quickly: |
|
|||
296 | end = time.time() |
|
|||
297 | assert end - start < 2 # timeout is 5 seconds |
|
|||
298 | assert "PASSED" in stdout No newline at end of file |
|
General Comments 0
You need to be logged in to leave comments.
Login now