# This testcase is part of GDB, the GNU debugger.

# Copyright 1997-2021 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

#
# test running programs
#

standard_testfile break.c break1.c

if {[prepare_for_testing "failed to prepare" ${testfile} \
	 [list $srcfile $srcfile2] {debug nowarnings}]} {
    return -1
}

set bp_location1 [gdb_get_line_number "set breakpoint 1 here"]
set bp_location7 [gdb_get_line_number "set breakpoint 7 here"]
set bp_location8 [gdb_get_line_number "set breakpoint 8 here" $srcfile2]
set bp_location11 [gdb_get_line_number "set breakpoint 11 here"]
set bp_location14 [gdb_get_line_number "set breakpoint 14 here" $srcfile2]
set bp_location15 [gdb_get_line_number "set breakpoint 15 here" $srcfile2]
set bp_location17 [gdb_get_line_number "set breakpoint 17 here" $srcfile2]

if ![runto_main] then { fail "enable/disable break tests suppressed" }

# Verify that we can set a breakpoint (the location is irrelevant),
# then enable it (yes, it's already enabled by default), then hit it.

proc break_at { breakpoint where } {
    global gdb_prompt
    global expect_out

    set test "break $breakpoint"
    set bp 0
    gdb_test_multiple "$test" "$test" {
	-re "Breakpoint (\[0-9\]*) at .*$where.*$gdb_prompt $" {
	    set bp $expect_out(1,string)
	    pass $gdb_test_name
	}
    }
    return $bp
}

set bp [break_at "marker1" " line $bp_location15"]

gdb_test_no_output "enable $bp" "enable break marker1"

gdb_test "info break $bp" \
    "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+keep\[ \t\]+y.*" \
    "info break marker1 before hitting breakpoint"

# See the comments in condbreak.exp for "run until breakpoint at
# marker1" for an explanation of the xfail below.
set test "continue to break marker1"
gdb_test_multiple "continue" "$test" {
    -re "Breakpoint \[0-9\]*, marker1.*$gdb_prompt $" {
	pass "$test"
    }
    -re "Breakpoint \[0-9\]*, $hex in marker1.*$gdb_prompt $" {
	xfail "$test"
    }
}

gdb_test_no_output "delete $bp" "delete break marker1"

# Verify that we can set a breakpoint to be self-disabling after the
# first time it triggers.
set bp [break_at "marker2" " line $bp_location8"]

gdb_test_no_output "enable once $bp" "enable once break marker2"

gdb_test "info break $bp" \
    "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+dis\[ \t\]+y.*" \
    "info auto-disabled break marker2 before hitting breakpoint"

# See the comments in condbreak.exp for "run until breakpoint at
# marker1" for an explanation of the xfail below.
set test "continue to auto-disabled break marker2"
gdb_test_multiple "continue" "$test" {
    -re "Breakpoint \[0-9\]*, marker2.*$gdb_prompt $" {
	pass "$test"
    }
    -re "Breakpoint \[0-9\]*, $hex in marker2.*$gdb_prompt $" {
	xfail "$test"
    }
}

gdb_test "info break $bp" \
    "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+dis\[ \t\]+n.*" \
    "info auto-disabled break marker2 after hitting breakpoint"

# Verify that we don't stop at a disabled breakpoint.
gdb_continue_to_end "no stop"

set count 1
with_test_prefix "run $count" {
    rerun_to_main
    incr count
}
gdb_continue_to_end "no stop at auto-disabled break marker2"

# Verify that we can set a breakpoint to be self-deleting after the
# first time it triggers.
if ![runto_main] then {
    fail "enable/disable break tests suppressed"
}

set bp [break_at "marker3" " line $bp_location17"]

gdb_test_no_output "enable del $bp" "enable del break marker3"

gdb_test "info break $bp" \
    "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+del\[ \t\]+y.*" \
    "info auto-deleted break marker2"

gdb_test "continue" \
    ".*marker3 .*:$bp_location17.*" \
    "continue to auto-deleted break marker3"

gdb_test "info break $bp" \
    ".*No breakpoint or watchpoint matching.*" \
    "info auto-deleted break marker3"

# Verify that we can set a breakpoint and manually disable it (we've
# already proven that disabled bp's don't trigger).

set bp [break_at "marker4" " line $bp_location14.*"]

gdb_test_no_output "disable $bp" "disable break marker4"

gdb_test "info break $bp" \
    "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+keep\[ \t\]+n.*" \
    "info break marker4"

if ![runto_main] then {
    fail "enable/disable break tests suppressed"
}

# Test enable count by stopping at a location until it is disabled
# and passes through.

set bp [break_at $bp_location7 "line $bp_location7"]

with_test_prefix "enable count" {
  set bp2 [break_at marker1 " line $bp_location15"]
}

gdb_test "enable count" \
    "Argument required \\(hit count\\)\\." \
    "enable count missing arguments"

