# This testcase is part of GDB, the GNU debugger.
#
# Copyright 2013-2021 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/>.

# Test relies on checking gdb debug output. Do not run if gdb debug is
# enabled as any debug will be redirected to the log.
if [gdb_debug_enabled] {
    untested "debug is enabled"
    return 0
}

standard_testfile

# The test program exits after a while, in case GDB crashes.  Make it
# wait at least as long as we may wait before declaring a time out
# failure.
set options { "additional_flags=-DTIMEOUT=$timeout" debug }
if { [build_executable ${testfile}.exp ${testfile} $srcfile $options] == -1 } {
    return -1
}

# Return 0 on success, non-zero otherwise.

proc do_test { pass } {
    global testfile gdb_prompt binfile pf_prefix

    if ![runto_main] {
	return -1
    }

    gdb_breakpoint "${testfile}.c:[gdb_get_line_number "loop-line" ${testfile}.c]" \
		   temporary

    # gdb_continue_to_breakpoint would print a pass message.
    gdb_test "continue" "Temporary breakpoint .* loop-line .*" ""

    gdb_test_no_output "set range-stepping off" ""
    gdb_test_no_output "set debug infrun 1" ""

    set test "run a bit #$pass"
    set abort 1
    gdb_test_multiple "step" $test {
	-re {\[infrun\] process_event_stop_test: stepping inside range} {
	    # Suppress pass $test
	    verbose -log "$pf_prefix $test: ran"
	    set abort 0
	}
    }
    if $abort {
	verbose -log "$pf_prefix $test: did not run"
	return $abort
    }

    set gdb_pid [exp_pid -i [board_info host fileid]]
    remote_exec host "kill -TERM ${gdb_pid}"

    set test "expect eof #$pass"
    set abort 1
    set stepping 0
    # If GDB mishandles the SIGTERM and doesn't exit, this should FAIL
    # with timeout.  We don't expect a GDB prompt, so we see one,
    # we'll FAIL too.
    gdb_test_multiple "" $test {
	eof {
	    verbose -log "$pf_prefix $test: got eof"
	    set abort 0
	}
	-re {\[infrun\] process_event_stop_test: stepping inside range} {
	    incr stepping
	    exp_continue
	}
    }
    verbose -log "$pf_prefix $test: stepped $stepping times"
    return $abort
}

# Testcase was FAILing approx. on 10th pass with unpatched GDB.
# 50 runs should be approx. a safe number to be sure it is fixed now.
set passes 50

for {set pass 0} {$pass < $passes} {incr pass} {
    clean_restart ${testfile}
    if { [do_test $pass] != 0 } {
	break
    }
}

gdb_assert {$pass == $passes} "$passes SIGTERM passes"
