#   Copyright 1988-2016 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/>.

# This file was written by Rob Savoye. (rob@cygnus.com)

# Can't do this test without stdio support.
if [gdb_skip_stdio_test "a2run.exp"] {
    return
}

#
# test running programs
#

standard_testfile run.c

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

# Run with no arguments.
gdb_run_cmd

set saw_usage 0
set saw_exit_wrapper 0
set saw_spurious_output 0

set test "run \"$testfile\" with no args"

# Indirect spawn id lists.  Used to be able to disable the inferior
# and gdb's spawn_ids and regexes as soon as we see the expected
# output.
set inferior_spawn_list "$inferior_spawn_id"
set gdb_spawn_list "$gdb_spawn_id"

# Clear either the gdb or the inferior spawn_id list and iff
# afterwards we still have any spawn id in the indirect lists,
# continue expecting.
proc maybe_exp_continue {which} {
    global inferior_spawn_list gdb_spawn_list

    if {$which == "gdb"} {
	set gdb_spawn_list ""
    } elseif {$which == "inferior"} {
	set inferior_spawn_list ""
    } else {
	error "invalid parameter"
    }

    if {$inferior_spawn_list != "" || $gdb_spawn_list != ""} {
	exp_continue
    }
}

# Note that if $inferior_spawn_id != $gdb_spawn_id the order we pick
# output from each spawn id is undefined.
set res [gdb_test_multiple "" $test {
    -i inferior_spawn_list
    -re "usage:  factorial <number>" {
	set saw_usage 1
	maybe_exp_continue inferior
    }
    -re "EXIT code 1" {
	set saw_exit_wrapper 1
	maybe_exp_continue inferior
    }
    eof {
	if {$inferior_spawn_id != $gdb_spawn_id} {
	    # In this case we may see the server/inferior exit before
	    # GDB's program exit output.  Remove from spawn list and
	    # continue waiting.
	    maybe_exp_continue inferior
	} else {
	    # GDB crash.
	    fail "$test (eof)"
	}
    }

    -i gdb_spawn_list

    -re "$inferior_exited_re with code 01.\r\n$gdb_prompt $" {
	maybe_exp_continue gdb
    }
    -re "$inferior_exited_re with code 01.*$gdb_prompt $" {
	set saw_spurious_output 1
	maybe_exp_continue gdb
    }

    -re "$inferior_exited_re normally.\r\n$gdb_prompt $" {
	# This is only considered a pass if we see the exit wrapper
	# status.
	maybe_exp_continue gdb
    }
    -re "$inferior_exited_re normally.*$gdb_prompt $" {
	set saw_spurious_output 1
	maybe_exp_continue gdb
    }
}]

if {$res == 0} {
    gdb_assert ${saw_usage} $test

    if {$saw_exit_wrapper} {
	set msg "$test (exit wrapper)"
    } else {
	set msg $test
    }

    gdb_assert !$saw_spurious_output "no spurious messages at program exit"

}

# The remaining tests don't work for targets can't take arguments...

if [target_info exists noargs] then {
    verbose "Skipping rest of a2-run.exp because of noargs."
    return
}

# Now run with some arguments
setup_xfail "arm-*-coff"
gdb_run_cmd 5
gdb_test_stdio "" "120" "" "run \"$testfile\" with arg"

# Run again with same arguments.
gdb_run_cmd

setup_xfail "arm-*-coff"
gdb_test_stdio "" "120" "" "run \"$testfile\" again with same args"

# Use "set args" command to specify no arguments as default and run again.
gdb_test_no_output "set args"

gdb_run_cmd

gdb_test_stdio "" "usage:  factorial <number>" "" "run after setting args to nil"

# Use "set args" command to specify an argument and run again.
gdb_test_no_output "set args 6"

gdb_run_cmd

setup_xfail "arm-*-coff"
gdb_test_stdio "" "720" "" "run \"$testfile\" again after setting args"

# GOAL: Test that shell is being used with "run".  For remote debugging
# targets, there is no guarantee that a "shell" (whatever that is) is used.
if ![is_remote target] then {
    gdb_test_stdio "run `echo 8`" \
	"40320" "" "run \"$testfile\" with shell"
}
