#   Copyright (C) 2013 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"
gdb_test_no_output "set target-async on"

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
    }
}
