# 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}] != "" } {
     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
