# Copyright (C) 2008-2020 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/>.

# This file is part of the GDB testsuite.  It tests PR 19743.

load_lib mi-support.exp
set MIFLAGS "-i=mi2"

gdb_exit
if [mi_gdb_start] {
    continue
}

standard_testfile
set pyfile ${testfile}-gdb.py

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    untested "failed to compile"
    return -1
}

if { [mi_skip_python_tests] } { continue }

set remote_python_file [gdb_remote_download host ${srcdir}/${subdir}/${pyfile}]

mi_delete_breakpoints
mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_test "set auto-load safe-path ${remote_python_file}" \
    {.*\^done} \
    "set safe-path"

if [is_remote host] {
    set filename ${testfile}
    remote_download host ${binfile} ${filename}
} else {
    set filename ${binfile}
}

mi_gdb_test "-file-exec-and-symbols ${filename}"  ".*\\^done" "file-exec-and-symbols operation"
mi_run_to_main


# register the python event handlers with test-events command
mi_gdb_test "test-events" \
    ".*~\"Event testers registered.*\\^done" \
    "register events"


set lineno [gdb_get_line_number "i++;"]

# set a breakpoint into the for loop
mi_gdb_test "break ${srcfile}:$lineno" \
    ".*Breakpoint $decimal at 0x\[0-9a-fA-F\]+: file .*${srcfile}.*\\\.*\\^done" \
    "set the breakpoint"


# resume the program
mi_execute_to "exec-continue" "breakpoint-hit" "main" "" ".*$srcfile" "$lineno" { "" "disp=\"keep\"" } "continue"


# test the python event handlers execution. The following checks are performed:
# - python continue handler is executed
# - the continue handler prints "info breakpoints" output in console format
# - breakpoint is hit and python stop handler is executed
# - the stop handler prints "info breakpoints" output in console format

mi_gdb_test "python print (stop_handler_str)" \
".*stop_handler.*Num.*Type.*Disp.*Enb.*Address.*$decimal.*breakpoint.*keep.*y.* 0x\[0-9a-fA-F\]+.*${srcfile}.*" \
"python stop handler ran"

mi_gdb_test "python print (cont_handler_str)" \
".*continue_handler.*Num.*Type.*Disp.*Enb.*Address.*$decimal.*breakpoint.*keep.*y.* 0x\[0-9a-fA-F\]+.*${srcfile}.*" \
"python continue handler ran"

mi_gdb_exit
