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

# 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.
# On VxWorks this justs make sure the program was run.
gdb_run_cmd

if [istarget "*-*-vxworks*"] then {
    set timeout 120
    verbose "Timeout is now $timeout seconds" 2
    gdb_expect {
	 "$inferior_exited_re normally" {
	    unresolved "run \"$testfile\" with no args"
	}
	 -re "usage:  factorial <number>" {
	    pass "run \"$testfile\" with no args"
	}
	timeout	{
	    fail "(timeout) run \"$testfile\" with no args"
	}
    }
    set timeout 10
    verbose "Timeout is now $timeout seconds" 2
    gdb_expect -re "$gdb_prompt $" {}
} else {
    gdb_expect {
	-re ".*usage:  factorial <number>.*$inferior_exited_re with code 01.\r\n$gdb_prompt $" {
	    pass "run \"$testfile\" with no args"
	    pass "no spurious messages at program exit"
	}
	-re ".*usage:  factorial <number>.*$inferior_exited_re with code 01.*$gdb_prompt $" {
	    pass "run \"$testfile\" with no args"
	    fail "no spurious messages at program exit"
	}
	-re ".*usage:  factorial <number>.* EXIT code 1.*$inferior_exited_re normally.\r\n$gdb_prompt $" {
	    pass "run \"$testfile\" with no args (exit wrapper)"
	    pass "no spurious messages at program exit"
	}
	-re ".*usage:  factorial <number>.* EXIT code 1.*$inferior_exited_re normally.*$gdb_prompt $" {
	    pass "run \"$testfile\" with no args (exit wrapper)"
	    fail "no spurious messages at program exit"
	}
	-re ".*$gdb_prompt $" {
	    fail "run \"$testfile\" with no args"
	    verbose "expect_out is $expect_out(buffer)" 2
	}
	timeout	{
	    fail "(timeout) run \"$testfile\" no args"
	}
    }
}

# 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
if [istarget "*-*-vxworks*"] then {
    send_gdb "run vxmain \"5\"\n"
    gdb_expect -re "run vxmain \"5\"\r\n" {}
    set timeout 120
    verbose "Timeout is now $timeout seconds" 2
    gdb_expect {
	 "$inferior_exited_re normally" {
	    unresolved "run \"$testfile\" with arg"
	}
	 "120" {
	    pass "run \"$testfile\" with arg"
	}
	timeout {
	    fail "(timeout) run \"$testfile\" with arg"
	}
    }
    set timeout 10
    verbose "Timeout is now $timeout seconds" 2
    gdb_expect -re "$gdb_prompt $" {}
} else {
	setup_xfail "arm-*-coff"
	gdb_run_cmd 5
	gdb_expect {
	    -re ".*120.*$gdb_prompt $"\
				{ pass "run \"$testfile\" with arg" }
	    -re ".*$gdb_prompt $"	{ fail "run \"$testfile\" with arg" }
	    timeout		{ fail "(timeout) run \"$testfile\" with arg" }
	}
}

# Run again with same arguments.
gdb_run_cmd

if [istarget "*-*-vxworks*"] then {
    set timeout 120
    verbose "Timeout is now $timeout seconds" 2
    gdb_expect {
	 "$inferior_exited_re normally" {
	    unresolved "run \"$testfile\" again with same args"
	}
	 "120" { pass "run \"$testfile\" again with same args" }
	timeout { fail "(timeout) run \"$testfile\" again with same args" }
    }
    set timeout 10
    verbose "Timeout is now $timeout seconds" 2
    gdb_expect -re "$gdb_prompt $" {}
} else {
    setup_xfail "arm-*-coff"
    gdb_expect {
	    -re ".*120.*$gdb_prompt $"\
				{ pass "run \"$testfile\" again with same args" }
	    -re ".*$gdb_prompt $"	{ fail "run \"$testfile\" again with same args" }
	    timeout		{ fail "(timeout) run \"$testfile\" again with same args" }
	}
}

# Use "set args" command to specify no arguments as default and run again.
if [istarget "*-*-vxworks*"] then {
    gdb_test_no_output "set args main"
} else {
    gdb_test_no_output "set args"
}

gdb_run_cmd

if [istarget "*-*-vxworks*"] then {
    set timeout 120
    verbose "Timeout is now $timeout seconds" 2
    gdb_expect {
	 "$inferior_exited_re normally" {
	    unresolved "run after setting args to nil"
	}
	 "usage:  factorial <number>" {
	    pass "run after setting args to nil"
	}
	timeout {
	    fail "(timeout) run after setting args to nil"
	}
    }
    set timeout 10
    verbose "Timeout is now $timeout seconds" 2
    gdb_expect -re "$gdb_prompt $" {}
} else {
    gdb_expect {
	-re ".*usage:  factorial <number>.*$gdb_prompt $" {
	    pass "run after setting args to nil"
	}
	-re ".*$gdb_prompt $" {
	    fail "run after setting args to nil"
	}
	timeout {
	    fail "(timeout) run after setting args to nil"
	}
    }
}

# Use "set args" command to specify an argument and run again.
if [istarget "*-*-vxworks*"] then {
    gdb_test_no_output "set args vxmain \"6\""
} else {
    gdb_test_no_output "set args 6"
}

gdb_run_cmd

if [istarget "*-*-vxworks*"] then {
    set timeout 120
    verbose "Timeout is now $timeout seconds" 2
    gdb_expect {
	 "$inferior_exited_re normally" {
	    unresolved "run \"$testfile\" again after setting args"
	}
	 "720" {
	    pass "run \"$testfile\" again after setting args"
	}
	timeout {
	    fail "(timeout) run \"$testfile\" again after setting args"
	}
    }
    set timeout 10
    verbose "Timeout is now $timeout seconds" 2
    gdb_expect -re "$gdb_prompt $" {}
} else {
    setup_xfail "arm-*-coff"
    gdb_expect {
	    -re ".*720.*$gdb_prompt $" {
		pass "run \"$testfile\" again after setting args"
	    }
	    -re ".*$gdb_prompt $" {
		fail "run \"$testfile\" again after setting args"
	    }
	    timeout {
		fail "(timeout) 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 "run `echo 8`" \
	"Starting program.*40320.*" \
	"run \"$testfile\" with shell"
}

# Reset the default arguments for VxWorks
if [istarget "*-*-vxworks*"] then {
    gdb_test_no_output "set args main"
}