gdb_test "enable count 2" \
    "Argument required \\(one or more breakpoint numbers\\)\\." \
    "enable count missing breakpoint number"

gdb_test_no_output "enable count 2 $bp" "disable break with count"

gdb_test "continue" \
    ".*factorial .*:$bp_location7.*" \
    "continue from enable count, first time"

gdb_test "continue" \
    ".*factorial .*:$bp_location7.*" \
    "continue from enable count, second time"

gdb_test "continue" \
    ".*marker1 .*:$bp_location15.*" \
    "continue through enable count, now disabled"

# Verify that we can set a breakpoint with an ignore count N, which
# should cause the next N triggers of the bp to be ignored.  (This is
# a flavor of enablement/disablement, after all.)

if ![runto_main] then {
    fail "enable/disable break tests suppressed"
}

with_test_prefix "ignore count" {
    set bp [break_at "marker1" " line $bp_location15.*"]
}

# Verify that an ignore of a non-existent breakpoint is gracefully
# handled.

gdb_test "ignore 999 2" \
    "No breakpoint number 999..*" \
    "ignore non-existent break"

# Verify that a missing ignore count is gracefully handled.

gdb_test "ignore $bp" \
    "Second argument .specified ignore-count. is missing..*" \
    "ignore break with missing ignore count"

# Verify that a negative or zero ignore count is handled gracefully
# (they both are treated the same).

gdb_test "ignore $bp -1" \
    "Will stop next time breakpoint \[0-9\]* is reached..*" \
    "ignore break marker1 -1"

gdb_test "ignore $bp 0" \
    "Will stop next time breakpoint \[0-9\]* is reached..*" \
    "ignore break marker1 0"

gdb_test "ignore $bp 1" \
    "Will ignore next crossing of breakpoint \[0-9\]*.*" \
    "ignore break marker1 1"

gdb_test "info break $bp" \
    "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+keep\[ \t\]+y.*ignore next 1 hits.*" \
    "info ignored break marker1"

gdb_continue_to_end "no stop at ignored break marker1"

with_test_prefix "run $count" {
    rerun_to_main
    incr count
}

# See the comments in condbreak.exp for "run until breakpoint at marker1" 
# for an explanation of the xfail below.
set test "continue to break marker1, 2nd time"
gdb_test_multiple "continue" "$test" {
    -re "Breakpoint \[0-9\]*, marker1.*$gdb_prompt $" {
	pass "continue to break marker1, 2nd time"
    }
    -re "Breakpoint \[0-9\]*, $hex in marker1.*$gdb_prompt $" {
	xfail "continue to break marker1, 2nd time"
    }
}

# Verify that we can specify both an ignore count and an auto-delete.

if ![runto_main] then {
    fail "enable/disable break tests suppressed"
}

with_test_prefix "ignore count and auto-delete" {
    set bp [break_at marker1 " line $bp_location15.*"]
}

gdb_test "ignore $bp 1" \
    "Will ignore next crossing of breakpoint \[0-9\]*.*" \
    "ignore break marker1"

gdb_test_no_output "enable del $bp" "enable del break marker1"

gdb_test "info break $bp" \
    "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+del\[ \t\]+y.*ignore next 1 hits.*" \
    "info break marker1 after hitting breakpoint"

gdb_continue_to_end "no stop at ignored & auto-deleted break marker1"

with_test_prefix "run $count" {
    rerun_to_main
    incr count
}

gdb_test "continue" \
    ".*marker1 .*:$bp_location15.*" \
    "continue to ignored & auto-deleted break marker1"

# Verify that a disabled breakpoint's ignore count isn't updated when
# the bp is encountered.

if ![runto_main] then {
    fail "enable/disable break tests suppressed"
}

with_test_prefix "disabled breakpoint ignore count" {
    set bp [break_at marker1 " line $bp_location15"]
}

gdb_test "ignore $bp 10" \
    "Will ignore next 10 crossings of breakpoint \[0-9\]*.*" \
    "ignore break marker1 10"

gdb_test_no_output "disable $bp" "disable break marker1"

gdb_continue_to_end "no stop at ignored & disabled break marker1"

with_test_prefix "run $count" {
    rerun_to_main
}

gdb_test "info break $bp" \
    "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+keep\[ \t\]+n.*ignore next 10 hits.*" \
    "info ignored & disabled break marker1"

# Verify that GDB correctly handles the "continue" command with an argument,
# which is an ignore count to set on the currently stopped-at breakpoint.
# (Also verify that GDB gracefully handles the case where the inferior
# isn't stopped at a breakpoint.)
#
if ![runto_main] then { fail "enable/disable break tests suppressed" }

gdb_test "break $bp_location1" \
    "Breakpoint \[0-9\]*.*, line $bp_location1.*" \
    "prepare to continue with ignore count"

