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

# Copyright 1997-2013 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 ${testfile}.exp ${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_location9 [gdb_get_line_number "set breakpoint 9 here" $srcfile2]
set bp_location11 [gdb_get_line_number "set breakpoint 11 here"]
set bp_location13 [gdb_get_line_number "set breakpoint 13 here" $srcfile2]
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_location16 [gdb_get_line_number "set breakpoint 16 here" $srcfile2]
set bp_location17 [gdb_get_line_number "set breakpoint 17 here" $srcfile2]
set bp_location18 [gdb_get_line_number "set breakpoint 18 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 "$test"
	}
    }
    return $bp
}

set bp [break_at "marker1" " line ($bp_location15|$bp_location16)"]

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"

# 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|$bp_location9)"]

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"

# 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"

# Verify that we don't stop at a disabled breakpoint.
gdb_continue_to_end "no stop"
rerun_to_main
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|$bp_location18)"]

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|$bp_location18).*" \
    "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|$bp_location13).*"]

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"]

set bp2 [break_at marker1 " line ($bp_location15|$bp_location16)"]

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|$bp_location16).*" \
    "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"
}

set bp [break_at "marker1" " line ($bp_location15|$bp_location16).*"]

# 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"

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"
rerun_to_main

# 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"
}

set bp [break_at marker1 " line ($bp_location15|$bp_location16).*"]

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"

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

gdb_test "continue" \
    ".*marker1 .*:($bp_location15|$bp_location16).*" \
    "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"
}

set bp [break_at marker1 " line ($bp_location15|$bp_location16)"]

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

gdb_test_no_output "disable $bp" "disable break marker1"

gdb_continue_to_end "no stop at ignored & disabled break marker1"
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 ""]
set b2 [break_at main ""]
set b3 [break_at main ""]
set b4 [break_at main ""]

# Perform tests for disable/enable commands on multiple
# locations and breakpoints.
#
# WHAT - the command to test (disable/enable).
#
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'" \
       "$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 and
    # it should give warning on fooobaar.
    gdb_test "$what $b4.1 fooobaar" \
       "warning: bad breakpoint number at or near '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
