# Copyright 2012-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/>.

if {[skip_shlib_tests]} {
    return 0
}

load_lib mi-support.exp

standard_testfile pending.c
set libfile1 "pendshr1"
set libfile2 "pendshr2"
set executable $testfile
set libsrc1  $srcdir/$subdir/$libfile1.c
set libsrc2  $srcdir/$subdir/$libfile2.c
set lib_sl1  [standard_output_file pendshr1.sl]
set lib_sl2  [standard_output_file pendshr2.sl]
set lib_opts "debug"

if { [gdb_compile_shlib $libsrc1 $lib_sl1 $lib_opts] != ""
     || [gdb_compile_shlib $libsrc2 $lib_sl2 $lib_opts] != ""} {
    untested "Could not compile either $libsrc1 or $libsrc2"
    return -1
}

set MIFLAGS "-i=mi"

set exec_opts [list debug shlib=$lib_sl1 shlib_load]
if { [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != "" } {
    untested "Failed to compile $srcfile"
    return -1
}

proc test_insert_delete_modify { } {
    global mi_gdb_prompt

    gdb_exit
    if [mi_gdb_start] {
	continue
    }

    mi_run_to_main

    mi_gdb_test "break marker" \
	{(&.*)*.*~"Breakpoint 2 at.*\\n".*=breakpoint-created,bkpt=\{number="2",type="breakpoint".*\}.*\n\^done}

    # Verify that '=breakpoint-modified' notification is correctly emitted:

    # 1. when modifying command
    send_gdb "commands\n"
    gdb_expect {
	-re "End with" {
	}
    }

    send_gdb "silent\nend\n"
    set test "change command"
    gdb_expect {
	-re ".*=breakpoint-modified.*${mi_gdb_prompt}$" {
	    pass $test
	}
	-re ".*${mi_gdb_prompt}$" {
	    fail $test
	}
	timeout {
	    fail "$test (timeout)"
	}
    }

    # Verify that '=breakpoint-created' notification is correctly emittd when
    # creating any type of breakpoint.

    set test "watch watch"
    mi_gdb_test ${test} \
	{(&.*)*.*~".*atchpoint 3: .*\\n".*=breakpoint-created,bkpt=\{number="3",type="(hw |)watchpoint".*\}.*\n\^done} \
	$test
    set test "trace marker"
    mi_gdb_test $test \
	{(&.*)*.*~"Tracepoint 4 at .*\\n".*=breakpoint-created,bkpt=\{number="4",type="tracepoint".*\}.*\n\^done} \
	$test
    set test "catch syscall"
    mi_gdb_test $test \
	{(&.*)*.*~"Catchpoint 5 .*\\n".*=breakpoint-created,bkpt=\{number="5",type="catchpoint".*\}.*\n\^done} \
	$test
    set test "dprintf marker, \"arg\" \""
    mi_gdb_test $test \
	{.*=breakpoint-created,bkpt=\{number="6",type="dprintf".*,script=\{\"printf \\\\\"arg\\\\\" \\\\\"\",\"continue\"\}.*\}\r\n\^done} \
	$test

    # 2. when modifying condition
    set test "condition 2 main > 0x0"
    mi_gdb_test $test \
	{.*=breakpoint-modified,bkpt=\{number="2",.*,cond=\"main > 0x0\".*\}.*\n\^done} \
	$test

    # 3. when modifying enableness
    set test "disable 3"
    mi_gdb_test $test \
	{.*=breakpoint-modified,bkpt=\{number="3",.*,enabled=\"n\".*\}.*\n\^done} \
	$test
    set test "enable 3"
    mi_gdb_test $test \
	{.*=breakpoint-modified,bkpt=\{number="3",.*,enabled=\"y\".*\}.*\n\^done} \
	$test
    # 4. when modifying ignore count.
    set test "ignore 5 1"
    mi_gdb_test $test \
	{.*=breakpoint-modified,bkpt=\{number="5",.*,ignore=\"1\".*\}.*\n\^done} \
	$test
    # 5. when modifying pass count.
    set test "passcount 1 4"
    mi_gdb_test $test \
	{.*=breakpoint-modified,bkpt=\{number="4",.*pass="1".*\}.*\n\^done} \
	$test

    # Delete some breakpoints and verify that '=breakpoint-deleted
    # notification is correctly emitted.
    for {set i 3} {$i < 7} {incr i} {
	mi_gdb_test "delete ${i}" ".*=breakpoint-deleted,id=\"${i}\".*\\^done" \
	    "delete ${i}"
    }
}

test_insert_delete_modify

# Test 'breakpoint-modified' notification is emited when pending breakpoints are
# resolved.

proc test_pending_resolved { } {
    with_test_prefix "pending resolved" {
	global decimal hex
	global srcdir
	global subdir
	global binfile
	global lib_sl1 lib_sl2
	global mi_gdb_prompt

	gdb_exit
	if [mi_gdb_start] {
	    continue
	}
	mi_gdb_reinitialize_dir $srcdir/$subdir
	mi_gdb_load ${binfile}
	mi_load_shlibs $lib_sl1 $lib_sl2

	# Create a pending breakpoint on pendfunc1
	mi_gdb_test "-break-insert -f pendfunc1" \
	    {.*\^done,bkpt=.*addr=\"<PENDING>\".*} \
	    "insert breakpoint on pendfunc1"
	mi_run_cmd

	set test "breakpoint on pendfunc1 resolved"
	gdb_expect {
	    -re ".*=breakpoint-modified,bkpt=\{number=\"1\".*addr=\"${hex}\".*,times=\"0\"" {
		pass $test
		exp_continue
	    }
	    -re ".*=breakpoint-modified,bkpt=\{number=\"1\".*addr=\"${hex}\".*,times=\"1\"" {
		pass "$test: hit_count is updated"
	    }
	    -re ".*${mi_gdb_prompt}$" {
		fail $test
	    }
	    timeout {
		fail "$test (timeout)"
	    }
	}
	mi_expect_stop "breakpoint-hit" "pendfunc1" ""\
	    ".*" ".*" {"" "disp=\"keep\""} \
	    "continue to pendfunc1 breakpoint"

	# Delete breakpoint on pendfunc1
	mi_gdb_test "-break-delete 1" {\^done} \
	    "delete breakpoint on pendfunc1"
	# Insert breakpoint on marker
	mi_gdb_test "-break-insert marker" {.*\^done,bkpt=.*} \
	    "insert breakpoint on marker"
	# Create a pending breakpoint on pendfunc3
	mi_gdb_test "-break-insert -f pendfunc3" \
	    {.*\^done,bkpt=.*addr=\"<PENDING>\".*} \
	    "insert breakpoint on pendfunc3"

	mi_execute_to "exec-continue" "breakpoint-hit" "marker" ".*" ".*" ".*" \
	    {"" "disp=\"keep\""} "continue to marker 1"

	mi_send_resuming_command "exec-continue" "continuing execution to marker"

	set test "breakpoint on pendfunc3 resolved"
	gdb_expect {
	    -re ".*=breakpoint-modified,bkpt=\{number=\"2\".*addr=\"${hex}\",.*func=\"marker\",.*times=\"1\"" {
		pass "$test: hit_count is updated"
		exp_continue
	    }
	    -re ".*=breakpoint-modified,bkpt=\{number=\"3\".*addr=\"${hex}\",.*func=\"pendfunc3\",.*times=\"0\"" {
		pass $test
	    }
	    -re ".*${mi_gdb_prompt}$" {
		fail $test
	    }
	    timeout {
		fail "$test (timeout)"
	    }
	}
	mi_expect_stop "breakpoint-hit" "marker" ".*" ".*" ".*" \
	    {"" "disp=\"keep\""} "continue to marker 2"

	mi_send_resuming_command "exec-continue" "continuing to exit"
	set test "breakpoint on pendfunc3 pending again"
	gdb_expect {
	    -re ".*=breakpoint-modified,bkpt=\{number=\"3\".*addr=\"<PENDING>\"" {
		pass $test
	    }
	    -re ".*${mi_gdb_prompt}$" {
		fail $test
	    }
	    timeout {
		fail "$test (timeout)"
	    }
	}

	mi_expect_stop "exited-normally" "" "" "" "" "" ""
    }
}

test_pending_resolved
