#   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 prms_id 0
set bug_id 0

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 {
    send_gdb "set args main\n"
} else {
    send_gdb "set args\n"
}
gdb_expect -re "$gdb_prompt $"

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 {
   send_gdb "set args vxmain \"6\"\n"
} else {
	send_gdb "set args 6\n"
}
gdb_expect -re "$gdb_prompt $"
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 {
    send_gdb "run `echo 8`\n"
    gdb_expect {
	-re "Starting program.*40320.*$gdb_prompt $" {
	    pass "run \"$testfile\" with shell"
	}
	-re ".*$gdb_prompt $" {
	    fail "run \"$testfile\" with shell"
	}
	timeout	{
	    fail "(timeout) run \"$testfile\" with shell"
	}
    }
}

# Reset the default arguments for VxWorks
if [istarget "*-*-vxworks*"] then {
    send_gdb "set args main\n"
    gdb_expect -re ".*$gdb_prompt $" {}
}
