#   Copyright 1988, 1990, 1991, 1992, 1994, 1995, 1996, 1997, 1999, 2000,
#   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/>.

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

if $tracelevel then {
    strace $tracelevel
}

#
# test running programs
#

set testfile a2-run
if { [prepare_for_testing ${testfile}.exp $testfile run.c] } {
    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 "mips-idt-*" "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.
setup_xfail "mips-idt-*"
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.
setup_xfail "mips-idt-*"
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"
}
