#   Copyright 1988, 1990, 1991, 1992, 1994, 1995, 1996, 1997, 1999, 2000,
#   2007, 2008 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 "run"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    untested a2-run.exp
    return -1
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

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