#   Copyright 1988, 1990, 1991, 1992, 1994, 1995, 1996, 1997, 1999, 2000,
#   2007, 2008, 2009, 2010 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 {
	 "Program exited 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>.*Program exited with code 01\.\r\n$gdb_prompt $" {
	    pass "run \"$testfile\" with no args"
	    pass "no spurious messages at program exit"
	}
	-re ".*usage:  factorial <number>.*Program exited 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.*Program exited 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.*Program exited 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 {
	 "Program exited 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 strongarm-*-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 {
	 "Program exited 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 strongarm-*-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 {
	 "Program exited 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 {
	 "Program exited 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 strongarm-*-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"
}
