# Copyright (C) 2010-2016 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 [target_info exists 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]
set pyfile ${srcdir}/${subdir}/${testfile}.py

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 "Could not compile either $libsrc or $srcdir/$subdir/$srcfile."
    return -1
}

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

if { [skip_python_tests] } { continue }

gdb_test_no_output "python exec (open ('${pyfile}').read ())" ""

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