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

set testfile async-shell

if { ![support_displaced_stepping] } { 
    unsupported "displaced stepping"
    return -1
}

# The testfile uses "run".  The real bug happened only for ![is_remote target].
if [target_info exists use_gdb_stub] {
    return 0
}

if { [prepare_for_testing ${testfile}.exp ${testfile}] } {
    return -1
}

set gdbindex_warning_re "warning: Skipping \[^\r\n\]+ \\.gdb_index section \[^\r\n\]*\r\nDo \"set use-deprecated-index-sections on\" before the file is read\r\nto use the section anyway\\."

gdb_test_no_output "set target-async on "
gdb_test_no_output "set non-stop on"
gdb_test "run &" "Starting program: \[^\r\n\]*(\r\n$gdbindex_warning_re)?"

# `sleep 5' here would workaround the bug, do not sleep here.
# "shell" could eat waitpid event from the asynchronous inferior process.

gdb_test "shell echo foo" "foo"

set test "interrupt"
gdb_test_multiple $test $test {
    -re "interrupt\r\n$gdb_prompt " {
	pass $test
    }
}

set test "process stopped"
gdb_test_multiple "" $test {
    -re "\r\n\\\[process \[0-9\]+\\\] #1 stopped\\\.\r\n" {
	pass $test
    }
}
