# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000
# 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

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}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

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
