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

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] {
    fail "can't run to 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
    }
}
