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

if [use_gdb_stub] {
    return 0
}

load_lib gdb-python.exp

set libfile "py-events-shlib"
set libsrc  $srcdir/$subdir/$libfile.c
set lib_sl  [standard_output_file $libfile.so]
set lib_opts  debug

standard_testfile
set exec_opts [list debug shlib=$lib_sl]

if [get_compiler_info] {
    return -1
}

if { [gdb_compile_shlib $libsrc $lib_sl $lib_opts] != ""
     || [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != ""} {
    untested "failed to compile"
    return -1
}

# Start with a fresh gdb.
clean_restart ${testfile}

if { [skip_python_tests] } { continue }

set pyfile [gdb_remote_download host ${srcdir}/${subdir}/py-events.py]
gdb_test_no_output "source ${pyfile}" "load python file"

gdb_test "test-objfile-events" "Object file events registered."

gdb_breakpoint "main" {temporary}

gdb_test "run" ".*event type: new_objfile.*new objfile name.*" "new objfile notification"

gdb_test_no_output "set detach-on-fork off" ""

gdb_test "test-events" "Event testers registered."

gdb_breakpoint "first"
gdb_breakpoint "first"

# Test continue event and breakpoint stop event
gdb_test "continue" ".*event type: continue.*
.*event type: stop.*
.*stop reason: breakpoint.*
.*first breakpoint number: 2.*
.*breakpoint number: 2.*
.*breakpoint number: 3.*
all threads stopped.*"

# Test that when "step N" trips on a breakpoint, we get a stop event
# with breakpoint stop reason.
gdb_breakpoint "do_nothing"
gdb_test "step 3" ".*event type: continue.*
.*event type: stop.*
.*stop reason: breakpoint.*
.*first breakpoint number: 4.*
.*breakpoint number: 4.*
all threads stopped.*"

delete_breakpoints

# Test inferior call events

gdb_test_multiple "info threads" "get current thread" {
    -re "\[^\n\r\]*process (\[0-9\]+)\[^\n\r\]*do_nothing.*$gdb_prompt $" {
	set process_id $expect_out(1,string)
	pass "get current thread"
    }
}

gdb_test_multiple "print do_nothing" "get address of do_nothing" {
    -re "\[^\n\r\]*(0x\[0-9a-f\]+) \<do_nothing\>.*$gdb_prompt $" {
	set addr $expect_out(1,string)
	pass "get address of do_nothing"
    }
}

set expected [list "event type: pre-call"]
lappend expected "ptid: \\($process_id, $process_id, 0\\)" "address: $addr"
lappend expected "event type: post-call"
lappend expected "ptid: \\($process_id, $process_id, 0\\)" "address: $addr"
gdb_test_sequence "call do_nothing()" "" $expected

# Test register changed event
gdb_test_no_output {set $old_sp = $sp}
gdb_test_sequence {set $sp = 0} "" {
    "event type: register-changed"
    "frame: "
    "num: "
}
gdb_test_sequence {set $sp = 1} "" {
    "event type: register-changed"
    "frame: "
    "num: "
}
gdb_test_sequence {set $sp = $old_sp} "" {
    "event type: register-changed"
    "frame: "
    "num: "
}

# Test that no register_changed event is generated on "non-user"
# modifications
set test "up"
gdb_test_multiple {up} $test {
    -re "event type: register-changed.*\r\n$gdb_prompt $" {
	fail $test
    }
    -re "#1.*in first.*\r\n.*do_nothing.*\r\n$gdb_prompt $" {
	pass $test
    }
}

set test "down"
gdb_test_multiple {down} $test {
    -re "event type: register-changed.*\r\n$gdb_prompt $" {
	fail $test
    }
    -re "#0.*do_nothing.* at .*\r\n.*void do_nothing.*\r\n$gdb_prompt $" {
	pass $test
    }
}

set test "step"
# Note: This will step the inferior out of do_nothing and back into first.
gdb_test_multiple {step} $test {
    -re "event type: register-changed.*\r\n$gdb_prompt $" {
	fail $test
    }
    -re "first.* at .*\r\n$gdb_prompt $" {
	pass $test
    }
}

# Test memory changed event
gdb_test_no_output {set $saved = *(int*) $sp}
gdb_test_sequence {set *(int*) $sp = 0} "" {
    "event type: memory-changed"
    "address: "
    "length: "
}
gdb_test_sequence {set *(int*) $sp = $saved} "" {
    "event type: memory-changed"
    "address: "
    "length: "
}

# Test that no memory_changed event is generated on breakpoint
# activity
set test "break second"
gdb_test_multiple "break second" $test {
    -re "event type: memory-changed" {
	fail $test
    }
    -re "Breakpoint (\[0-9\]+) at .*\r\n$gdb_prompt $" {
	set second_breakpoint $expect_out(1,string)
	pass $test
    }

}

set test "continue to breakpoint $second_breakpoint"
set expected ".*event type: continue.*\r\n"
append expected ".*event type: stop.*\r\n"
append expected ".*stop reason: breakpoint.*\r\n"
append expected ".*all threads stopped.*\r\n$gdb_prompt $"

gdb_test_multiple "continue" $test {
    -re "event type: memory-changed.*\r\n$gdb_prompt $" {
	fail $test
    }
    -re $expected {
	pass $test
    }
}

gdb_test_no_output "delete $second_breakpoint"

#test exited event.
gdb_test "continue" ".*event type: continue.*
.*clear_objfiles\[\r\n\]*progspace: .*py-events.*
.*event type: exit.*
.*exit code: 12.*
.*exit inf: 1.*
dir ok: True.*" "Inferior 1 terminated."

gdb_test "inferior 2" ".*Switching to inferior 2.*"
gdb_test "continue" ".*event type: continue.*
.*event type: exit.*
.*exit code: 12.*
.*exit inf: 2.*
dir ok: True.*" "Inferior 2 terminated."


# Test before_prompt event.
gdb_py_test_multiple "define new user command" \
    "define xxz" "End with a line saying just .end.." \
    "set variable \$x = 72" "" \
    "set variable \$y = 93" "" \
    "end" ""

gdb_py_test_multiple "add before_prompt listener" \
    "python" "" \
    "count = 0" "" \
    "def listener():" "" \
    "  global count" "" \
    "  count = count + 1" "" \
    "gdb.events.before_prompt.connect(listener)" "" \
    "end" ""

gdb_test_no_output "set variable \$x = 32" "do something"
# Result is due to one emitted before "set var" and one emitted before
# this command.
gdb_test "python print(count)" 2 "check for before_prompt event"

gdb_test_no_output "xxz" "run a canned sequence"
gdb_test "python print(count)" 4 "check for before_prompt event"
