# Copyright 1994, 1995, 1996, 1997, 1998, 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/>.

if [target_info exists gdb,nointerrupts] {
    verbose "Skipping interrupt.exp because of nointerrupts."
    continue
}

if [target_info exists gdb,noinferiorio] {
    verbose "Skipping interrupt.exp because of noinferiorio."
    return
}

if $tracelevel then {
	strace $tracelevel
}

set prms_id 0
set bug_id 0

set testfile interrupt
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested interrupt.exp
     return -1
}

gdb_start


if ![file exists $binfile] then {
    perror "$binfile does not exist."
    return 0
} else {
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load $binfile
    # Hope this is unix :-)
    gdb_test "shell stty intr '^C'" "" \
	"set interrupt character in interrupt.exp"
    if [runto_main] then {
	send_gdb "continue\n"
	gdb_expect {
	    -re "\r\ntalk to me baby\r\n$" {
		pass "child process is alive"
	    }
	    timeout { fail "run (timeout)" }
	    eof { fail "run (eof)" }
	}
	# This should appear twice, once for the echo and once for the
	# program's output.  Under dejagnu (but not interactively) for
	# SunOS4, it only appears once.  Don't worry about it, I imagine
	# dejagnu has just done something to the tty modes.
	send_gdb "a\n"
	gdb_expect {
	    -re "^a\r\n(|a\r\n)$" {
		pass "child process ate our char"
	    }
	    timeout { fail "echo a (timeout)" }
	    eof { fail "echo a (eof)" }
	}
	# Wait until the program is in the read system call again.
	sleep 2

	# Cntrl-c may fail for simulator targets running on a BSD host.
	# This is the result of a combination of the read syscall
	# being restarted and gdb capturing the cntrl-c signal.

	# Cntrl-c may fail for simulator targets on slow hosts.
	# This is because there is a race condition between entering
	# the read and delivering the cntrl-c.

	send_gdb "\003"
	gdb_expect {
	    -re "Program received signal SIGINT.*$gdb_prompt $" {
		pass "send_gdb control C"
	    }
	    -re ".*$gdb_prompt $" { fail "send_gdb control C" }
	    timeout { fail "send_gdb control C (timeout)" }
	    eof { fail "send_gdb control C (eof)" }
	}

	send_gdb "p func1 ()\n"
	gdb_expect {
	    -re " = 4.*$gdb_prompt $" { pass "call function when asleep" }
	    -re ".*Program received signal SIG(SEGV|ILL).*$gdb_prompt $" {
		setup_xfail "i*86-pc-linux*-gnu*"
		fail "child died when we called func1, skipped rest of tests"
		return
	    }
	    -re "$gdb_prompt $" {
		# On HPUX-11.0 'send "p func1 ()"' above
		# terminates the program. A defect is pending on this
		# issue [defect #DTS CHFts24203]. Hence calling setup_xfail
		# below.
	        setup_xfail "hppa*-*-*11*" CHFts24203
		fail "call function when asleep (wrong output)"
	    }
	    default {

		# This fail probably happens whenever we use /proc (we
		# don't use PRSABORT), but apparently also happens on
		# other machines as well.

		setup_xfail "sparc*-*-solaris2*"
		setup_xfail "mips-*-ultrix*"
		setup_xfail "i*86-*-solaris2*"
		setup_xfail "*-*-sysv4*"
		setup_xfail "vax-*-*"
		setup_xfail "alpha-*-*"
		setup_xfail "*-*-*bsd*"
		setup_xfail "*-*-irix*"
		setup_xfail "*-*-hpux*"
		setup_xfail "*-*-*lynx*"
		fail "call function when asleep (stays asleep)"
		# Send_Gdb a newline to wake it up
		send_gdb "\n"
		gdb_test "" " = 4" "call function after waking it"
	    }
#	    eof { fail "call function when asleep (eof)" }
	}

	# Now try calling the function again.
	gdb_test "p func1 ()" " = 4" "call function a second time"

	# And the program should still be doing the same thing.
	# The optional trailing \r\n is in case we sent a newline above
	# to wake the program, in which case the program now sends it
	# back.  We check for it either here or in the next gdb_expect
	# command, because which one it ends up in is timing dependent.
	send_gdb "continue\n"
	# For some reason, i386-*-sysv4 gdb fails to issue the Continuing
	# message, but otherwise appears normal (FIXME).
	gdb_expect {
	    -re "^continue\r\nContinuing.\r\n(\r\n|)$" { pass "continue" }
	    -re "^continue\r\n\r\n" { fail "continue (missing Continuing.)" }
	    -re "$gdb_prompt $" { fail "continue" }
	    timeout { fail "continue (timeout)" }
	    eof { fail "continue (eof)" }
	}

	send_gdb "data\n"
	# The optional leading \r\n is in case we sent a newline above
	# to wake the program, in which case the program now sends it
	# back.
        # FIXME: The pattern below leads to an expected success on HPUX-11.0
        # but the success is spurious. Need to provide the right reg.expr.
        # here.
	gdb_expect {
	    -re "^(\r\n|)data\r\n(|data\r\n)$" { pass "echo data" }
	    timeout { fail "echo data (timeout)" }
	    eof { fail "echo data (eof)" }
	}

	setup_xfail "i*86-pc-linux*-gnu*"
	send_gdb "\004"
	gdb_expect {
	    -re "end of file.*Program exited normally.*$gdb_prompt $" {
		pass "send end of file"
	    }
	    -re "$gdb_prompt $" { fail "send end of file" }
	    timeout { fail "send end of file (timeout)" }
	    eof { fail "send end of file (eof)" }
	}
    }
}
return 0
