#   Copyright 1988-2021 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 "failed to prepare" $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 5

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"

# The remaining tests pass inferior arguments through GDB, so doesn't
# work with stub targets, where GDB connects to debug an already started
# process.

if [use_gdb_stub] {
    verbose "Skipping rest of a2-run.exp because target is a stub."
    return
}

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