a ze@sddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z m Z ddl mZddlmZddlmZddlmZddlmZdd ZGd d d eZd d ZddZddZddZddZddZddZ ddZ!ddZ"ddZ#e$d Z%e&d!e%j'd"d#Z(d$d%Z)d&d'Z*d(d)Z+d*d+Z,d,d-Z-d.d/Z.d0d1Z/d2d3Z0d4d5Z1d6d7Z2d8d9Z3d:d;Z4dd?Z6d@dAZ7dBdCZ8GdDdEdEej9Z:GdFdGdGej9Z;dHdIZdS)KN) ExitStackredirect_stdout)StringIO)support) _FakeInput)patch) BreakpointcCsdt_it_dgt_dS)N)rnextZbplistZ bpbynumberr r A/opt/bitninja-python-dojo/embedded/lib/python3.9/test/test_pdb.pyreset_Breakpointsr c@s(eZdZdZddZddZddZdS) PdbTestInputz:Context manager that makes testing Pdb in doctests easier.cCs ||_dSN)input)selfrr r r __init__ szPdbTestInput.__init__cCs0tj|_t|jt_ttdr&tnd|_dS)Ngettrace)sysstdin real_stdinrrhasattrr orig_tracerr r r __enter__#s zPdbTestInput.__enter__cGs|jt_|jrt|jdSr)rrrrsettrace)rexcr r r __exit__(szPdbTestInput.__exit__N)__name__ __module__ __qualname____doc__rrrr r r r rsrcCsdS)a1This tests the custom displayhook for pdb. >>> def test_function(foo, bar): ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() ... pass >>> with PdbTestInput([ ... 'foo', ... 'bar', ... 'for i in range(5): print(i)', ... 'continue', ... ]): ... test_function(1, None) > (3)test_function() -> pass (Pdb) foo 1 (Pdb) bar (Pdb) for i in range(5): print(i) 0 1 2 3 4 (Pdb) continue Nr r r r r test_pdb_displayhook.sr"cCsdS)aTest the basic commands of pdb. >>> def test_function_2(foo, bar='default'): ... print(foo) ... for i in range(5): ... print(i) ... print(bar) ... for i in range(10): ... never_executed ... print('after for') ... print('...') ... return foo.upper() >>> def test_function3(arg=None, *, kwonly=None): ... pass >>> def test_function4(a, b, c, /): ... pass >>> def test_function(): ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() ... ret = test_function_2('baz') ... test_function3(kwonly=True) ... test_function4(1, 2, 3) ... print(ret) >>> with PdbTestInput([ # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE ... 'step', # entering the function call ... 'args', # display function args ... 'list', # list function source ... 'bt', # display backtrace ... 'up', # step up to test_function() ... 'down', # step down to test_function_2() again ... 'next', # stepping to print(foo) ... 'next', # stepping to the for loop ... 'step', # stepping into the for loop ... 'until', # continuing until out of the for loop ... 'next', # executing the print(bar) ... 'jump 8', # jump over second for loop ... 'return', # return out of function ... 'retval', # display return value ... 'next', # step to test_function3() ... 'step', # stepping into test_function3() ... 'args', # display function args ... 'return', # return out of function ... 'next', # step to test_function4() ... 'step', # stepping to test_function4() ... 'args', # display function args ... 'continue', ... ]): ... test_function() > (3)test_function() -> ret = test_function_2('baz') (Pdb) step --Call-- > (1)test_function_2() -> def test_function_2(foo, bar='default'): (Pdb) args foo = 'baz' bar = 'default' (Pdb) list 1 -> def test_function_2(foo, bar='default'): 2 print(foo) 3 for i in range(5): 4 print(i) 5 print(bar) 6 for i in range(10): 7 never_executed 8 print('after for') 9 print('...') 10 return foo.upper() [EOF] (Pdb) bt ... (25)() -> test_function() (3)test_function() -> ret = test_function_2('baz') > (1)test_function_2() -> def test_function_2(foo, bar='default'): (Pdb) up > (3)test_function() -> ret = test_function_2('baz') (Pdb) down > (1)test_function_2() -> def test_function_2(foo, bar='default'): (Pdb) next > (2)test_function_2() -> print(foo) (Pdb) next baz > (3)test_function_2() -> for i in range(5): (Pdb) step > (4)test_function_2() -> print(i) (Pdb) until 0 1 2 3 4 > (5)test_function_2() -> print(bar) (Pdb) next default > (6)test_function_2() -> for i in range(10): (Pdb) jump 8 > (8)test_function_2() -> print('after for') (Pdb) return after for ... --Return-- > (10)test_function_2()->'BAZ' -> return foo.upper() (Pdb) retval 'BAZ' (Pdb) next > (4)test_function() -> test_function3(kwonly=True) (Pdb) step --Call-- > (1)test_function3() -> def test_function3(arg=None, *, kwonly=None): (Pdb) args arg = None kwonly = True (Pdb) return --Return-- > (2)test_function3()->None -> pass (Pdb) next > (5)test_function() -> test_function4(1, 2, 3) (Pdb) step --Call-- > (1)test_function4() -> def test_function4(a, b, c, /): (Pdb) args a = 1 b = 2 c = 3 (Pdb) continue BAZ Nr r r r r test_pdb_basic_commandsKsr#cCsdS)aTest basic commands related to breakpoints. >>> def test_function(): ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() ... print(1) ... print(2) ... print(3) ... print(4) First, need to clear bdb state that might be left over from previous tests. Otherwise, the new breakpoints might get assigned different numbers. >>> reset_Breakpoint() Now test the breakpoint commands. NORMALIZE_WHITESPACE is needed because the breakpoint list outputs a tab for the "stop only" and "ignore next" lines, which we don't want to put in here. >>> with PdbTestInput([ # doctest: +NORMALIZE_WHITESPACE ... 'break 3', ... 'disable 1', ... 'ignore 1 10', ... 'condition 1 1 < 2', ... 'break 4', ... 'break 4', ... 'break', ... 'clear 3', ... 'break', ... 'condition 1', ... 'enable 1', ... 'clear 1', ... 'commands 2', ... 'p "42"', ... 'print("42", 7*6)', # Issue 18764 (not about breakpoints) ... 'end', ... 'continue', # will stop at breakpoint 2 (line 4) ... 'clear', # clear all! ... 'y', ... 'tbreak 5', ... 'continue', # will stop at temporary breakpoint ... 'break', # make sure breakpoint is gone ... 'continue', ... ]): ... test_function() > (3)test_function() -> print(1) (Pdb) break 3 Breakpoint 1 at :3 (Pdb) disable 1 Disabled breakpoint 1 at :3 (Pdb) ignore 1 10 Will ignore next 10 crossings of breakpoint 1. (Pdb) condition 1 1 < 2 New condition set for breakpoint 1. (Pdb) break 4 Breakpoint 2 at :4 (Pdb) break 4 Breakpoint 3 at :4 (Pdb) break Num Type Disp Enb Where 1 breakpoint keep no at :3 stop only if 1 < 2 ignore next 10 hits 2 breakpoint keep yes at :4 3 breakpoint keep yes at :4 (Pdb) clear 3 Deleted breakpoint 3 at :4 (Pdb) break Num Type Disp Enb Where 1 breakpoint keep no at :3 stop only if 1 < 2 ignore next 10 hits 2 breakpoint keep yes at :4 (Pdb) condition 1 Breakpoint 1 is now unconditional. (Pdb) enable 1 Enabled breakpoint 1 at :3 (Pdb) clear 1 Deleted breakpoint 1 at :3 (Pdb) commands 2 (com) p "42" (com) print("42", 7*6) (com) end (Pdb) continue 1 '42' 42 42 > (4)test_function() -> print(2) (Pdb) clear Clear all breaks? y Deleted breakpoint 2 at :4 (Pdb) tbreak 5 Breakpoint 4 at :5 (Pdb) continue 2 Deleted breakpoint 4 at :5 > (5)test_function() -> print(3) (Pdb) break (Pdb) continue 3 4 Nr r r r r test_pdb_breakpoint_commandssr$cCsdS)aTest that do_p/do_pp do not swallow exceptions. >>> class BadRepr: ... def __repr__(self): ... raise Exception('repr_exc') >>> obj = BadRepr() >>> def test_function(): ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() >>> with PdbTestInput([ # doctest: +NORMALIZE_WHITESPACE ... 'p obj', ... 'pp obj', ... 'continue', ... ]): ... test_function() --Return-- > (2)test_function()->None -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() (Pdb) p obj *** Exception: repr_exc (Pdb) pp obj *** Exception: repr_exc (Pdb) continue Nr r r r r test_pdb_pp_repr_excLsr%cCsdSrr r r r r do_nothinghsr&cCs tddS)N*)printr r r r do_somethingksr)cCsdS)a Test the list and source commands of pdb. >>> def test_function_2(foo): ... import test.test_pdb ... test.test_pdb.do_nothing() ... 'some...' ... 'more...' ... 'code...' ... 'to...' ... 'make...' ... 'a...' ... 'long...' ... 'listing...' ... 'useful...' ... '...' ... '...' ... return foo >>> def test_function(): ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() ... ret = test_function_2('baz') >>> with PdbTestInput([ # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE ... 'list', # list first function ... 'step', # step into second function ... 'list', # list second function ... 'list', # continue listing to EOF ... 'list 1,3', # list specific lines ... 'list x', # invalid argument ... 'next', # step to import ... 'next', # step over import ... 'step', # step into do_nothing ... 'longlist', # list all lines ... 'source do_something', # list all lines of function ... 'source fooxxx', # something that doesn't exit ... 'continue', ... ]): ... test_function() > (3)test_function() -> ret = test_function_2('baz') (Pdb) list 1 def test_function(): 2 import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() 3 -> ret = test_function_2('baz') [EOF] (Pdb) step --Call-- > (1)test_function_2() -> def test_function_2(foo): (Pdb) list 1 -> def test_function_2(foo): 2 import test.test_pdb 3 test.test_pdb.do_nothing() 4 'some...' 5 'more...' 6 'code...' 7 'to...' 8 'make...' 9 'a...' 10 'long...' 11 'listing...' (Pdb) list 12 'useful...' 13 '...' 14 '...' 15 return foo [EOF] (Pdb) list 1,3 1 -> def test_function_2(foo): 2 import test.test_pdb 3 test.test_pdb.do_nothing() (Pdb) list x *** ... (Pdb) next > (2)test_function_2() -> import test.test_pdb (Pdb) next > (3)test_function_2() -> test.test_pdb.do_nothing() (Pdb) step --Call-- > ...test_pdb.py(...)do_nothing() -> def do_nothing(): (Pdb) longlist ... -> def do_nothing(): ... pass (Pdb) source do_something ... def do_something(): ... print(42) (Pdb) source fooxxx *** ... (Pdb) continue Nr r r r r test_list_commandsnsr*cCsdS)aITest the whatis command >>> myvar = (1,2) >>> def myfunc(): ... pass >>> class MyClass: ... def mymethod(self): ... pass >>> def test_function(): ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() >>> with PdbTestInput([ # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE ... 'whatis myvar', ... 'whatis myfunc', ... 'whatis MyClass', ... 'whatis MyClass()', ... 'whatis MyClass.mymethod', ... 'whatis MyClass().mymethod', ... 'continue', ... ]): ... test_function() --Return-- > (2)test_function()->None -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() (Pdb) whatis myvar (Pdb) whatis myfunc Function myfunc (Pdb) whatis MyClass Class test.test_pdb.MyClass (Pdb) whatis MyClass() (Pdb) whatis MyClass.mymethod Function mymethod (Pdb) whatis MyClass().mymethod Method mymethod (Pdb) continue Nr r r r r test_pdb_whatis_commandsr+cCsdS)aTest post mortem traceback debugging. >>> def test_function_2(): ... try: ... 1/0 ... finally: ... print('Exception!') >>> def test_function(): ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() ... test_function_2() ... print('Not reached.') >>> with PdbTestInput([ # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE ... 'next', # step over exception-raising call ... 'bt', # get a backtrace ... 'list', # list code of test_function() ... 'down', # step into test_function_2() ... 'list', # list code of test_function_2() ... 'continue', ... ]): ... try: ... test_function() ... except ZeroDivisionError: ... print('Correctly reraised.') > (3)test_function() -> test_function_2() (Pdb) next Exception! ZeroDivisionError: division by zero > (3)test_function() -> test_function_2() (Pdb) bt ... (10)() -> test_function() > (3)test_function() -> test_function_2() (3)test_function_2() -> 1/0 (Pdb) list 1 def test_function(): 2 import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() 3 -> test_function_2() 4 print('Not reached.') [EOF] (Pdb) down > (3)test_function_2() -> 1/0 (Pdb) list 1 def test_function_2(): 2 try: 3 >> 1/0 4 finally: 5 -> print('Exception!') [EOF] (Pdb) continue Correctly reraised. Nr r r r r test_post_mortemsr,cCsdS)a[This illustrates the simple case of module skipping. >>> def skip_module(): ... import string ... import pdb; pdb.Pdb(skip=['stri*'], nosigint=True, readrc=False).set_trace() ... string.capwords('FOO') >>> with PdbTestInput([ ... 'step', ... 'continue', ... ]): ... skip_module() > (4)skip_module() -> string.capwords('FOO') (Pdb) step --Return-- > (4)skip_module()->None -> string.capwords('FOO') (Pdb) continue Nr r r r r test_pdb_skip_modules5sr-Zmodule_to_skipz6def foo_pony(callback): x = 1; callback(); return NonecCsdS)aAThis illustrates skipping of modules that call into other code. >>> def skip_module(): ... def callback(): ... return None ... import pdb; pdb.Pdb(skip=['module_to_skip*'], nosigint=True, readrc=False).set_trace() ... mod.foo_pony(callback) >>> with PdbTestInput([ ... 'step', ... 'step', ... 'step', ... 'step', ... 'step', ... 'continue', ... ]): ... skip_module() ... pass # provides something to "step" to > (5)skip_module() -> mod.foo_pony(callback) (Pdb) step --Call-- > (2)callback() -> def callback(): (Pdb) step > (3)callback() -> return None (Pdb) step --Return-- > (3)callback()->None -> return None (Pdb) step --Return-- > (5)skip_module()->None -> mod.foo_pony(callback) (Pdb) step > (10)() -> pass # provides something to "step" to (Pdb) continue Nr r r r r #test_pdb_skip_modules_with_callbackQsr.cCsdS)aTest that "continue" and "next" work properly in bottom frame (issue #5294). >>> def test_function(): ... import pdb, sys; inst = pdb.Pdb(nosigint=True, readrc=False) ... inst.set_trace() ... inst.botframe = sys._getframe() # hackery to get the right botframe ... print(1) ... print(2) ... print(3) ... print(4) >>> with PdbTestInput([ # doctest: +ELLIPSIS ... 'next', ... 'break 7', ... 'continue', ... 'next', ... 'continue', ... 'continue', ... ]): ... test_function() > (4)test_function() -> inst.botframe = sys._getframe() # hackery to get the right botframe (Pdb) next > (5)test_function() -> print(1) (Pdb) break 7 Breakpoint ... at :7 (Pdb) continue 1 2 > (7)test_function() -> print(3) (Pdb) next 3 > (8)test_function() -> print(4) (Pdb) continue 4 Nr r r r r test_pdb_continue_in_bottomframe|sr/cCsttjddd||dS)zRun pdb.method(arg).TF)ZnosigintZreadrcN)getattrpdbPdb)methodargr r r pdb_invokesr5cCsdS)aTesting run and runeval with incorrect first argument. >>> pti = PdbTestInput(['continue',]) >>> with pti: ... pdb_invoke('run', lambda x: x) Traceback (most recent call last): TypeError: exec() arg 1 must be a string, bytes or code object >>> with pti: ... pdb_invoke('runeval', lambda x: x) Traceback (most recent call last): TypeError: eval() arg 1 must be a string, bytes or code object Nr r r r r $test_pdb_run_with_incorrect_argumentsr6cCsdS)a Testing run and runeval with code object as a first argument. >>> with PdbTestInput(['step','x', 'continue']): # doctest: +ELLIPSIS ... pdb_invoke('run', compile('x=1', '', 'exec')) > (1)()... (Pdb) step --Return-- > (1)()->None (Pdb) x 1 (Pdb) continue >>> with PdbTestInput(['x', 'continue']): ... x=0 ... pdb_invoke('runeval', compile('x+1', '', 'eval')) > (1)()->None (Pdb) x 1 (Pdb) continue Nr r r r r test_pdb_run_with_code_objectsr7cCsdS)aTest that pdb stops after a next/until/return issued at a return debug event. >>> def test_function_2(): ... x = 1 ... x = 2 >>> def test_function(): ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() ... test_function_2() ... test_function_2() ... test_function_2() ... end = 1 >>> reset_Breakpoint() >>> with PdbTestInput(['break test_function_2', ... 'continue', ... 'return', ... 'next', ... 'continue', ... 'return', ... 'until', ... 'continue', ... 'return', ... 'return', ... 'continue']): ... test_function() > (3)test_function() -> test_function_2() (Pdb) break test_function_2 Breakpoint 1 at :1 (Pdb) continue > (2)test_function_2() -> x = 1 (Pdb) return --Return-- > (3)test_function_2()->None -> x = 2 (Pdb) next > (4)test_function() -> test_function_2() (Pdb) continue > (2)test_function_2() -> x = 1 (Pdb) return --Return-- > (3)test_function_2()->None -> x = 2 (Pdb) until > (5)test_function() -> test_function_2() (Pdb) continue > (2)test_function_2() -> x = 1 (Pdb) return --Return-- > (3)test_function_2()->None -> x = 2 (Pdb) return > (6)test_function() -> end = 1 (Pdb) continue Nr r r r r &test_next_until_return_at_return_eventsr8cCsdS)aXTesting skip unwindng stack on yield for generators for "next" command >>> def test_gen(): ... yield 0 ... return 1 ... yield 2 >>> def test_function(): ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() ... it = test_gen() ... try: ... if next(it) != 0: ... raise AssertionError ... next(it) ... except StopIteration as ex: ... if ex.value != 1: ... raise AssertionError ... print("finished") >>> with PdbTestInput(['step', ... 'step', ... 'step', ... 'next', ... 'next', ... 'step', ... 'step', ... 'continue']): ... test_function() > (3)test_function() -> it = test_gen() (Pdb) step > (4)test_function() -> try: (Pdb) step > (5)test_function() -> if next(it) != 0: (Pdb) step --Call-- > (1)test_gen() -> def test_gen(): (Pdb) next > (2)test_gen() -> yield 0 (Pdb) next > (3)test_gen() -> return 1 (Pdb) step --Return-- > (3)test_gen()->1 -> return 1 (Pdb) step StopIteration: 1 > (7)test_function() -> next(it) (Pdb) continue finished Nr r r r r #test_pdb_next_command_for_generatorsr9cCsdS)a,Testing skip unwindng stack on yield for coroutines for "next" command >>> import asyncio >>> async def test_coro(): ... await asyncio.sleep(0) ... await asyncio.sleep(0) ... await asyncio.sleep(0) >>> async def test_main(): ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() ... await test_coro() >>> def test_function(): ... loop = asyncio.new_event_loop() ... loop.run_until_complete(test_main()) ... loop.close() ... asyncio.set_event_loop_policy(None) ... print("finished") >>> with PdbTestInput(['step', ... 'step', ... 'next', ... 'next', ... 'next', ... 'step', ... 'continue']): ... test_function() > (3)test_main() -> await test_coro() (Pdb) step --Call-- > (1)test_coro() -> async def test_coro(): (Pdb) step > (2)test_coro() -> await asyncio.sleep(0) (Pdb) next > (3)test_coro() -> await asyncio.sleep(0) (Pdb) next > (4)test_coro() -> await asyncio.sleep(0) (Pdb) next Internal StopIteration > (3)test_main() -> await test_coro() (Pdb) step --Return-- > (3)test_main()->None -> await test_coro() (Pdb) continue finished Nr r r r r #test_pdb_next_command_for_coroutineLsr:cCsdS)a*Testing skip unwindng stack on yield for coroutines for "next" command >>> import asyncio >>> async def agen(): ... yield 1 ... await asyncio.sleep(0) ... yield 2 >>> async def test_coro(): ... async for x in agen(): ... print(x) >>> async def test_main(): ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() ... await test_coro() >>> def test_function(): ... loop = asyncio.new_event_loop() ... loop.run_until_complete(test_main()) ... loop.close() ... asyncio.set_event_loop_policy(None) ... print("finished") >>> with PdbTestInput(['step', ... 'step', ... 'next', ... 'next', ... 'step', ... 'next', ... 'continue']): ... test_function() > (3)test_main() -> await test_coro() (Pdb) step --Call-- > (1)test_coro() -> async def test_coro(): (Pdb) step > (2)test_coro() -> async for x in agen(): (Pdb) next > (3)test_coro() -> print(x) (Pdb) next 1 > (2)test_coro() -> async for x in agen(): (Pdb) step --Call-- > (2)agen() -> yield 1 (Pdb) next > (3)agen() -> await asyncio.sleep(0) (Pdb) continue 2 finished Nr r r r r "test_pdb_next_command_for_asyncgensr;cCsdS)aTesting no unwindng stack on yield for generators for "return" command >>> def test_gen(): ... yield 0 ... return 1 ... yield 2 >>> def test_function(): ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() ... it = test_gen() ... try: ... if next(it) != 0: ... raise AssertionError ... next(it) ... except StopIteration as ex: ... if ex.value != 1: ... raise AssertionError ... print("finished") >>> with PdbTestInput(['step', ... 'step', ... 'step', ... 'return', ... 'step', ... 'step', ... 'continue']): ... test_function() > (3)test_function() -> it = test_gen() (Pdb) step > (4)test_function() -> try: (Pdb) step > (5)test_function() -> if next(it) != 0: (Pdb) step --Call-- > (1)test_gen() -> def test_gen(): (Pdb) return StopIteration: 1 > (7)test_function() -> next(it) (Pdb) step > (8)test_function() -> except StopIteration as ex: (Pdb) step > (9)test_function() -> if ex.value != 1: (Pdb) continue finished Nr r r r r %test_pdb_return_command_for_generatorsr<cCsdS)a%Testing no unwindng stack on yield for coroutines for "return" command >>> import asyncio >>> async def test_coro(): ... await asyncio.sleep(0) ... await asyncio.sleep(0) ... await asyncio.sleep(0) >>> async def test_main(): ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() ... await test_coro() >>> def test_function(): ... loop = asyncio.new_event_loop() ... loop.run_until_complete(test_main()) ... loop.close() ... asyncio.set_event_loop_policy(None) ... print("finished") >>> with PdbTestInput(['step', ... 'step', ... 'next', ... 'continue']): ... test_function() > (3)test_main() -> await test_coro() (Pdb) step --Call-- > (1)test_coro() -> async def test_coro(): (Pdb) step > (2)test_coro() -> await asyncio.sleep(0) (Pdb) next > (3)test_coro() -> await asyncio.sleep(0) (Pdb) continue finished Nr r r r r %test_pdb_return_command_for_coroutinesr=cCsdS)aTesting no unwindng stack on yield for generators for "until" command if target breakpoint is not reached >>> def test_gen(): ... yield 0 ... yield 1 ... yield 2 >>> def test_function(): ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() ... for i in test_gen(): ... print(i) ... print("finished") >>> with PdbTestInput(['step', ... 'until 4', ... 'step', ... 'step', ... 'continue']): ... test_function() > (3)test_function() -> for i in test_gen(): (Pdb) step --Call-- > (1)test_gen() -> def test_gen(): (Pdb) until 4 0 1 > (4)test_gen() -> yield 2 (Pdb) step --Return-- > (4)test_gen()->2 -> yield 2 (Pdb) step > (4)test_function() -> print(i) (Pdb) continue 2 finished Nr r r r r $test_pdb_until_command_for_generator"sr>cCsdS)aTesting no unwindng stack for coroutines for "until" command if target breakpoint is not reached >>> import asyncio >>> async def test_coro(): ... print(0) ... await asyncio.sleep(0) ... print(1) ... await asyncio.sleep(0) ... print(2) ... await asyncio.sleep(0) ... print(3) >>> async def test_main(): ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() ... await test_coro() >>> def test_function(): ... loop = asyncio.new_event_loop() ... loop.run_until_complete(test_main()) ... loop.close() ... asyncio.set_event_loop_policy(None) ... print("finished") >>> with PdbTestInput(['step', ... 'until 8', ... 'continue']): ... test_function() > (3)test_main() -> await test_coro() (Pdb) step --Call-- > (1)test_coro() -> async def test_coro(): (Pdb) until 8 0 1 2 > (8)test_coro() -> print(3) (Pdb) continue 3 finished Nr r r r r $test_pdb_until_command_for_coroutineNsr?cCsdS)aThe next command on returning from a generator controlled by a for loop. >>> def test_gen(): ... yield 0 ... return 1 >>> def test_function(): ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() ... for i in test_gen(): ... print('value', i) ... x = 123 >>> reset_Breakpoint() >>> with PdbTestInput(['break test_gen', ... 'continue', ... 'next', ... 'next', ... 'next', ... 'continue']): ... test_function() > (3)test_function() -> for i in test_gen(): (Pdb) break test_gen Breakpoint 1 at :1 (Pdb) continue > (2)test_gen() -> yield 0 (Pdb) next value 0 > (3)test_gen() -> return 1 (Pdb) next Internal StopIteration: 1 > (3)test_function() -> for i in test_gen(): (Pdb) next > (5)test_function() -> x = 123 (Pdb) continue Nr r r r r +test_pdb_next_command_in_generator_for_loop}sr@cCsdS)aThe next command in a generator with a subiterator. >>> def test_subgenerator(): ... yield 0 ... return 1 >>> def test_gen(): ... x = yield from test_subgenerator() ... return x >>> def test_function(): ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() ... for i in test_gen(): ... print('value', i) ... x = 123 >>> with PdbTestInput(['step', ... 'step', ... 'next', ... 'next', ... 'next', ... 'continue']): ... test_function() > (3)test_function() -> for i in test_gen(): (Pdb) step --Call-- > (1)test_gen() -> def test_gen(): (Pdb) step > (2)test_gen() -> x = yield from test_subgenerator() (Pdb) next value 0 > (3)test_gen() -> return x (Pdb) next Internal StopIteration: 1 > (3)test_function() -> for i in test_gen(): (Pdb) next > (5)test_function() -> x = 123 (Pdb) continue Nr r r r r !test_pdb_next_command_subiteratorsrAcCsdS)a(Test for reference leaks when the SIGINT handler is set. >>> def test_function(): ... i = 1 ... while i <= 2: ... sess = pdb.Pdb() ... sess.set_trace(sys._getframe()) ... print('pdb %d: %s' % (i, sess._previous_sigint_handler)) ... i += 1 >>> with PdbTestInput(['continue', ... 'continue']): ... test_function() > (6)test_function() -> print('pdb %d: %s' % (i, sess._previous_sigint_handler)) (Pdb) continue pdb 1: > (5)test_function() -> sess.set_trace(sys._getframe()) (Pdb) continue pdb 2: Nr r r r r test_pdb_issue_20766srBcCsdS)aNecho breakpoints cleared with filename:lineno >>> def test_function(): ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() ... print(1) ... print(2) ... print(3) ... print(4) >>> reset_Breakpoint() >>> with PdbTestInput([ # doctest: +NORMALIZE_WHITESPACE ... 'break 3', ... 'clear :3', ... 'continue' ... ]): ... test_function() > (3)test_function() -> print(1) (Pdb) break 3 Breakpoint 1 at :3 (Pdb) clear :3 Deleted breakpoint 1 at :3 (Pdb) continue 1 2 3 4 Nr r r r r test_pdb_issue_43318srCc@seZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Z e!j"d=d>Z#d?d@Z$dAS)B PdbTestCasecCsttjdSrrunlinkTESTFNrr r r tearDown szPdbTestCase.tearDowncCs|tjdtjddg|}tj|tjtjtjit j ddid$}| t |\}}Wdn1sp0Y|ot|}|ot|}||fS)N __pycache__-mr1PYTHONIOENCODINGutf-8stdoutrstderrenv) addCleanuprrmtreer executable subprocessPopenPIPESTDOUTosenviron communicatestrencodebytesdecode)rZpdb_argscommandscmdprocrNrOr r r _run_pdbs2zPdbTestCase._run_pdbcCsZd}t|d }|t|Wdn1s40Y|tj|||g|S)z3Run 'script' lines with pdb and the pdb 'commands'.main.pywN)openwritetextwrapdedentrQrrFrb)rscriptr_filenamefr r r run_pdb_scripts  .zPdbTestCase.run_pdb_scriptcCsd|_t|j|jd}|jd}t|jt|d}Wdn1sR0Yt|d }|t|Wdn1s0Y| tj|j| d|jg|S)z(Runs the script code as part of a modulet_main /__main__.py /__init__.pyrdNrJ) module_namerrRrXmkdirrerfrgrhrQrb)rrir_ main_file init_filerkr r r run_pdb_module's      .zPdbTestCase.run_pdb_modulecCslttjd}||Wdn1s,0Y|s>dn|dtj|df}||t|tjdS)Nwbrr )rerrGrf assertEqualr1Z find_function)rZ file_content func_nameexpectedrkr r r _assert_find_function5s(z!PdbTestCase._assert_find_functioncCs|ddddS)NZfoo)ryrr r r test_find_function_empty_file>sz)PdbTestCase.test_find_function_empty_filecCs|ddddS)Nu@def foo(): pass def bœr(): pass def quux(): pass bœr)r|ryr\rr r r test_find_function_foundAs  z$PdbTestCase.test_find_function_foundcCs|dddddS)NuV# coding: iso-8859-15 def foo(): pass def bœr(): pass def quux(): pass z iso-8859-15r|)r|r~rr r r -test_find_function_found_with_encoding_cookieQs  z9PdbTestCase.test_find_function_found_with_encoding_cookiecCs|tjddddS)Nudef bœr(): pass r|)r|r )rycodecsBOM_UTF8r\rr r r !test_find_function_found_with_bombs  z-PdbTestCase.test_find_function_found_with_bomcCsttjd}|dWdn1s,0Ytjddtjg}tj|tjtjtj d}| |j j | d\}}|d|ddS) Nrusprint("testing my pdb") rJr1rNrrOsquit s SyntaxErrorz0Got a syntax error running test script under PDB)rerrGrfrrSrTrUrVrWrQrNcloserZ assertNotInrrkr`rarNrOr r r test_issue7964ls(zPdbTestCase.test_issue7964cCsd}d}d}tdd }|t|Wdn1s<0Y|tjd|||\}}|t dd| DddS) Nz from bar import bar def foo(): bar() def nope(): pass def foobar(): foo() nope() foobar() z from bar import bar break bar continue step step quit z5 def bar(): pass zbar.pyrdcss|]}d|vVqdS)zmain.py(5)foo()->NoneNr .0lr r r rzz.PdbTestCase.test_issue13183..z+Fail to step into the caller after a return) rerfrgrhrQrrFrl assertTrueany splitlines)rrir_ZbarrkrNrOr r r test_issue13183{s .zPdbTestCase.test_issue13183cCsttjd&}|tddWdn1s80Ytjdtjg}t j |t j t j t j it jddid}||jj|d\}}|d |d dS) Nrua import threading import pdb def start_pdb(): pdb.Pdb(readrc=False).set_trace() x = 1 y = 1 t = threading.Thread(target=start_pdb) t.start()ascii-urKrLrMscont Error*Got an error running test script under PDBrerrGrfrgrhr\rrSrTrUrVrWrXrYrQrNrrZrrr r r test_issue13120s  $ zPdbTestCase.test_issue13120cCsttjd&}|tddWdn1s80Ytjdtjg}t j |t j t j t j it jddid}||jj|d\}}|d |d dS) Nrua import threading import pdb evt = threading.Event() def start_pdb(): evt.wait() pdb.Pdb(readrc=False).set_trace() t = threading.Thread(target=start_pdb) t.start() pdb.Pdb(readrc=False).set_trace() evt.set() t.join()rrrKrLrMs cont cont rrrrr r r test_issue36250s $zPdbTestCase.test_issue36250cCs6d}d}d}|||\}}|||d||dS)Nz def f: pass z SyntaxError:zE Expected: {} Got: {} Fail to handle a syntax error in the debuggee.)rlassertInformat)rrir_rxrNrOr r r test_issue16180szPdbTestCase.test_issue16180cCsLd}d}|||\}}ddd|D}||d||ddS)Nzprint('hello')z[ continue run a b c run d e f quit  cSsg|] }|qSr )strip)rxr r r rzz/PdbTestCase.test_issue26053..z#Restarting .* with arguments: a b cz#Restarting .* with arguments: d e f)rljoinrZ assertRegex)rrir_rNrOresr r r test_issue26053s  zPdbTestCase.test_issue26053c Cs@td}tjdd}z ttdd}|dWdn1sP0Ytdd}||Wdn1s0Yt j dg}t j |t j t j t j d}|*|d\}}|d |Wdn1s0YWdn1s0YW|dur<|tjd<n|dur:|tjd<0dS) Nz_ import pdb; pdb.Pdb(readrc=False).set_trace() print('hello') HOME.pdbrcrdzinvalid rcrsq s(NameError: name 'invalid' is not defined)rgrhrXrYpoprtemp_cwdrerfrrSrTrUrVrZr)rri save_homerkr`rarNrOr r r test_readrc_kwargs0   ( ( D  zPdbTestCase.test_readrc_kwargc Cstjdd}t}tdtj|d}|tjj_ z`t |d}| dWdn1sf0Y| t jddW|dur|tjd<n|dur|tjd<0Wdn1s0YWdn1s0YdS)Nrzos.path.expanduserrrdinvalidr)rXrYrrtemp_dirrpathr expanduserZ return_valuererfrvr1r2ZrcLines)rrrZrc_pathrkr r r test_readrc_homedirs  ( zPdbTestCase.test_readrc_homedircCsxt}d}t@}|td||ttjdtj|dWdn1sV0Y|| |ddS)Nz"Nobody expects... blah, blah, blahz sys.stdout set_trace)headerr) rr enter_contextrobjectr1r2rrvgetvalue)rrNrZ resourcesr r r test_headers*zPdbTestCase.test_headercCs:d}d}|||\}}|tdd|D|dS)Nzprint("SUCCESS")/ continue quit css|]}d|vVqdSSUCCESSNr rr r r r/rzz.PdbTestCase.test_run_module..rtrrrrrir_rNrOr r r test_run_module(szPdbTestCase.test_run_modulecCs:d}d}|||\}}|tdd|D|dS)NzQ if __name__ == '__main__': print("SUCCESS") rcss|]}d|vVqdSrr rr r r r;rzz9PdbTestCase.test_module_is_run_as_main..rrr r r test_module_is_run_as_main1sz&PdbTestCase.test_module_is_run_as_maincCsXd}d}|||\}}|tdd|D||tdd|D|dS)Nz{ if __name__ == '__main__': pass print("SUCCESS") pass z* b 3 quit css|]}d|vVqdS)zBreakpoint 1 atNr rr r r rIrzz.PdbTestCase.test_breakpoint..css|]}d|vVqdSrr rr r r rJrz)rtrrrallrr r r test_breakpoint=s zPdbTestCase.test_breakpointcCs2d}|ddg|\}}|tj|dddS)Nz( c quit rJr1 r)rbrr1Z_usagereplace)rr_rNrOr r r test_run_pdb_with_pdbLs  z!PdbTestCase.test_run_pdb_with_pdbcCsd}t||d}t|t|dWdn1s@0Y|tj||d|gd\}}|d|dS)NrmrordrJrz,ImportError: No module named t_main.__main__) rrRrXrqrerQrbrr)rrprsrNrOr r r test_module_without_a_mainWs   z&PdbTestCase.test_module_without_a_maincCsd}d}t||d|}t|t|ddWdn1sL0Y|tj||d|ddgd\}}|d |dS) NZt_pkgrm/rordrJ.rz;'t_pkg.t_main' is a package and cannot be directly executed) rrRrXmakedirsrerQrbrr)rZpkg_namerpmodpathrNrOr r r test_package_without_a_maincs   z'PdbTestCase.test_package_without_a_maincCs:d}d}|||\}}|tdd|D|dS)NzY #This is a comment, on line 2 print("SUCCESS") z quit css|]}d|vVqdS)z__main__.py(4)()Nr rr r r r{sz=PdbTestCase.test_blocks_at_first_code_line..rrr r r test_blocks_at_first_code_lineqs z*PdbTestCase.test_blocks_at_first_code_linecCsnd|_t|j|jd}|jd}|jd}|tj|jt|jt|d }|t dWdn1s|0Yt|d }|t dWdn1s0Yt|d }|t dWdn1s0Yd }| d |jg|\}}| t d d | D|| t d d | D| t dd | DdS)Nrmrnro /module.pyrd6 top_var = "VAR from top" z from . import top_var from .module import var from . import module pass # We'll stop here and print the vars zY var = "VAR from module" var2 = "second var" zz b 5 c p top_var p var p module.var2 quit rJcss|]}d|vVqdSzVAR from moduleNr rr r r rrzz4PdbTestCase.test_relative_imports..css|]}d|vVqdS)z VAR from topNr rr r r rrzcss|]}d|vVqdS)z second varNr rr r r rrzrprrRrQrXrqrerfrgrhrbrrrrrrrsZ module_filerkr_rN_r r r test_relative_imports~s$      . . .z!PdbTestCase.test_relative_importscCs:d|_t|j|jd}|jd}|jd}|tj|jt|jt|d }|t dWdn1s|0Yt|d }|t dWdn1s0Yt|d }|t dWdn1s0Yd }| d |jd g|\}}| t d d | D|dS)Nrmz /runme.pyrorrdrzl from . import module pass # We'll stop here and print the vars z5 var = "VAR from module" zQ b 3 c p module.var quit rJz.runmecss|]}d|vVqdSrr rr r r rrzzDPdbTestCase.test_relative_imports_on_plain_module..rrr r r %test_relative_imports_on_plain_modules       . . .z1PdbTestCase.test_relative_imports_on_plain_modulecCsBdgd}|d|d\}}||ddgddS)Nr)zprint(z debug print(zdebug doesnotexistcrr ) z3(Pdb) *** SyntaxError: unexpected EOF while parsing!(Pdb) ENTERING RECURSIVE DEBUGGERz-*** SyntaxError: unexpected EOF while parsingLEAVING RECURSIVE DEBUGGERrz> (1)()z9((Pdb)) *** NameError: name 'doesnotexist' is not definedr(Pdb) rrlrvr)rr_rNrr r r test_errors_in_commandsz"PdbTestCase.test_errors_in_commandcs$fdd}|dd|dddS)z.do_run handles exceptions from parsing its argcsVdd|dg}d|d\}}|dddd|d|d gdS) Nrzrun qpassr z-> passz(Pdb) *** Cannot run z: rr)Zbad_argmsgr_rNrrr r checksz*PdbTestCase.test_issue34266..check\zNo escaped character"zNo closing quotationNr )rrr rr test_issue34266s zPdbTestCase.test_issue34266cCsxtd}d}tN}dtj|}|||\}}|| dd d|Wdn1sj0YdS)zkWhen running `python foo.py` sys.path[0] is an absolute path. `python -m pdb foo.py` should behave the sameQ import sys print('sys.path[0] is', sys.path[0]) c q(Pdb) sys.path[0] is rrN) rgrhrrrXrrealpathrlrvsplitrstrip)rrir_cwdrxrNrOr r r test_issue42384s   zPdbTestCase.test_issue42384c Cstd}d}t}tj|}tj|d}tj|d}d|}t|t tj|dd}| |Wdn1s0Yt|t tj|dtj|d| tjddg|\}} | |d d d |Wdn1s 0YdS) ziWhen running `python foo.py` sys.path[0] resolves symlinks. `python -m pdb foo.py` should behave the samerrdir_onedir_tworfoo.pyrdNrrr)rgrhrrrXrrrrqrerfsymlinkrbrvrr) rrir_rrrrxrkrNrOr r r test_issue42384_symlinks     (  z#PdbTestCase.test_issue42384_symlinkc Cs t}tdd$}td}||Wdn1s>0Ytj|d}t |t tj|dtj|d}t|d}|dWdn1s0Y| dgd\}}d}| | dd  d |Wdn1s0YdS) Nrrdz print('The correct file was executed') import os os.chdir("subdir") subdirz$print("The wrong file was executed")zc c qz#(Pdb) The correct file was executedrr)rrrergrhrfrXrrrqrbrvrr) rrrksrZ wrong_filerNrOrxr r r test_issue42383s   (  (zPdbTestCase.test_issue42383N)%rrr rHrbrlrtryr{rrrrrrrrrrrrrrrrrrrrrrrrrZskip_unless_symlinkrrr r r r rD sB  $         % rDc@s4eZdZddZddZddZddZd d Zd S) ChecklineTestscCs tdSr) linecache clearcacherr r r setUp*szChecklineTests.setUpcCsttjdSrrErr r r rH-szChecklineTests.tearDowncCsXttjd}|dWdn1s,0Yt}||tjdddSNrdz print(123)r )rerrGrfr1r2rv checklinerrkdbr r r test_checkline_before_debugging0s(z.ChecklineTests.test_checkline_before_debuggingcCs`ttjd}|dWdn1s,0Yt}|||tjdddSr) rerrGrfr1r2resetrvrrr r r test_checkline_after_reset6s (z)ChecklineTests.test_checkline_after_resetcCstd}ttjd}||Wdn1s60Yt|d}tt :t }t |D]}| |tj|qlWdn1s0YdS)Nz\ # Comment """ docstring """ ''' docstring ''' rdr)rgrhrerrGrflenrrrr1r2rangeZ assertFalser)rrrkZ num_linesrlinenor r r test_checkline_is_not_executable=s (  z/ChecklineTests.test_checkline_is_not_executableN)rrr rrHrrrr r r r r)s rcGs2ddlm}ttttt|g}t|S)Nr)test_pdb) testrunittestZ makeSuiterDrdoctestZ DocTestSuiteZ TestSuite)argsrZsuitesr r r load_testsNs  r__main__)?rrXr1rtypesrrrTrgr contextlibrriorrrZtest.test_doctestrZ unittest.mockrZbdbrr rrr"r#r$r%r&r)r*r+r,r- ModuleTypemodexec__dict__r.r/r5r6r7r8r9r:r;r<r=r>r?r@rArBrCZTestCaserDrrrmainr r r r sp     k_*>  +*@;8=7*,/*/!%