blob: 74253b338f66161d28a0b19c969bf986dcdacbb2 [file] [log] [blame]
Georg Brandl46b9afc2010-07-30 09:14:20 +00001# A test suite for pdb; not very comprehensive at the moment.
Martin v. Löwis67880cc2012-05-02 07:41:22 +02002
Andrew Svetlovf0efea02013-03-18 10:09:50 -07003import doctest
Georg Brandl6cccb862010-07-30 14:16:43 +00004import pdb
Georg Brandl243ad662009-05-05 09:00:19 +00005import sys
Brett Cannon9529fbf2013-06-15 17:11:25 -04006import types
Georg Brandl6cccb862010-07-30 14:16:43 +00007import unittest
8import subprocess
Senthil Kumaran42d70812012-05-01 10:07:49 +08009import textwrap
Georg Brandl243ad662009-05-05 09:00:19 +000010
11from test import support
12# This little helper class is essential for testing pdb under doctest.
13from test.test_doctest import _FakeInput
14
15
Georg Brandl9fa2e022009-09-16 16:40:45 +000016class PdbTestInput(object):
17 """Context manager that makes testing Pdb in doctests easier."""
18
19 def __init__(self, input):
20 self.input = input
21
22 def __enter__(self):
23 self.real_stdin = sys.stdin
24 sys.stdin = _FakeInput(self.input)
Brett Cannon31f59292011-02-21 19:29:56 +000025 self.orig_trace = sys.gettrace() if hasattr(sys, 'gettrace') else None
Georg Brandl9fa2e022009-09-16 16:40:45 +000026
27 def __exit__(self, *exc):
28 sys.stdin = self.real_stdin
Brett Cannon31f59292011-02-21 19:29:56 +000029 if self.orig_trace:
30 sys.settrace(self.orig_trace)
Georg Brandl9fa2e022009-09-16 16:40:45 +000031
32
33def test_pdb_displayhook():
34 """This tests the custom displayhook for pdb.
35
36 >>> def test_function(foo, bar):
Georg Brandl34748cd2010-12-04 17:11:36 +000037 ... import pdb; pdb.Pdb(nosigint=True).set_trace()
Georg Brandl9fa2e022009-09-16 16:40:45 +000038 ... pass
39
40 >>> with PdbTestInput([
41 ... 'foo',
42 ... 'bar',
43 ... 'for i in range(5): print(i)',
44 ... 'continue',
45 ... ]):
46 ... test_function(1, None)
47 > <doctest test.test_pdb.test_pdb_displayhook[0]>(3)test_function()
48 -> pass
49 (Pdb) foo
50 1
51 (Pdb) bar
52 (Pdb) for i in range(5): print(i)
53 0
54 1
55 2
56 3
57 4
58 (Pdb) continue
59 """
60
61
Georg Brandl0d089622010-07-30 16:00:46 +000062def test_pdb_basic_commands():
63 """Test the basic commands of pdb.
64
65 >>> def test_function_2(foo, bar='default'):
66 ... print(foo)
67 ... for i in range(5):
68 ... print(i)
69 ... print(bar)
70 ... for i in range(10):
71 ... never_executed
72 ... print('after for')
73 ... print('...')
74 ... return foo.upper()
75
76 >>> def test_function():
Georg Brandl34748cd2010-12-04 17:11:36 +000077 ... import pdb; pdb.Pdb(nosigint=True).set_trace()
Georg Brandl0d089622010-07-30 16:00:46 +000078 ... ret = test_function_2('baz')
79 ... print(ret)
80
81 >>> with PdbTestInput([ # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
82 ... 'step', # entering the function call
83 ... 'args', # display function args
84 ... 'list', # list function source
85 ... 'bt', # display backtrace
86 ... 'up', # step up to test_function()
87 ... 'down', # step down to test_function_2() again
88 ... 'next', # stepping to print(foo)
89 ... 'next', # stepping to the for loop
90 ... 'step', # stepping into the for loop
91 ... 'until', # continuing until out of the for loop
92 ... 'next', # executing the print(bar)
93 ... 'jump 8', # jump over second for loop
94 ... 'return', # return out of function
95 ... 'retval', # display return value
96 ... 'continue',
97 ... ]):
98 ... test_function()
99 > <doctest test.test_pdb.test_pdb_basic_commands[1]>(3)test_function()
100 -> ret = test_function_2('baz')
101 (Pdb) step
102 --Call--
103 > <doctest test.test_pdb.test_pdb_basic_commands[0]>(1)test_function_2()
104 -> def test_function_2(foo, bar='default'):
105 (Pdb) args
106 foo = 'baz'
107 bar = 'default'
108 (Pdb) list
109 1 -> def test_function_2(foo, bar='default'):
110 2 print(foo)
111 3 for i in range(5):
112 4 print(i)
113 5 print(bar)
114 6 for i in range(10):
115 7 never_executed
116 8 print('after for')
117 9 print('...')
118 10 return foo.upper()
119 [EOF]
120 (Pdb) bt
121 ...
122 <doctest test.test_pdb.test_pdb_basic_commands[2]>(18)<module>()
123 -> test_function()
124 <doctest test.test_pdb.test_pdb_basic_commands[1]>(3)test_function()
125 -> ret = test_function_2('baz')
126 > <doctest test.test_pdb.test_pdb_basic_commands[0]>(1)test_function_2()
127 -> def test_function_2(foo, bar='default'):
128 (Pdb) up
129 > <doctest test.test_pdb.test_pdb_basic_commands[1]>(3)test_function()
130 -> ret = test_function_2('baz')
131 (Pdb) down
132 > <doctest test.test_pdb.test_pdb_basic_commands[0]>(1)test_function_2()
133 -> def test_function_2(foo, bar='default'):
134 (Pdb) next
135 > <doctest test.test_pdb.test_pdb_basic_commands[0]>(2)test_function_2()
136 -> print(foo)
137 (Pdb) next
138 baz
139 > <doctest test.test_pdb.test_pdb_basic_commands[0]>(3)test_function_2()
140 -> for i in range(5):
141 (Pdb) step
142 > <doctest test.test_pdb.test_pdb_basic_commands[0]>(4)test_function_2()
143 -> print(i)
144 (Pdb) until
145 0
146 1
147 2
148 3
149 4
150 > <doctest test.test_pdb.test_pdb_basic_commands[0]>(5)test_function_2()
151 -> print(bar)
152 (Pdb) next
153 default
154 > <doctest test.test_pdb.test_pdb_basic_commands[0]>(6)test_function_2()
155 -> for i in range(10):
156 (Pdb) jump 8
157 > <doctest test.test_pdb.test_pdb_basic_commands[0]>(8)test_function_2()
158 -> print('after for')
159 (Pdb) return
160 after for
161 ...
162 --Return--
163 > <doctest test.test_pdb.test_pdb_basic_commands[0]>(10)test_function_2()->'BAZ'
164 -> return foo.upper()
165 (Pdb) retval
166 'BAZ'
167 (Pdb) continue
168 BAZ
169 """
170
171
172def test_pdb_breakpoint_commands():
173 """Test basic commands related to breakpoints.
174
175 >>> def test_function():
Georg Brandl34748cd2010-12-04 17:11:36 +0000176 ... import pdb; pdb.Pdb(nosigint=True).set_trace()
Georg Brandl0d089622010-07-30 16:00:46 +0000177 ... print(1)
178 ... print(2)
179 ... print(3)
180 ... print(4)
181
182 First, need to clear bdb state that might be left over from previous tests.
183 Otherwise, the new breakpoints might get assigned different numbers.
184
185 >>> from bdb import Breakpoint
186 >>> Breakpoint.next = 1
187 >>> Breakpoint.bplist = {}
188 >>> Breakpoint.bpbynumber = [None]
189
190 Now test the breakpoint commands. NORMALIZE_WHITESPACE is needed because
191 the breakpoint list outputs a tab for the "stop only" and "ignore next"
192 lines, which we don't want to put in here.
193
194 >>> with PdbTestInput([ # doctest: +NORMALIZE_WHITESPACE
195 ... 'break 3',
196 ... 'disable 1',
197 ... 'ignore 1 10',
198 ... 'condition 1 1 < 2',
199 ... 'break 4',
Senthil Kumaran6f107042010-11-29 11:54:17 +0000200 ... 'break 4',
201 ... 'break',
202 ... 'clear 3',
Georg Brandl0d089622010-07-30 16:00:46 +0000203 ... 'break',
204 ... 'condition 1',
205 ... 'enable 1',
206 ... 'clear 1',
207 ... 'commands 2',
R David Murray78d692f2013-10-10 17:23:26 -0400208 ... 'p "42"',
209 ... 'print("42", 7*6)', # Issue 18764 (not about breakpoints)
Georg Brandl0d089622010-07-30 16:00:46 +0000210 ... 'end',
211 ... 'continue', # will stop at breakpoint 2 (line 4)
212 ... 'clear', # clear all!
213 ... 'y',
214 ... 'tbreak 5',
215 ... 'continue', # will stop at temporary breakpoint
216 ... 'break', # make sure breakpoint is gone
217 ... 'continue',
218 ... ]):
219 ... test_function()
220 > <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(3)test_function()
221 -> print(1)
222 (Pdb) break 3
223 Breakpoint 1 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
224 (Pdb) disable 1
225 Disabled breakpoint 1 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
226 (Pdb) ignore 1 10
227 Will ignore next 10 crossings of breakpoint 1.
228 (Pdb) condition 1 1 < 2
229 New condition set for breakpoint 1.
230 (Pdb) break 4
231 Breakpoint 2 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
Senthil Kumaran6f107042010-11-29 11:54:17 +0000232 (Pdb) break 4
233 Breakpoint 3 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
234 (Pdb) break
235 Num Type Disp Enb Where
236 1 breakpoint keep no at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
237 stop only if 1 < 2
238 ignore next 10 hits
239 2 breakpoint keep yes at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
240 3 breakpoint keep yes at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
241 (Pdb) clear 3
242 Deleted breakpoint 3 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
Georg Brandl0d089622010-07-30 16:00:46 +0000243 (Pdb) break
244 Num Type Disp Enb Where
245 1 breakpoint keep no at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
246 stop only if 1 < 2
247 ignore next 10 hits
248 2 breakpoint keep yes at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
249 (Pdb) condition 1
250 Breakpoint 1 is now unconditional.
251 (Pdb) enable 1
252 Enabled breakpoint 1 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
253 (Pdb) clear 1
254 Deleted breakpoint 1 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
255 (Pdb) commands 2
R David Murray78d692f2013-10-10 17:23:26 -0400256 (com) p "42"
257 (com) print("42", 7*6)
Georg Brandl0d089622010-07-30 16:00:46 +0000258 (com) end
259 (Pdb) continue
260 1
R David Murray78d692f2013-10-10 17:23:26 -0400261 '42'
262 42 42
Georg Brandl0d089622010-07-30 16:00:46 +0000263 > <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(4)test_function()
264 -> print(2)
265 (Pdb) clear
266 Clear all breaks? y
267 Deleted breakpoint 2 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
268 (Pdb) tbreak 5
Senthil Kumaran6f107042010-11-29 11:54:17 +0000269 Breakpoint 4 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:5
Georg Brandl0d089622010-07-30 16:00:46 +0000270 (Pdb) continue
271 2
Senthil Kumaran6f107042010-11-29 11:54:17 +0000272 Deleted breakpoint 4 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:5
Georg Brandl0d089622010-07-30 16:00:46 +0000273 > <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(5)test_function()
274 -> print(3)
275 (Pdb) break
276 (Pdb) continue
277 3
278 4
279 """
280
281
Georg Brandle59ca2a2010-07-30 17:04:28 +0000282def do_nothing():
283 pass
284
285def do_something():
286 print(42)
287
288def test_list_commands():
289 """Test the list and source commands of pdb.
290
291 >>> def test_function_2(foo):
Georg Brandla8fbc6a2010-07-31 11:52:46 +0000292 ... import test.test_pdb
293 ... test.test_pdb.do_nothing()
Georg Brandle59ca2a2010-07-30 17:04:28 +0000294 ... 'some...'
295 ... 'more...'
296 ... 'code...'
297 ... 'to...'
298 ... 'make...'
299 ... 'a...'
300 ... 'long...'
301 ... 'listing...'
302 ... 'useful...'
303 ... '...'
304 ... '...'
305 ... return foo
306
307 >>> def test_function():
Georg Brandl34748cd2010-12-04 17:11:36 +0000308 ... import pdb; pdb.Pdb(nosigint=True).set_trace()
Georg Brandle59ca2a2010-07-30 17:04:28 +0000309 ... ret = test_function_2('baz')
310
311 >>> with PdbTestInput([ # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
312 ... 'list', # list first function
313 ... 'step', # step into second function
314 ... 'list', # list second function
315 ... 'list', # continue listing to EOF
316 ... 'list 1,3', # list specific lines
317 ... 'list x', # invalid argument
318 ... 'next', # step to import
319 ... 'next', # step over import
320 ... 'step', # step into do_nothing
321 ... 'longlist', # list all lines
322 ... 'source do_something', # list all lines of function
Georg Brandlcdf66a92010-07-30 18:15:16 +0000323 ... 'source fooxxx', # something that doesn't exit
Georg Brandle59ca2a2010-07-30 17:04:28 +0000324 ... 'continue',
325 ... ]):
326 ... test_function()
327 > <doctest test.test_pdb.test_list_commands[1]>(3)test_function()
328 -> ret = test_function_2('baz')
329 (Pdb) list
330 1 def test_function():
Georg Brandl34748cd2010-12-04 17:11:36 +0000331 2 import pdb; pdb.Pdb(nosigint=True).set_trace()
Georg Brandle59ca2a2010-07-30 17:04:28 +0000332 3 -> ret = test_function_2('baz')
333 [EOF]
334 (Pdb) step
335 --Call--
336 > <doctest test.test_pdb.test_list_commands[0]>(1)test_function_2()
337 -> def test_function_2(foo):
338 (Pdb) list
339 1 -> def test_function_2(foo):
Georg Brandla8fbc6a2010-07-31 11:52:46 +0000340 2 import test.test_pdb
341 3 test.test_pdb.do_nothing()
Georg Brandle59ca2a2010-07-30 17:04:28 +0000342 4 'some...'
343 5 'more...'
344 6 'code...'
345 7 'to...'
346 8 'make...'
347 9 'a...'
348 10 'long...'
349 11 'listing...'
350 (Pdb) list
351 12 'useful...'
352 13 '...'
353 14 '...'
354 15 return foo
355 [EOF]
356 (Pdb) list 1,3
357 1 -> def test_function_2(foo):
Georg Brandla8fbc6a2010-07-31 11:52:46 +0000358 2 import test.test_pdb
359 3 test.test_pdb.do_nothing()
Georg Brandle59ca2a2010-07-30 17:04:28 +0000360 (Pdb) list x
361 *** ...
362 (Pdb) next
363 > <doctest test.test_pdb.test_list_commands[0]>(2)test_function_2()
Georg Brandla8fbc6a2010-07-31 11:52:46 +0000364 -> import test.test_pdb
Georg Brandle59ca2a2010-07-30 17:04:28 +0000365 (Pdb) next
366 > <doctest test.test_pdb.test_list_commands[0]>(3)test_function_2()
Georg Brandla8fbc6a2010-07-31 11:52:46 +0000367 -> test.test_pdb.do_nothing()
Georg Brandle59ca2a2010-07-30 17:04:28 +0000368 (Pdb) step
369 --Call--
Georg Brandle1e8df12010-07-31 08:14:16 +0000370 > ...test_pdb.py(...)do_nothing()
Georg Brandle59ca2a2010-07-30 17:04:28 +0000371 -> def do_nothing():
372 (Pdb) longlist
373 ... -> def do_nothing():
374 ... pass
375 (Pdb) source do_something
376 ... def do_something():
377 ... print(42)
Georg Brandlcdf66a92010-07-30 18:15:16 +0000378 (Pdb) source fooxxx
379 *** ...
Georg Brandle59ca2a2010-07-30 17:04:28 +0000380 (Pdb) continue
381 """
382
383
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000384def test_post_mortem():
385 """Test post mortem traceback debugging.
386
387 >>> def test_function_2():
388 ... try:
389 ... 1/0
390 ... finally:
391 ... print('Exception!')
392
393 >>> def test_function():
Georg Brandl34748cd2010-12-04 17:11:36 +0000394 ... import pdb; pdb.Pdb(nosigint=True).set_trace()
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000395 ... test_function_2()
396 ... print('Not reached.')
397
398 >>> with PdbTestInput([ # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
399 ... 'next', # step over exception-raising call
400 ... 'bt', # get a backtrace
401 ... 'list', # list code of test_function()
402 ... 'down', # step into test_function_2()
403 ... 'list', # list code of test_function_2()
404 ... 'continue',
405 ... ]):
406 ... try:
407 ... test_function()
408 ... except ZeroDivisionError:
409 ... print('Correctly reraised.')
410 > <doctest test.test_pdb.test_post_mortem[1]>(3)test_function()
411 -> test_function_2()
412 (Pdb) next
413 Exception!
414 ZeroDivisionError: division by zero
415 > <doctest test.test_pdb.test_post_mortem[1]>(3)test_function()
416 -> test_function_2()
417 (Pdb) bt
418 ...
419 <doctest test.test_pdb.test_post_mortem[2]>(10)<module>()
420 -> test_function()
421 > <doctest test.test_pdb.test_post_mortem[1]>(3)test_function()
422 -> test_function_2()
423 <doctest test.test_pdb.test_post_mortem[0]>(3)test_function_2()
424 -> 1/0
425 (Pdb) list
426 1 def test_function():
Georg Brandl34748cd2010-12-04 17:11:36 +0000427 2 import pdb; pdb.Pdb(nosigint=True).set_trace()
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000428 3 -> test_function_2()
429 4 print('Not reached.')
430 [EOF]
431 (Pdb) down
432 > <doctest test.test_pdb.test_post_mortem[0]>(3)test_function_2()
433 -> 1/0
434 (Pdb) list
435 1 def test_function_2():
436 2 try:
437 3 >> 1/0
438 4 finally:
439 5 -> print('Exception!')
440 [EOF]
441 (Pdb) continue
442 Correctly reraised.
443 """
444
445
Georg Brandl243ad662009-05-05 09:00:19 +0000446def test_pdb_skip_modules():
447 """This illustrates the simple case of module skipping.
448
449 >>> def skip_module():
450 ... import string
Georg Brandl34748cd2010-12-04 17:11:36 +0000451 ... import pdb; pdb.Pdb(skip=['stri*'], nosigint=True).set_trace()
Georg Brandl243ad662009-05-05 09:00:19 +0000452 ... string.capwords('FOO')
Georg Brandl243ad662009-05-05 09:00:19 +0000453
Georg Brandl9fa2e022009-09-16 16:40:45 +0000454 >>> with PdbTestInput([
455 ... 'step',
456 ... 'continue',
457 ... ]):
Georg Brandl243ad662009-05-05 09:00:19 +0000458 ... skip_module()
Georg Brandl243ad662009-05-05 09:00:19 +0000459 > <doctest test.test_pdb.test_pdb_skip_modules[0]>(4)skip_module()
460 -> string.capwords('FOO')
461 (Pdb) step
462 --Return--
463 > <doctest test.test_pdb.test_pdb_skip_modules[0]>(4)skip_module()->None
464 -> string.capwords('FOO')
465 (Pdb) continue
Georg Brandl9fa2e022009-09-16 16:40:45 +0000466 """
Georg Brandl243ad662009-05-05 09:00:19 +0000467
468
469# Module for testing skipping of module that makes a callback
Brett Cannon9529fbf2013-06-15 17:11:25 -0400470mod = types.ModuleType('module_to_skip')
Georg Brandl243ad662009-05-05 09:00:19 +0000471exec('def foo_pony(callback): x = 1; callback(); return None', mod.__dict__)
472
473
474def test_pdb_skip_modules_with_callback():
475 """This illustrates skipping of modules that call into other code.
476
477 >>> def skip_module():
478 ... def callback():
479 ... return None
Georg Brandl34748cd2010-12-04 17:11:36 +0000480 ... import pdb; pdb.Pdb(skip=['module_to_skip*'], nosigint=True).set_trace()
Georg Brandl243ad662009-05-05 09:00:19 +0000481 ... mod.foo_pony(callback)
Georg Brandl243ad662009-05-05 09:00:19 +0000482
Georg Brandl9fa2e022009-09-16 16:40:45 +0000483 >>> with PdbTestInput([
484 ... 'step',
485 ... 'step',
486 ... 'step',
487 ... 'step',
488 ... 'step',
489 ... 'continue',
490 ... ]):
Georg Brandl243ad662009-05-05 09:00:19 +0000491 ... skip_module()
Georg Brandl9fa2e022009-09-16 16:40:45 +0000492 ... pass # provides something to "step" to
Georg Brandl243ad662009-05-05 09:00:19 +0000493 > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(5)skip_module()
494 -> mod.foo_pony(callback)
495 (Pdb) step
496 --Call--
497 > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(2)callback()
498 -> def callback():
499 (Pdb) step
500 > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(3)callback()
501 -> return None
502 (Pdb) step
503 --Return--
504 > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(3)callback()->None
505 -> return None
506 (Pdb) step
507 --Return--
508 > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(5)skip_module()->None
509 -> mod.foo_pony(callback)
510 (Pdb) step
Georg Brandl9fa2e022009-09-16 16:40:45 +0000511 > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[1]>(10)<module>()
512 -> pass # provides something to "step" to
Georg Brandl243ad662009-05-05 09:00:19 +0000513 (Pdb) continue
Georg Brandl9fa2e022009-09-16 16:40:45 +0000514 """
Georg Brandl243ad662009-05-05 09:00:19 +0000515
516
Georg Brandl3f940892010-07-30 10:29:19 +0000517def test_pdb_continue_in_bottomframe():
518 """Test that "continue" and "next" work properly in bottom frame (issue #5294).
519
520 >>> def test_function():
Georg Brandl34748cd2010-12-04 17:11:36 +0000521 ... import pdb, sys; inst = pdb.Pdb(nosigint=True)
Georg Brandl3f940892010-07-30 10:29:19 +0000522 ... inst.set_trace()
523 ... inst.botframe = sys._getframe() # hackery to get the right botframe
524 ... print(1)
525 ... print(2)
526 ... print(3)
527 ... print(4)
528
Georg Brandl7410dd12010-07-30 12:01:20 +0000529 >>> with PdbTestInput([ # doctest: +ELLIPSIS
Georg Brandl3f940892010-07-30 10:29:19 +0000530 ... 'next',
531 ... 'break 7',
532 ... 'continue',
533 ... 'next',
534 ... 'continue',
535 ... 'continue',
536 ... ]):
537 ... test_function()
538 > <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(4)test_function()
539 -> inst.botframe = sys._getframe() # hackery to get the right botframe
540 (Pdb) next
541 > <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(5)test_function()
542 -> print(1)
543 (Pdb) break 7
Georg Brandl7410dd12010-07-30 12:01:20 +0000544 Breakpoint ... at <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>:7
Georg Brandl3f940892010-07-30 10:29:19 +0000545 (Pdb) continue
546 1
547 2
548 > <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(7)test_function()
549 -> print(3)
550 (Pdb) next
551 3
552 > <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(8)test_function()
553 -> print(4)
554 (Pdb) continue
555 4
556 """
557
558
Georg Brandl46b9afc2010-07-30 09:14:20 +0000559def pdb_invoke(method, arg):
560 """Run pdb.method(arg)."""
Georg Brandl34748cd2010-12-04 17:11:36 +0000561 import pdb
562 getattr(pdb.Pdb(nosigint=True), method)(arg)
Georg Brandl46b9afc2010-07-30 09:14:20 +0000563
564
565def test_pdb_run_with_incorrect_argument():
566 """Testing run and runeval with incorrect first argument.
567
568 >>> pti = PdbTestInput(['continue',])
569 >>> with pti:
570 ... pdb_invoke('run', lambda x: x)
571 Traceback (most recent call last):
572 TypeError: exec() arg 1 must be a string, bytes or code object
573
574 >>> with pti:
575 ... pdb_invoke('runeval', lambda x: x)
576 Traceback (most recent call last):
577 TypeError: eval() arg 1 must be a string, bytes or code object
578 """
579
580
581def test_pdb_run_with_code_object():
582 """Testing run and runeval with code object as a first argument.
583
Georg Brandle1e8df12010-07-31 08:14:16 +0000584 >>> with PdbTestInput(['step','x', 'continue']): # doctest: +ELLIPSIS
Georg Brandl46b9afc2010-07-30 09:14:20 +0000585 ... pdb_invoke('run', compile('x=1', '<string>', 'exec'))
Georg Brandle1e8df12010-07-31 08:14:16 +0000586 > <string>(1)<module>()...
Georg Brandl46b9afc2010-07-30 09:14:20 +0000587 (Pdb) step
588 --Return--
589 > <string>(1)<module>()->None
590 (Pdb) x
591 1
592 (Pdb) continue
593
594 >>> with PdbTestInput(['x', 'continue']):
595 ... x=0
596 ... pdb_invoke('runeval', compile('x+1', '<string>', 'eval'))
597 > <string>(1)<module>()->None
598 (Pdb) x
599 1
600 (Pdb) continue
601 """
602
Guido van Rossum8820c232013-11-21 11:30:06 -0800603def test_next_until_return_at_return_event():
604 """Test that pdb stops after a next/until/return issued at a return debug event.
605
606 >>> def test_function_2():
607 ... x = 1
608 ... x = 2
609
610 >>> def test_function():
611 ... import pdb; pdb.Pdb(nosigint=True).set_trace()
612 ... test_function_2()
613 ... test_function_2()
614 ... test_function_2()
615 ... end = 1
616
617 >>> with PdbTestInput(['break test_function_2',
618 ... 'continue',
619 ... 'return',
620 ... 'next',
621 ... 'continue',
622 ... 'return',
623 ... 'until',
624 ... 'continue',
625 ... 'return',
626 ... 'return',
627 ... 'continue']):
628 ... test_function()
629 > <doctest test.test_pdb.test_next_until_return_at_return_event[1]>(3)test_function()
630 -> test_function_2()
631 (Pdb) break test_function_2
632 Breakpoint 1 at <doctest test.test_pdb.test_next_until_return_at_return_event[0]>:1
633 (Pdb) continue
634 > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(2)test_function_2()
635 -> x = 1
636 (Pdb) return
637 --Return--
638 > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(3)test_function_2()->None
639 -> x = 2
640 (Pdb) next
641 > <doctest test.test_pdb.test_next_until_return_at_return_event[1]>(4)test_function()
642 -> test_function_2()
643 (Pdb) continue
644 > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(2)test_function_2()
645 -> x = 1
646 (Pdb) return
647 --Return--
648 > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(3)test_function_2()->None
649 -> x = 2
650 (Pdb) until
651 > <doctest test.test_pdb.test_next_until_return_at_return_event[1]>(5)test_function()
652 -> test_function_2()
653 (Pdb) continue
654 > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(2)test_function_2()
655 -> x = 1
656 (Pdb) return
657 --Return--
658 > <doctest test.test_pdb.test_next_until_return_at_return_event[0]>(3)test_function_2()->None
659 -> x = 2
660 (Pdb) return
661 > <doctest test.test_pdb.test_next_until_return_at_return_event[1]>(6)test_function()
662 -> end = 1
663 (Pdb) continue
664 """
665
666def test_pdb_next_command_for_generator():
667 """Testing skip unwindng stack on yield for generators for "next" command
668
669 >>> def test_gen():
670 ... yield 0
671 ... return 1
672 ... yield 2
673
674 >>> def test_function():
675 ... import pdb; pdb.Pdb(nosigint=True).set_trace()
676 ... it = test_gen()
677 ... try:
678 ... assert next(it) == 0
679 ... next(it)
680 ... except StopIteration as ex:
681 ... assert ex.value == 1
682 ... print("finished")
683
684 >>> with PdbTestInput(['step',
685 ... 'step',
686 ... 'step',
687 ... 'next',
688 ... 'next',
689 ... 'step',
690 ... 'step',
691 ... 'continue']):
692 ... test_function()
693 > <doctest test.test_pdb.test_pdb_next_command_for_generator[1]>(3)test_function()
694 -> it = test_gen()
695 (Pdb) step
696 > <doctest test.test_pdb.test_pdb_next_command_for_generator[1]>(4)test_function()
697 -> try:
698 (Pdb) step
699 > <doctest test.test_pdb.test_pdb_next_command_for_generator[1]>(5)test_function()
700 -> assert next(it) == 0
701 (Pdb) step
702 --Call--
703 > <doctest test.test_pdb.test_pdb_next_command_for_generator[0]>(1)test_gen()
704 -> def test_gen():
705 (Pdb) next
706 > <doctest test.test_pdb.test_pdb_next_command_for_generator[0]>(2)test_gen()
707 -> yield 0
708 (Pdb) next
709 > <doctest test.test_pdb.test_pdb_next_command_for_generator[0]>(3)test_gen()
710 -> return 1
711 (Pdb) step
712 --Return--
713 > <doctest test.test_pdb.test_pdb_next_command_for_generator[0]>(3)test_gen()->1
714 -> return 1
715 (Pdb) step
716 StopIteration: 1
717 > <doctest test.test_pdb.test_pdb_next_command_for_generator[1]>(6)test_function()
718 -> next(it)
719 (Pdb) continue
720 finished
721 """
722
723def test_pdb_return_command_for_generator():
724 """Testing no unwindng stack on yield for generators
725 for "return" command
726
727 >>> def test_gen():
728 ... yield 0
729 ... return 1
730 ... yield 2
731
732 >>> def test_function():
733 ... import pdb; pdb.Pdb(nosigint=True).set_trace()
734 ... it = test_gen()
735 ... try:
736 ... assert next(it) == 0
737 ... next(it)
738 ... except StopIteration as ex:
739 ... assert ex.value == 1
740 ... print("finished")
741
742 >>> with PdbTestInput(['step',
743 ... 'step',
744 ... 'step',
745 ... 'return',
746 ... 'step',
747 ... 'step',
748 ... 'continue']):
749 ... test_function()
750 > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(3)test_function()
751 -> it = test_gen()
752 (Pdb) step
753 > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(4)test_function()
754 -> try:
755 (Pdb) step
756 > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(5)test_function()
757 -> assert next(it) == 0
758 (Pdb) step
759 --Call--
760 > <doctest test.test_pdb.test_pdb_return_command_for_generator[0]>(1)test_gen()
761 -> def test_gen():
762 (Pdb) return
763 StopIteration: 1
764 > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(6)test_function()
765 -> next(it)
766 (Pdb) step
767 > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(7)test_function()
768 -> except StopIteration as ex:
769 (Pdb) step
770 > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(8)test_function()
771 -> assert ex.value == 1
772 (Pdb) continue
773 finished
774 """
775
776def test_pdb_until_command_for_generator():
777 """Testing no unwindng stack on yield for generators
778 for "until" command if target breakpoing is not reached
779
780 >>> def test_gen():
781 ... yield 0
782 ... yield 1
783 ... yield 2
784
785 >>> def test_function():
786 ... import pdb; pdb.Pdb(nosigint=True).set_trace()
787 ... for i in test_gen():
788 ... print(i)
789 ... print("finished")
790
791 >>> with PdbTestInput(['step',
792 ... 'until 4',
793 ... 'step',
794 ... 'step',
795 ... 'continue']):
796 ... test_function()
797 > <doctest test.test_pdb.test_pdb_until_command_for_generator[1]>(3)test_function()
798 -> for i in test_gen():
799 (Pdb) step
800 --Call--
801 > <doctest test.test_pdb.test_pdb_until_command_for_generator[0]>(1)test_gen()
802 -> def test_gen():
803 (Pdb) until 4
804 0
805 1
806 > <doctest test.test_pdb.test_pdb_until_command_for_generator[0]>(4)test_gen()
807 -> yield 2
808 (Pdb) step
809 --Return--
810 > <doctest test.test_pdb.test_pdb_until_command_for_generator[0]>(4)test_gen()->2
811 -> yield 2
812 (Pdb) step
813 > <doctest test.test_pdb.test_pdb_until_command_for_generator[1]>(4)test_function()
814 -> print(i)
815 (Pdb) continue
816 2
817 finished
818 """
819
820def test_pdb_next_command_in_generator_for_loop():
821 """The next command on returning from a generator controled by a for loop.
822
823 >>> def test_gen():
824 ... yield 0
825 ... return 1
826
827 >>> def test_function():
828 ... import pdb; pdb.Pdb(nosigint=True).set_trace()
829 ... for i in test_gen():
830 ... print('value', i)
831 ... x = 123
832
833 >>> with PdbTestInput(['break test_gen',
834 ... 'continue',
835 ... 'next',
836 ... 'next',
837 ... 'next',
838 ... 'continue']):
839 ... test_function()
840 > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[1]>(3)test_function()
841 -> for i in test_gen():
842 (Pdb) break test_gen
843 Breakpoint 6 at <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[0]>:1
844 (Pdb) continue
845 > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[0]>(2)test_gen()
846 -> yield 0
847 (Pdb) next
848 value 0
849 > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[0]>(3)test_gen()
850 -> return 1
851 (Pdb) next
852 Internal StopIteration: 1
853 > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[1]>(3)test_function()
854 -> for i in test_gen():
855 (Pdb) next
856 > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[1]>(5)test_function()
857 -> x = 123
858 (Pdb) continue
859 """
860
861def test_pdb_next_command_subiterator():
862 """The next command in a generator with a subiterator.
863
864 >>> def test_subgenerator():
865 ... yield 0
866 ... return 1
867
868 >>> def test_gen():
869 ... x = yield from test_subgenerator()
870 ... return x
871
872 >>> def test_function():
873 ... import pdb; pdb.Pdb(nosigint=True).set_trace()
874 ... for i in test_gen():
875 ... print('value', i)
876 ... x = 123
877
878 >>> with PdbTestInput(['step',
879 ... 'step',
880 ... 'next',
881 ... 'next',
882 ... 'next',
883 ... 'continue']):
884 ... test_function()
885 > <doctest test.test_pdb.test_pdb_next_command_subiterator[2]>(3)test_function()
886 -> for i in test_gen():
887 (Pdb) step
888 --Call--
889 > <doctest test.test_pdb.test_pdb_next_command_subiterator[1]>(1)test_gen()
890 -> def test_gen():
891 (Pdb) step
892 > <doctest test.test_pdb.test_pdb_next_command_subiterator[1]>(2)test_gen()
893 -> x = yield from test_subgenerator()
894 (Pdb) next
895 value 0
896 > <doctest test.test_pdb.test_pdb_next_command_subiterator[1]>(3)test_gen()
897 -> return x
898 (Pdb) next
899 Internal StopIteration: 1
900 > <doctest test.test_pdb.test_pdb_next_command_subiterator[2]>(3)test_function()
901 -> for i in test_gen():
902 (Pdb) next
903 > <doctest test.test_pdb.test_pdb_next_command_subiterator[2]>(5)test_function()
904 -> x = 123
905 (Pdb) continue
906 """
907
Georg Brandl46b9afc2010-07-30 09:14:20 +0000908
Georg Brandl6cccb862010-07-30 14:16:43 +0000909class PdbTestCase(unittest.TestCase):
910
Senthil Kumaran42d70812012-05-01 10:07:49 +0800911 def run_pdb(self, script, commands):
912 """Run 'script' lines with pdb and the pdb 'commands'."""
913 filename = 'main.py'
914 with open(filename, 'w') as f:
915 f.write(textwrap.dedent(script))
Georg Brandl4bde9ca2012-05-01 09:21:16 +0200916 self.addCleanup(support.unlink, filename)
Senthil Kumaran42d70812012-05-01 10:07:49 +0800917 cmd = [sys.executable, '-m', 'pdb', filename]
918 stdout = stderr = None
919 with subprocess.Popen(cmd, stdout=subprocess.PIPE,
920 stdin=subprocess.PIPE,
921 stderr=subprocess.STDOUT,
922 ) as proc:
923 stdout, stderr = proc.communicate(str.encode(commands))
924 stdout = stdout and bytes.decode(stdout)
925 stderr = stderr and bytes.decode(stderr)
926 return stdout, stderr
927
Georg Brandl6e220552013-10-13 20:51:47 +0200928 def _assert_find_function(self, file_content, func_name, expected):
929 file_content = textwrap.dedent(file_content)
930
931 with open(support.TESTFN, 'w') as f:
932 f.write(file_content)
933
934 expected = None if not expected else (
935 expected[0], support.TESTFN, expected[1])
936 self.assertEqual(
937 expected, pdb.find_function(func_name, support.TESTFN))
938
939 def test_find_function_empty_file(self):
940 self._assert_find_function('', 'foo', None)
941
942 def test_find_function_found(self):
943 self._assert_find_function(
944 """\
945 def foo():
946 pass
947
948 def bar():
949 pass
950
951 def quux():
952 pass
953 """,
954 'bar',
955 ('bar', 4),
956 )
957
Georg Brandl6cccb862010-07-30 14:16:43 +0000958 def test_issue7964(self):
959 # open the file as binary so we can force \r\n newline
960 with open(support.TESTFN, 'wb') as f:
961 f.write(b'print("testing my pdb")\r\n')
962 cmd = [sys.executable, '-m', 'pdb', support.TESTFN]
963 proc = subprocess.Popen(cmd,
964 stdout=subprocess.PIPE,
965 stdin=subprocess.PIPE,
966 stderr=subprocess.STDOUT,
967 )
Brian Curtin994ad6c2010-11-05 15:38:47 +0000968 self.addCleanup(proc.stdout.close)
Georg Brandl6cccb862010-07-30 14:16:43 +0000969 stdout, stderr = proc.communicate(b'quit\n')
970 self.assertNotIn(b'SyntaxError', stdout,
971 "Got a syntax error running test script under PDB")
972
Senthil Kumaran42d70812012-05-01 10:07:49 +0800973 def test_issue13183(self):
974 script = """
975 from bar import bar
976
977 def foo():
978 bar()
979
980 def nope():
981 pass
982
983 def foobar():
984 foo()
985 nope()
986
987 foobar()
988 """
989 commands = """
990 from bar import bar
991 break bar
992 continue
993 step
994 step
995 quit
996 """
997 bar = """
998 def bar():
Senthil Kumarancb172042012-05-02 08:00:22 +0800999 pass
Senthil Kumaran42d70812012-05-01 10:07:49 +08001000 """
1001 with open('bar.py', 'w') as f:
1002 f.write(textwrap.dedent(bar))
Georg Brandl4bde9ca2012-05-01 09:21:16 +02001003 self.addCleanup(support.unlink, 'bar.py')
Senthil Kumaran42d70812012-05-01 10:07:49 +08001004 stdout, stderr = self.run_pdb(script, commands)
Georg Brandl4bde9ca2012-05-01 09:21:16 +02001005 self.assertTrue(
1006 any('main.py(5)foo()->None' in l for l in stdout.splitlines()),
1007 'Fail to step into the caller after a return')
Senthil Kumaran42d70812012-05-01 10:07:49 +08001008
Andrew Svetlov539ee5d2012-12-04 21:08:28 +02001009 def test_issue13210(self):
1010 # invoking "continue" on a non-main thread triggered an exception
1011 # inside signal.signal
1012
Andrew Svetlov96bc0432012-12-05 15:06:23 +02001013 # raises SkipTest if python was built without threads
1014 support.import_module('threading')
1015
Andrew Svetlov539ee5d2012-12-04 21:08:28 +02001016 with open(support.TESTFN, 'wb') as f:
1017 f.write(textwrap.dedent("""
1018 import threading
1019 import pdb
1020
1021 def start_pdb():
1022 pdb.Pdb().set_trace()
1023 x = 1
1024 y = 1
1025
1026 t = threading.Thread(target=start_pdb)
1027 t.start()""").encode('ascii'))
1028 cmd = [sys.executable, '-u', support.TESTFN]
1029 proc = subprocess.Popen(cmd,
1030 stdout=subprocess.PIPE,
1031 stdin=subprocess.PIPE,
1032 stderr=subprocess.STDOUT,
1033 )
1034 self.addCleanup(proc.stdout.close)
1035 stdout, stderr = proc.communicate(b'cont\n')
1036 self.assertNotIn('Error', stdout.decode(),
1037 "Got an error running test script under PDB")
1038
Georg Brandl6cccb862010-07-30 14:16:43 +00001039 def tearDown(self):
1040 support.unlink(support.TESTFN)
1041
1042
Andrew Svetlovf0efea02013-03-18 10:09:50 -07001043def load_tests(*args):
Georg Brandl243ad662009-05-05 09:00:19 +00001044 from test import test_pdb
Andrew Svetlovf0efea02013-03-18 10:09:50 -07001045 suites = [unittest.makeSuite(PdbTestCase), doctest.DocTestSuite(test_pdb)]
1046 return unittest.TestSuite(suites)
Georg Brandl243ad662009-05-05 09:00:19 +00001047
1048
1049if __name__ == '__main__':
Andrew Svetlovf0efea02013-03-18 10:09:50 -07001050 unittest.main()