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

standard_testfile

if [prepare_for_testing "failed to prepare for testing" \
    ${testfile} ${srcfile} {debug}] {
    return -1
}

# Pretend there's no terminal.
gdb_test_no_output "set interactive-mode off"

if ![runto_main] {
    return -1
}

# Delete breakpoints so that the next resume is a plain continue,
# instead of a step-over-breakpoint sequence just while GDB sends the
# interrupt request.  If that's buggy on some targets (and it was on
# target remote for a while, where a ctrl-c at the wrong time will get
# lost), then it should get its own specific test.  Disable
# confirmation, avoiding complications caused by the fact that we've
# disabled the terminal -- GDB would auto-answer "yes", confusing
# gdb_test_multiple.
gdb_test_no_output "set confirm off"
gdb_test_no_output "delete"
gdb_test_no_output "set confirm on"

set async_supported -1
set test "continue &"
gdb_test_multiple $test $test {
    -re "Continuing\\.\r\n$gdb_prompt $" {
	set async_supported 1
	pass $test
    }
    -re ".*Asynchronous execution not supported on this target..*" {
	unsupported $test
    }
}
if { $async_supported < 0 } {
    return 1
}

# With native debugging, and no terminal (emulated by interactive-mode
# off, above), GDB had a bug where "interrupt" would send SIGINT to
# its own process group, instead of the inferior's.
set test "interrupt"
gdb_test_multiple $test $test {
    -re "interrupt\r\n$gdb_prompt " {
	pass $test
    }
}

set test "inferior received SIGINT"
gdb_test_multiple "" $test {
    -re "\r\nProgram received signal SIGINT.*" {
	# This appears after the prompt, which was already consumed
	# above.
	pass $test
    }
}
