#   Copyright 1999, 2007, 2008, 2009, 2010, 2011
#   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/>.


if $tracelevel then {
    strace $tracelevel
}

#
# test running programs
#

set testfile "async"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } {
    untested async.exp
    return -1
}

if [get_compiler_info ${binfile}] {
    return -1
}

########################################
##
## Don't do any of these tests until we reach consensus on this file.
##
return 0
########################################

set board [target_info name]
set current_target [target_info gdb_protocol]
if { $current_target == "remote" } {
  unset_board_info "gdb_protocol"
  set_board_info "gdb_protocol" "async"
  } else {
      return 0
  }

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
if [target_info exists gdb_stub] {
    gdb_step_for_stub;
}

#
# set it up at a breakpoint so we can play with it
#
if ![runto_main] then {
    perror "couldn't run to breakpoint"
    continue
}

gdb_test "break baz" ".*" ""

#
# Make sure we get a 'completed' message when the target is done.
#
gdb_test "set display-exec-done on" ".*" ""


send_gdb "next&\n" 
gdb_expect {
    -re "^next&\r\n$gdb_prompt.*z = 9.*completed\.\r\n" { pass "next &" }
    -re "$gdb_prompt.*completed\.$" { fail "next &" }
    timeout  { fail "(timeout) next &" }
}

send_gdb "step&\n" 
gdb_expect {
    -re "^step&\r\n$gdb_prompt.*y = foo \\(\\).*completed\.\r\n" { pass "step &" }
    -re "$gdb_prompt.*completed\.$" { fail "step &" }
    timeout  { fail "(timeout) step &" }
}

send_gdb "step&\n" 
gdb_expect {
    -re "^step&\r\n$gdb_prompt foo \\(\\) at .*async.c.*x = 5.*completed\.\r\n" \
	    { pass "step &" }
    -re "$gdb_prompt.*completed\.$" { fail "step &" }
    timeout  { fail "(timeout) step &" }
}

send_gdb "stepi&\n" 
gdb_expect {
    -re "^stepi&\r\n$gdb_prompt.*$hex.*x = 5.*completed\.\r\n" { pass "stepi &" }
    -re "$gdb_prompt.*completed\.$" { fail "stepi &" }
    timeout  { fail "(timeout) stepi &" }
}

send_gdb "nexti&\n" 
gdb_expect {
    -re "^nexti&\r\n$gdb_prompt.*y = 3.*completed\.\r\n" { pass "nexti &" }
    -re "$gdb_prompt.*completed\.$" { fail "nexti &" }
    timeout  { fail "(timeout) nexti &" }
}

send_gdb "finish&\n" 
gdb_expect {
    -re "^finish&\r\nRun till exit from #0  foo \\(\\) at.*async.c.*\r\n$gdb_prompt.*$hex in main \\(\\) at.*async.c.*y = foo \\(\\).*Value returned is.*= 8.*completed\.\r\n" \
	    { pass "finish &" }
    -re "$gdb_prompt.*completed\.$" { fail "finish &" }
    timeout  { fail "(timeout) finish &" }
}

send_gdb "jump 33&\n" 
gdb_expect {
    -re "^jump 33&.*Continuing at $hex.*$gdb_prompt.*Breakpoint 2, baz \\(\\) at.*async.c.*return 5.*completed\.\r\n" \
	    { pass "jump &" }
    -re ".*$gdb_prompt.*completed\.$" { fail "jump &" }
    timeout  { fail "(timeout) jump &" }
}

send_gdb "until 35&\n" 
gdb_expect {
    -re "^until 35&.*$gdb_prompt.*$hex in main \\(\\) at.*async.c.*y = baz \\(\\).*completed\.\r\n" \
	    { pass "until &" }
    -re "$gdb_prompt.*completed\.$" { fail "until &" }
    timeout  { fail "(timeout) until &" }
}

gdb_test "set display-exec-done off" ".*" ""

unset_board_info "gdb_protocol"
set_board_info "gdb_protocol" "remote"






