xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/testsuite/gdb.python/py-breakpoint.exp (revision 901e7e84758515fbf39dfc064cb0b45ab146d8b0)
1# Copyright (C) 2010-2020 Free Software Foundation, Inc.
2#
3# This program is free software; you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation; either version 3 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16# This file is part of the GDB testsuite.  It tests the mechanism
17# exposing breakpoints to Python.
18
19load_lib gdb-python.exp
20
21standard_testfile
22
23set options {debug c++}
24
25if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} ${options}] } {
26    return -1
27}
28
29# Skip all tests if Python scripting is not enabled.
30if { [skip_python_tests] } { continue }
31
32proc_with_prefix test_bkpt_basic { } {
33    global srcfile testfile hex decimal
34
35    # Start with a fresh gdb.
36    clean_restart ${testfile}
37
38    # We should start with no breakpoints.
39    gdb_test "python print (gdb.breakpoints())" "\\(\\)"
40
41    if ![runto_main] then {
42	fail "cannot run to main."
43	return 0
44    }
45
46    # Now there should be one breakpoint: main.
47    gdb_py_test_silent_cmd "python blist = gdb.breakpoints()" \
48	"Get Breakpoint List" 0
49    gdb_test "python print (blist\[0\])" \
50	"<gdb.Breakpoint object at $hex>" "Check obj exists @main"
51    gdb_test "python print (blist\[0\].location)" \
52	"main." "Check breakpoint location @main"
53    gdb_test "python print (blist\[0\].pending)" "False" \
54	"Check pending status of main breakpoint"
55
56    set mult_line [gdb_get_line_number "Break at multiply."]
57    gdb_breakpoint ${mult_line}
58    gdb_continue_to_breakpoint "Break at multiply" \
59	".*Break at multiply.*"
60
61    # Check that the Python breakpoint code noted the addition of a
62    # breakpoint "behind the scenes".
63    gdb_py_test_silent_cmd "python blist = gdb.breakpoints()" \
64	"Get Breakpoint List" 0
65    gdb_test "python print (len(blist))" \
66	"2" "Check for two breakpoints"
67    gdb_test "python print (blist\[0\])" \
68	"<gdb.Breakpoint object at $hex>" "Check obj exists @main 2"
69    gdb_test "python print (blist\[0\].location)" \
70	"main." "Check breakpoint location @main 2"
71    gdb_test "python print (blist\[1\])" \
72	"<gdb.Breakpoint object at $hex>" "Check obj exists @mult_line"
73
74    gdb_test "python print (blist\[1\].location)" \
75	"py-breakpoint\.c:${mult_line}*" \
76	"check breakpoint location @mult_line"
77
78    # Check hit and ignore counts.
79    gdb_test "python print (blist\[1\].hit_count)" \
80	"1" "Check breakpoint hit count @1"
81    gdb_py_test_silent_cmd "python blist\[1\].ignore_count = 4" \
82	"Set breakpoint hit count" 0
83    gdb_continue_to_breakpoint "Break at multiply @6" \
84	".*Break at multiply.*"
85    gdb_test "python print (blist\[1\].hit_count)" \
86	"6" "Check breakpoint hit count @6"
87    gdb_test "print result" \
88	" = 545" "Check expected variable result after 6 iterations"
89
90    # Test breakpoint is enabled and disabled correctly..
91    gdb_breakpoint [gdb_get_line_number "Break at add."]
92    gdb_continue_to_breakpoint "Break at add 1" ".*Break at add.*"
93    gdb_test "python print (blist\[1\].enabled)" \
94	"True" "Check breakpoint enabled."
95    gdb_py_test_silent_cmd  "python blist\[1\].enabled = False" \
96	"Set breakpoint disabled." 0
97    gdb_continue_to_breakpoint "Break at add 2" ".*Break at add.*"
98    gdb_py_test_silent_cmd  "python blist\[1\].enabled = True" \
99	"Set breakpoint enabled." 0
100    gdb_continue_to_breakpoint "Break at multiply after re-enable" \
101	".*Break at multiply.*"
102
103    # Test other getters and setters.
104    gdb_py_test_silent_cmd "python blist = gdb.breakpoints()" \
105	"Get Breakpoint List" 0
106    gdb_test "python print (blist\[1\].thread)" \
107	"None" "Check breakpoint thread"
108    gdb_test "python print (blist\[1\].type == gdb.BP_BREAKPOINT)" \
109	"True" "Check breakpoint type"
110    gdb_test "python print (blist\[0\].number)" \
111	"1" "Check breakpoint number 0"
112    gdb_test "python print (blist\[1\].number)" \
113	"2" "Check breakpoint number 1"
114    gdb_test "python print (blist\[2\].number)" \
115	"3" "Check breakpoint number 2"
116}
117
118proc_with_prefix test_bkpt_deletion { } {
119    global srcfile testfile hex decimal
120
121    # Start with a fresh gdb.
122    clean_restart ${testfile}
123
124    if ![runto_main] then {
125	fail "cannot run to main."
126	return 0
127    }
128
129    # Test breakpoints are deleted correctly.
130    set deltst_location [gdb_get_line_number "Break at multiply."]
131    set end_location [gdb_get_line_number "Break at end."]
132    gdb_py_test_silent_cmd  "python dp1 = gdb.Breakpoint (\"$deltst_location\")" \
133	"Set breakpoint" 0
134    gdb_breakpoint [gdb_get_line_number "Break at end."]
135    gdb_py_test_silent_cmd "python del_list = gdb.breakpoints()" \
136	"Get Breakpoint List" 0
137    gdb_test "python print (len(del_list))" \
138	"3" "Number of breakpoints before delete"
139    gdb_continue_to_breakpoint "Break at multiply." \
140	".*$srcfile:$deltst_location.*"
141    gdb_py_test_silent_cmd  "python dp1.delete()" \
142	"Delete Breakpoint" 0
143    gdb_test "python print (dp1.number)" \
144	"RuntimeError: Breakpoint 2 is invalid.*" \
145	"Check breakpoint invalidated"
146    gdb_py_test_silent_cmd "python del_list = gdb.breakpoints()" \
147	"Get Breakpoint List" 0
148    gdb_test "python print (len(del_list))" \
149	"2" "Number of breakpoints after delete"
150    gdb_continue_to_breakpoint "Break at end." \
151	".*$srcfile:$end_location.*"
152}
153
154proc_with_prefix test_bkpt_cond_and_cmds { } {
155    global srcfile testfile hex decimal
156
157    # Start with a fresh gdb.
158    clean_restart ${testfile}
159
160    if ![runto_main] then {
161	fail "cannot run to main."
162	return 0
163    }
164
165    # Test conditional setting.
166    set bp_location1 [gdb_get_line_number "Break at multiply."]
167    gdb_py_test_silent_cmd "python bp1 = gdb.Breakpoint (\"$bp_location1\")" \
168	"Set breakpoint" 0
169    gdb_continue_to_breakpoint "Break at multiply" \
170	".*Break at multiply.*"
171    gdb_py_test_silent_cmd "python bp1.condition = \"i == 5\"" \
172	"Set breakpoint" 0
173    gdb_test "python print (bp1.condition)" "i == 5" \
174	"Test conditional has been set"
175    gdb_continue_to_breakpoint "Break at multiply @5" \
176	".*Break at multiply.*"
177    gdb_test "print i" \
178	"5" "Test conditional breakpoint stopped after five iterations"
179    gdb_py_test_silent_cmd "python bp1.condition = None" \
180	"Clear condition" 0
181    gdb_test "python print (bp1.condition)" \
182	"None" "Test conditional read"
183    gdb_continue_to_breakpoint "Break at multiply @6" \
184	".*Break at multiply.*"
185    gdb_test "print i" \
186	"6" "Test breakpoint stopped after six iterations"
187
188    # Test commands.
189    gdb_breakpoint [gdb_get_line_number "Break at add."]
190    set test {commands $bpnum}
191    gdb_test_multiple $test $test { -re "\r\n>$" { pass $test } }
192    set test {print "Command for breakpoint has been executed."}
193    gdb_test_multiple $test $test { -re "\r\n>$" { pass $test } }
194    set test {print result}
195    gdb_test_multiple $test $test { -re "\r\n>$" { pass $test } }
196    gdb_test "end"
197
198    gdb_py_test_silent_cmd "python blist = gdb.breakpoints()" \
199	"Get Breakpoint List" 0
200    gdb_py_test_silent_cmd "python last_bp = blist\[len(blist)-1\]" \
201	"Find last breakpoint" 0
202    gdb_test "python print (last_bp.commands)" \
203	"print \"Command for breakpoint has been executed.\".*print result"
204
205    gdb_test_no_output "python last_bp.commands = 'echo hi\\necho there'" \
206	"set commands"
207    # Note the length is 3 because the string ends in a \n.
208    gdb_test "python print (len(last_bp.commands.split('\\n')))" "3" \
209	"check number of lines in commands"
210}
211
212proc_with_prefix test_bkpt_invisible { } {
213    global srcfile testfile hex decimal
214
215    # Start with a fresh gdb.
216    clean_restart ${testfile}
217
218    if ![runto_main] then {
219	fail "cannot run to main."
220	return 0
221    }
222
223    delete_breakpoints
224    set ibp_location [gdb_get_line_number "Break at multiply."]
225    gdb_py_test_silent_cmd  "python ibp = gdb.Breakpoint(\"$ibp_location\", internal=False)" \
226	"Set invisible breakpoint" 0
227    gdb_py_test_silent_cmd "python ilist = gdb.breakpoints()" \
228	"Get Breakpoint List" 0
229    gdb_test "python print (ilist\[0\])" \
230	"<gdb.Breakpoint object at $hex>" "Check invisible bp obj exists 1"
231    gdb_test "python print (ilist\[0\].location)" \
232	"py-breakpoint\.c:$ibp_location*" "Check breakpoint location 1"
233    gdb_test "python print (ilist\[0\].visible)" \
234	"True" "Check breakpoint visibility 1"
235    gdb_test "info breakpoints" "py-breakpoint\.c:$ibp_location.*" \
236	"Check info breakpoints shows visible breakpoints"
237    delete_breakpoints
238    gdb_py_test_silent_cmd  "python ibp = gdb.Breakpoint(\"$ibp_location\", internal=True)" \
239	"Set invisible breakpoint" 0
240    gdb_py_test_silent_cmd "python ilist = gdb.breakpoints()" \
241	"Get Breakpoint List" 0
242    gdb_test "python print (ilist\[0\])" \
243	"<gdb.Breakpoint object at $hex>" "Check invisible bp obj exists 2"
244    gdb_test "python print (ilist\[0\].location)" \
245	"py-breakpoint\.c:$ibp_location*" "Check breakpoint location 2"
246    gdb_test "python print (ilist\[0\].visible)" \
247	"False" "Check breakpoint visibility 2"
248    gdb_test "info breakpoints" "No breakpoints or watchpoints.*" \
249	"Check info breakpoints does not show invisible breakpoints"
250    gdb_test "maint info breakpoints" \
251	"py-breakpoint\.c:$ibp_location.*" \
252	"Check maint info breakpoints shows invisible breakpoints"
253}
254
255proc_with_prefix test_watchpoints { } {
256    global srcfile testfile hex decimal
257
258    # Start with a fresh gdb.
259    clean_restart ${testfile}
260
261    # Disable hardware watchpoints if necessary.
262    if [target_info exists gdb,no_hardware_watchpoints] {
263	gdb_test_no_output "set can-use-hw-watchpoints 0" ""
264    }
265
266    if ![runto_main] then {
267	fail "cannot run to main."
268	return 0
269    }
270
271    gdb_py_test_silent_cmd  "python wp1 = gdb.Breakpoint (\"result\", type=gdb.BP_WATCHPOINT, wp_class=gdb.WP_WRITE )" \
272	"Set watchpoint" 0
273    gdb_test "python print (wp1.pending)" "False"
274    gdb_test "continue" \
275	".*\[Ww\]atchpoint.*result.*Old value = 0.*New value = 25.*main.*" \
276	"Test watchpoint write"
277}
278
279proc_with_prefix test_bkpt_internal { } {
280    global srcfile testfile hex decimal
281
282    # Start with a fresh gdb.
283    clean_restart ${testfile}
284
285    # Disable hardware watchpoints if necessary.
286    if [target_info exists gdb,no_hardware_watchpoints] {
287	gdb_test_no_output "set can-use-hw-watchpoints 0" ""
288    }
289    if ![runto_main] then {
290	fail "cannot run to main."
291	return 0
292    }
293    delete_breakpoints
294    gdb_py_test_silent_cmd  "python wp1 = gdb.Breakpoint (\"result\", type=gdb.BP_WATCHPOINT, wp_class=gdb.WP_WRITE, internal=True )" \
295	"Set watchpoint" 0
296    gdb_test "info breakpoints" \
297	"No breakpoints or watchpoints.*" \
298	"Check info breakpoints does not show invisible breakpoints"
299    gdb_test "maint info breakpoints" \
300	".*watchpoint.*result.*" \
301	"Check maint info breakpoints shows invisible breakpoints"
302    gdb_test "continue" \
303	".*\[Ww\]atchpoint.*result.*Old value = 0.*New value = 25.*" \
304	"Test watchpoint write"
305}
306
307proc_with_prefix test_bkpt_eval_funcs { } {
308    global srcfile testfile hex decimal
309
310    # Start with a fresh gdb.
311    clean_restart ${testfile}
312
313    # Disable hardware watchpoints if necessary.
314    if [target_info exists gdb,no_hardware_watchpoints] {
315	gdb_test_no_output "set can-use-hw-watchpoints 0" ""
316    }
317    if ![runto_main] then {
318	fail "cannot run to main."
319	return 0
320    }
321    delete_breakpoints
322
323    gdb_test_multiline "Sub-class a breakpoint" \
324	"python" "" \
325	"class bp_eval (gdb.Breakpoint):" "" \
326	"   inf_i = 0" "" \
327	"   count = 0" "" \
328	"   def stop (self):" "" \
329	"      self.count = self.count + 1" "" \
330	"      self.inf_i = gdb.parse_and_eval(\"i\")" "" \
331	"      if self.inf_i == 3:" "" \
332	"        return True" "" \
333	"      return False" "" \
334	"end" ""
335
336    gdb_test_multiline "Sub-class a second breakpoint" \
337	"python" "" \
338	"class bp_also_eval (gdb.Breakpoint):" "" \
339	"   count = 0" "" \
340	"   def stop (self):" "" \
341	"      self.count = self.count + 1" "" \
342	"      if self.count == 9:" "" \
343	"        return True" "" \
344	"      return False" "" \
345	"end" ""
346
347    gdb_test_multiline "Sub-class a third breakpoint" \
348	"python" "" \
349	"class basic (gdb.Breakpoint):" "" \
350	"   count = 0" "" \
351	"end" ""
352
353    set bp_location2 [gdb_get_line_number "Break at multiply."]
354    set end_location [gdb_get_line_number "Break at end."]
355    gdb_py_test_silent_cmd "python eval_bp1 = bp_eval(\"$bp_location2\")" \
356	"Set breakpoint" 0
357    gdb_py_test_silent_cmd "python also_eval_bp1 = bp_also_eval(\"$bp_location2\")" \
358	"Set breakpoint" 0
359    gdb_py_test_silent_cmd "python never_eval_bp1 = bp_also_eval(\"$end_location\")" \
360	"Set breakpoint" 0
361    gdb_continue_to_breakpoint "Break at multiply, i==3" \
362	".*$srcfile:$bp_location2.*"
363    gdb_test "print i" \
364	"3" "Check inferior value matches python accounting"
365    gdb_test "python print (eval_bp1.inf_i)" \
366	"3" "Check python accounting matches inferior"
367    gdb_test "python print (also_eval_bp1.count)" "4" \
368	"Check non firing same-location also_eval_bp1 function was also called at each stop."
369    gdb_test "python print (eval_bp1.count)" "4" \
370	"Check non firing same-location eval_bp1 function was also called at each stop."
371
372    delete_breakpoints
373    set cond_bp [gdb_get_line_number "Break at multiply."]
374    gdb_py_test_silent_cmd  "python eval_bp1 = bp_eval(\"$cond_bp\")" \
375	"Set breakpoint" 0
376    set test_cond {cond $bpnum}
377    gdb_test "$test_cond \"foo==3\"" \
378	"Only one stop condition allowed.  There is currently a Python.*" \
379	"Check you cannot add a CLI condition to a Python breakpoint that has defined stop"
380    gdb_py_test_silent_cmd "python eval_bp2 = basic(\"$cond_bp\")" \
381	"Set breakpoint" 0
382    gdb_py_test_silent_cmd "python eval_bp2.condition = \"1==1\"" \
383	"Set a condition" 0
384    gdb_test_multiline "Construct an eval function" \
385	"python" "" \
386	"def stop_func ():" "" \
387	"   return True" "" \
388	"end" ""
389
390    gdb_test "python eval_bp2.stop = stop_func"  \
391	"RuntimeError: Only one stop condition allowed.  There is currently a GDB.*" \
392	"assign stop function to a breakpoint that has a condition"
393
394    delete_breakpoints
395    gdb_breakpoint [gdb_get_line_number "Break at multiply."]
396    gdb_py_test_silent_cmd  "python check_eval = bp_eval(\"$bp_location2\")" \
397	"Set breakpoint" 0
398    gdb_test "python print (check_eval.count)" "0" \
399	"Test that evaluate function has not been yet executed (ie count = 0)"
400    gdb_continue_to_breakpoint "Break at multiply, count==1" \
401	".*$srcfile:$bp_location2.*"
402    gdb_test "python print (check_eval.count)" "1" \
403	"Test that evaluate function is run when location also has normal bp"
404
405    gdb_test_multiline "Sub-class a watchpoint" \
406	"python" "" \
407	"class wp_eval (gdb.Breakpoint):" "" \
408	"   def stop (self):" "" \
409	"      self.result = gdb.parse_and_eval(\"result\")" "" \
410	"      if self.result == 788:" "" \
411	"        return True" "" \
412	"      return False" "" \
413	"end" ""
414
415    delete_breakpoints
416    gdb_py_test_silent_cmd  "python wp1 = wp_eval (\"result\", type=gdb.BP_WATCHPOINT, wp_class=gdb.WP_WRITE)" \
417	"Set watchpoint" 0
418    gdb_test "continue" \
419	".*\[Ww\]atchpoint.*result.*Old value =.*New value = 788.*" \
420	"Test watchpoint write"
421    gdb_test "python print (never_eval_bp1.count)" "0" \
422	"Check that this unrelated breakpoints eval function was never called."
423}
424
425proc_with_prefix test_bkpt_temporary { } {
426    global srcfile testfile hex decimal
427
428    # Start with a fresh gdb.
429    clean_restart ${testfile}
430
431    if ![runto_main] then {
432	fail "cannot run to main."
433	return 0
434    }
435    delete_breakpoints
436
437    gdb_test_multiline "Sub-class and check temporary breakpoint" \
438	"python" "" \
439	"class temp_bp (gdb.Breakpoint):" "" \
440	"   count = 0" "" \
441	"   def stop (self):" "" \
442	"      self.count = self.count + 1" "" \
443	"      return True" "" \
444	"end" ""
445    set ibp_location [gdb_get_line_number "Break at multiply."]
446    gdb_py_test_silent_cmd "python ibp = temp_bp(\"$ibp_location\", temporary=True)" \
447	"Set temporary breakpoint" 0
448    gdb_test "info breakpoints" \
449	"2.*breakpoint.*del.*py-breakpoint\.c:$ibp_location.*" \
450	"Check info breakpoints shows breakpoint with temporary status"
451    gdb_test "python print (ibp.location)" "py-breakpoint\.c:$ibp_location*" \
452	"Check temporary breakpoint location"
453    gdb_test "python print (ibp.temporary)" "True" \
454	"Check breakpoint temporary status"
455    gdb_continue_to_breakpoint "Break at multiply." \
456	".*$srcfile:$ibp_location.*"
457    gdb_test "python print (ibp.count)" "1" \
458	"Check temporary stop callback executed before deletion."
459    gdb_test "python print (ibp.temporary)" "RuntimeError: Breakpoint 2 is invalid.*" \
460	"Check temporary breakpoint is deleted after being hit"
461    gdb_test "info breakpoints" "No breakpoints or watchpoints.*" \
462	"Check info breakpoints shows temporary breakpoint is deleted"
463}
464
465# Test address locations.
466
467proc_with_prefix test_bkpt_address {} {
468    global gdb_prompt decimal srcfile
469
470    # Delete all breakpoints
471    delete_breakpoints
472
473    gdb_test "python gdb.Breakpoint(\"*main\")" \
474	".*Breakpoint ($decimal)+ at .*$srcfile, line ($decimal)+\."
475
476    gdb_py_test_silent_cmd \
477	"python main_loc = gdb.parse_and_eval(\"main\").address" \
478	"eval address of main" 0
479
480    # Python 2 vs 3 ... Check `int' first. If that fails, try `long'.
481    gdb_test_multiple "python main_addr = int(main_loc)" "int value of main" {
482	-re "Traceback.*$gdb_prompt $" {
483	    gdb_test_no_output "python main_addr = long(main_loc)" \
484		"long value of main"
485	}
486	-re "$gdb_prompt $" {
487	    pass "int value of main"
488	}
489    }
490
491    # Include whitespace in the linespec to double-check proper
492    # grokking of argument to gdb.Breakpoint.
493    gdb_test "python gdb.Breakpoint(\"  *{}\".format(str(main_addr)))" \
494	".*Breakpoint ($decimal)+ at .*$srcfile, line ($decimal)+\."
495}
496
497proc_with_prefix test_bkpt_pending {} {
498    delete_breakpoints
499    gdb_breakpoint "nosuchfunction" allow-pending
500    gdb_test "python print (gdb.breakpoints()\[0\].pending)" "True" \
501	"Check pending status of pending breakpoint"
502}
503
504# Helper proc to install an event listener for a given breakpoint
505# event.  NAME is the name of the event to listen for.
506proc connect_event {name} {
507    set lambda "lambda x: note_event(\"$name\")"
508    gdb_test_no_output "python gdb.events.$name.connect($lambda)" \
509	"install $name event listener"
510}
511
512# Helper proc to check that the most recently emitted breakpoint event
513# is EXPECTED.
514proc check_last_event {expected} {
515    gdb_test "python print (last_bp_event)" $expected \
516	"check for $expected event"
517}
518
519proc_with_prefix test_bkpt_events {} {
520    global testfile
521
522    clean_restart ${testfile}
523
524    gdb_test_multiline "Create event handler" \
525	"python" "" \
526	"def note_event(arg):" "" \
527	"  global last_bp_event" "" \
528	"  last_bp_event = arg" "" \
529	"end" ""
530    gdb_test_no_output "python last_bp_event = None"
531
532    connect_event breakpoint_created
533    connect_event breakpoint_modified
534    connect_event breakpoint_deleted
535
536    gdb_breakpoint [gdb_get_line_number "Break at add."]
537    check_last_event breakpoint_created
538    gdb_test_no_output "disable 1"
539    check_last_event breakpoint_modified
540    gdb_test_no_output "delete 1"
541    check_last_event breakpoint_deleted
542}
543
544proc_with_prefix test_bkpt_explicit_loc {} {
545    global srcfile testfile
546
547    # Start with a fresh gdb.
548    clean_restart ${testfile}
549
550    if ![runto_main] then {
551	fail "cannot run to main."
552	return 0
553    }
554
555    delete_breakpoints
556
557    set bp_location1 [gdb_get_line_number "Break at multiply."]
558    set bp_location2 [gdb_get_line_number "Break at add."]
559
560    gdb_py_test_silent_cmd "python bp1 = gdb.Breakpoint (line=$bp_location1)" \
561	"set explicit breakpoint by line" 0
562    gdb_continue_to_breakpoint "break at multiply for explicit line" \
563	".*Break at multiply.*"
564
565    gdb_py_test_silent_cmd "python bp1 = gdb.Breakpoint (line=\"+1\")" \
566	"set explicit breakpoint by relative line" 0
567    gdb_continue_to_breakpoint "break at add for relative line" \
568	".*Break at add.*"
569
570    delete_breakpoints
571    gdb_py_test_silent_cmd "python bp1 = gdb.Breakpoint (line=\"-1\")" \
572	"set explicit breakpoint by relative negative line" 0
573    gdb_continue_to_breakpoint "break at multiply for negative line" \
574	".*Break at multiply.*"
575
576    delete_breakpoints
577    gdb_test "python bp1 = gdb.Breakpoint (line=bp1)" \
578	"RuntimeError: Line keyword should be an integer or a string.*" \
579	"set explicit breakpoint by invalid line type"
580
581    delete_breakpoints
582    gdb_py_test_silent_cmd "python bp1 = gdb.Breakpoint (function=\"add\")" \
583	"set explicit breakpoint by function" 0
584    gdb_continue_to_breakpoint "break at function add for function" \
585	".*Break at function add.*"
586
587    delete_breakpoints
588    gdb_py_test_silent_cmd "python bp1 = gdb.Breakpoint (source=\"$srcfile\", function=\"add\")" \
589	"set explicit breakpoint by source file and function" 0
590    gdb_continue_to_breakpoint "break at function add for source and function" \
591	".*Break at function add.*"
592
593    delete_breakpoints
594    gdb_py_test_silent_cmd "python bp1 = gdb.Breakpoint (source=\"$srcfile\", line=\"$bp_location2\")" \
595	"set explicit breakpoint by source file and line number" 0
596    gdb_continue_to_breakpoint "break at add for source and line" \
597	".*Break at add.*"
598
599    delete_breakpoints
600    gdb_py_test_silent_cmd "python bp1 = gdb.Breakpoint (\"-source $srcfile -line $bp_location2\")" \
601	"set explicit breakpoint by source file and line number in spec" 0
602    gdb_continue_to_breakpoint "break at add for source and line in spec" \
603	".*Break at add.*"
604
605    delete_breakpoints
606    gdb_test "python bp1 = gdb.Breakpoint (source=\"$srcfile\")" \
607	"RuntimeError: Specifying a source must also include a line, label or function.*" \
608	"set invalid explicit breakpoint by source only"
609
610    gdb_test "python bp1 = gdb.Breakpoint (source=\"foo.c\", line=\"5\")" \
611	"No source file named foo.*" \
612	"set invalid explicit breakpoint by missing source and line"
613    gdb_test "python bp1 = gdb.Breakpoint (source=\"$srcfile\", line=\"900\")" \
614	"No line 900 in file \"$srcfile\".*" \
615	"set invalid explicit breakpoint by source and invalid line"
616    gdb_test "python bp1 = gdb.Breakpoint (function=\"blah\")" \
617	"Function \"blah\" not defined.*" \
618	"set invalid explicit breakpoint by missing function"
619
620    delete_breakpoints
621    gdb_test "catch throw" "Catchpoint .* \\(throw\\)"
622    gdb_test "python print (gdb.breakpoints())" \
623	"\(\)" \
624	"catch throw is not a breakpoint"
625}
626
627proc_with_prefix test_bkpt_qualified {} {
628    global decimal hex testfile
629
630    # Start with a fresh gdb.
631    clean_restart ${testfile}
632
633    set one_location_re "Breakpoint $decimal at $hex:.*line $decimal."
634    set two_location_re "Breakpoint $decimal at $hex:.*2 locations."
635
636    if ![runto_main] then {
637	fail "cannot run to main."
638	return 0
639    }
640
641    # Test the default value of "qualified".
642    delete_breakpoints
643    gdb_test \
644	"python gdb.Breakpoint(\"multiply\")" \
645	$two_location_re \
646	"qualified implicitly false"
647
648    # Test qualified=False.
649    delete_breakpoints
650    gdb_test \
651	"python gdb.Breakpoint(\"multiply\", qualified=False)" \
652	$two_location_re \
653	"qualified false"
654
655    # Test qualified=True.
656    delete_breakpoints
657    gdb_test \
658	"python gdb.Breakpoint(\"multiply\", qualified=True)" \
659	$one_location_re \
660	"qualified true"
661
662    # Test qualified=True with an explicit function.
663    delete_breakpoints
664    gdb_test \
665	"python gdb.Breakpoint(function=\"multiply\", qualified=True)" \
666	$one_location_re \
667	"qualified true and explicit"
668
669    # Test qualified=False with an explicit function.
670    delete_breakpoints
671    gdb_test \
672	"python gdb.Breakpoint(function=\"multiply\", qualified=False)" \
673	$two_location_re \
674	"qualified false and explicit"
675
676    # Test -q in the spec string.
677    delete_breakpoints
678    gdb_test \
679	"python gdb.Breakpoint(\"-q multiply\")" \
680	$one_location_re \
681	"-q in spec string"
682
683    # Test -q in the spec string with explicit location.
684    delete_breakpoints
685    gdb_test \
686	"python gdb.Breakpoint(\"-q -function multiply\")" \
687	$one_location_re \
688	"-q in spec string with explicit location"
689
690    # Test -q in the spec string and qualified=False (-q should win).
691    delete_breakpoints
692    gdb_test \
693	"python gdb.Breakpoint(\"-q multiply\", qualified=False)" \
694	$one_location_re \
695	"-q in spec string and qualified false"
696}
697
698proc_with_prefix test_bkpt_probe {} {
699    global decimal hex testfile srcfile
700
701    if { [prepare_for_testing "failed to prepare" ${testfile}-probes \
702	    ${srcfile} {debug c++ additional_flags=-DUSE_PROBES}] } {
703	return -1
704    }
705
706    if ![runto_main] then {
707	fail "cannot run to main."
708	return 0
709    }
710
711    gdb_test \
712	"python gdb.Breakpoint(\"-probe test:result_updated\")" \
713	"Breakpoint $decimal at $hex" \
714	"-probe in spec string"
715}
716
717test_bkpt_basic
718test_bkpt_deletion
719test_bkpt_cond_and_cmds
720test_bkpt_invisible
721test_watchpoints
722test_bkpt_internal
723test_bkpt_eval_funcs
724test_bkpt_temporary
725test_bkpt_address
726test_bkpt_pending
727test_bkpt_events
728test_bkpt_explicit_loc
729test_bkpt_qualified
730test_bkpt_probe
731