From 901a6507cd0d9cf63d8764ff7285db0baf241176 2020-03-02 20:36:12 From: Itamar Turner-Trauring Date: 2020-03-02 20:36:12 Subject: [PATCH] Test for debugger interruption. --- diff --git a/IPython/core/debugger.py b/IPython/core/debugger.py index fff875f..8502874 100644 --- a/IPython/core/debugger.py +++ b/IPython/core/debugger.py @@ -648,10 +648,3 @@ def set_trace(frame=None): If frame is not specified, debugging starts from caller's frame. """ Pdb().set_trace(frame or sys._getframe().f_back) - - -# Override built-in Pdb, since that version doesn't allow interrupting: -import pdb -pdb.set_trace = set_trace -pdb.Pdb = Pdb -del pdb diff --git a/IPython/core/tests/test_debugger.py b/IPython/core/tests/test_debugger.py index 665d8f8..1dfefe9 100644 --- a/IPython/core/tests/test_debugger.py +++ b/IPython/core/tests/test_debugger.py @@ -6,6 +6,8 @@ import sys import warnings +from tempfile import NamedTemporaryFile +from subprocess import check_output import nose.tools as nt @@ -220,3 +222,44 @@ def can_exit(): >>> sys.settrace(old_trace) ''' + + +interruptible_debugger = """\ +import threading +import time +from os import _exit + +from IPython.core.debugger import set_trace + +def interrupt(): + time.sleep(0.1) + import os, signal + os.kill(os.getpid(), signal.SIGINT) +threading.Thread(target=interrupt).start() + +# Timeout if the interrupt doesn't happen: +def interrupt(): + time.sleep(2) + _exit(7) +threading.Thread(target=interrupt, daemon=True).start() + +def main(): + set_trace() + +if __name__ == '__main__': + try: + main() + except KeyboardInterrupt: + print("PASSED") +""" + + +def test_interruptible_core_debugger(): + """The debugger can be interrupted.""" + with NamedTemporaryFile("w") as f: + f.write(interruptible_debugger) + f.flush() + result = check_output([sys.executable, f.name], + encoding=sys.getdefaultencoding()) + # Wait for it to start: + assert "PASSED" in result