# 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 { ![support_displaced_stepping] } { 
    unsupported "displaced stepping"
    return -1
}

load_lib gdb-python.exp

standard_testfile

if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    return -1
}

save_vars { GDBFLAGS } {
    append GDBFLAGS " -ex \"set non-stop on\""
    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-events" "Event testers registered."

gdb_breakpoint "main"
gdb_breakpoint "thread2"
gdb_breakpoint "thread3"

gdb_run_cmd
set test "run to breakpoint 1"
gdb_test_multiple "" $test {
    -re "event type: stop\r\nstop reason: breakpoint\r\nfirst breakpoint number: 1\r\nbreakpoint number: 1\r\nthread num: 1\r\n.*$gdb_prompt $" {
        pass $test
    }
    -re "The target does not support running in non-stop mode" {
        unsupported "non-stop mode is unsupported"
        return
    }
}

gdb_test "next" "event type: stop\r\nstop reason: breakpoint\r\nfirst breakpoint number: 2\r\nbreakpoint number: 2\r\nthread num: 2.*" "reached breakpoint 2"

gdb_test "thread 2" {\[Switching to thread 2 .*}

gdb_test "next" "event type: stop\r\nstop reason: breakpoint\r\nfirst breakpoint number: 3\r\nbreakpoint number: 3\r\nthread num: 3.*" "reached breakpoint 3"

gdb_test "thread 3" {\[Switching to thread 3 .*}

set test "continue thread 1"
gdb_test_multiple "continue&" $test {
    -re "event type: continue\r\nthread num: 3\r\n$gdb_prompt " {
	# This expect string must not expect the end-of-buffer '$'.
        pass $test
    }
}

set test "thread 3 was signaled"
gdb_test_multiple "" $test {
    -re "event type: stop\r\nstop reason: signal\r\nstop signal: SIGUSR1\r\nthread num: 3\r\nevent type: stop\r\n" {
        pass $test
    }
}
