# Copyright 1994-2013 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
}


set testfile interrupt
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

set options { debug }
if { ! [target_info exists gdb,nosignals] } {
    lappend options "additional_flags=-DSIGNALS"
}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable $options] != "" } {
     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" }
	    -re "Undefined command.*$gdb_prompt " { fail "echo data" }
	    timeout { fail "echo data (timeout)" }
	    eof { fail "echo data (eof)" }
	}

 	if { ! [target_info exists gdb,nosignals] } {
	    # Wait until the program is in the read system call again.
	    sleep 2

	    # Stop the program for another test.
	    set msg "Send Control-C, second time"
	    send_gdb "\003"
	    gdb_test_multiple "" "$msg" {
		-re "Program received signal SIGINT.*$gdb_prompt $" {
		    pass "$msg"
		}
	    }

	    # The "signal" command should deliver the correct signal and
	    # return to the loop.
	    set msg "signal SIGINT"
	    gdb_test_multiple "signal SIGINT" "$msg" {
		-re "^signal SIGINT\r\nContinuing with signal SIGINT.\r\n(\r\n|)$" { pass "$msg" }
	    }

	    # We should be back in the loop.
	    send_gdb "more data\n"
	    gdb_expect {
		-re "^(\r\n|)more data\r\n(|more data\r\n)$" { pass "echo more data" }
		timeout { fail "echo more data (timeout)" }
		eof { fail "echo more data (eof)" }
	    }
	}

	send_gdb "\004"
	gdb_expect {
	    -re "end of file.*$inferior_exited_re 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