gdb_test "continue 2" \
    "Will ignore next crossing of breakpoint \[0-9\]*.  Continuing..*" \
    "continue with ignore count"

gdb_test "next" ".*$bp_location11\[ \t\]*marker1.*" \
    "step after continue with ignore count"

set test "continue with ignore count, not stopped at bpt"
gdb_test_multiple "continue 2" "$test" {
    -re "Not stopped at any breakpoint; argument ignored.*$gdb_prompt $" {
	pass "$test"
    }
    -re "No breakpoint number -1.*$gdb_prompt $" {
	kfail gdb/1689 "$test"
    }
}

# Verify that GDB correctly handles the "enable/disable" command
# with arguments, that include multiple locations.
#
if ![runto_main] then { fail "enable/disable break tests suppressed" }

set b1 0
set b2 0
set b3 0
set b4 0
set b1 [break_at main ""]

with_test_prefix "2nd breakpoint" {
    set b2 [break_at main ""]
}

with_test_prefix "3rd breakpoint" {
    set b3 [break_at main ""]
}

with_test_prefix "4th breakpoint" {
    set b4 [break_at main ""]
}

# Perform tests for disable/enable commands on multiple
# locations and breakpoints.
#
# WHAT - the command to test (disable/enable).
#
# Note: tests involving location ranges (and more) are found in
# gdb.cp/ena-dis-br-range.exp.
#
proc test_ena_dis_br { what } {
    global b1
    global b2
    global b3
    global b4
    global gdb_prompt
    
    # OPPOS    - the command opposite to WHAT.
    # WHAT_RES - whether breakpoints are expected to end
    #            up enabled or disabled.
    # OPPOS_RES- same as WHAT_RES but opposite.
    # P1/P2    - proc to call (pass/fail).  Must be
    #            opposites.
    # Set variable values for disable command.
    set oppos "enable"
    set oppos_res "y"
    set what_res "n"
    set p1 "pass"
    set p2 "fail"

    if { "$what" == "enable" } {
	# Set varibale values for enable command.
	set oppos "disable"
	set oppos_res "n"
	set what_res "y"
	set p1 "fail"
	set p2 "pass"
    }

    # Now enable(disable) $b.1 $b2.1.
    gdb_test_no_output "$what $b1.1 $b2.1" "$what \$b1.1 \$b2.1"
    set test1 "${what}d \$b1.1 and \$b2.1"

    # Now $b1.1 and $b2.1 should be enabled(disabled).
    gdb_test_multiple "info break" "$test1" {
       -re "(${b1}.1)(\[^\n\r\]*)( n.*)(${b2}.1)(\[^\n\r\]*)( n.*)$gdb_prompt $" {
           $p1 "$test1"
       }
       -re ".*$gdb_prompt $" {
           $p2 "$test1"
       }
    }

    # Now enable(disable) $b1 fooo.1, it should give error on fooo.
    gdb_test "$what $b1 fooo.1" \
       "Bad breakpoint number 'fooo\\.1'" \
       "$what \$b1 fooo.1"

    # $b1 should be enabled(disabled).
    gdb_test "info break" \
       "(${b1})(\[^\n\r]*)( $what_res.*)" \
       "${what}d \$b1"

    gdb_test_no_output "$oppos $b3" "$oppos \$b3"
    gdb_test_no_output "$what $b4 $b3.1" "$what \$b4 \$b3.1"
    set test1 "${what}d \$b4 and \$b3.1,remain ${oppos}d \$b3"

    # Now $b4 $b3.1 should be enabled(disabled) and
    # $b3 should remain disabled(enabled).
    gdb_test_multiple "info break" "$test1" {
       -re "(${b3})(\[^\n\r]*)( $oppos_res.*)(${b3}.1)(\[^\n\r\]*)( n.*)(${b4})(\[^\n\r\]*)( $what_res.*)$gdb_prompt $" {
           $p1 "$test1"
       }
       -re "(${b3})(\[^\n\r]*)( $oppos_res.*)(${b4})(\[^\n\r\]*)( $what_res.*)$gdb_prompt $" {
           $p2 "$test1"
       }
    }

    # Now enable(disable) '$b4.1 fooobaar'.  This should error on
    # fooobaar.
    gdb_test "$what $b4.1 fooobaar" \
       "Bad breakpoint number 'fooobaar'" \
       "$what \$b4.1 fooobar"
    set test1 "${what}d \$b4.1"

    # $b4.1 should be enabled(disabled).
    gdb_test_multiple "info break" "$test1" {
        -re "(${b4}.1)(\[^\n\r\]*)( n.*)$gdb_prompt $" {
           $p1 "$test1"
       }
       -re ".*$gdb_prompt $" {
           $p2 "$test1"
       }
    }
}

test_ena_dis_br "disable"
test_ena_dis_br "enable"

gdb_exit
return 0
