# Copyright 2003, 2004 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.  

# This file was written by Elena Zannoni (ezannoni@cygnus.com)

if $tracelevel then {
    strace $tracelevel
}


# are we on a target board? If so, don't run these tests.
# note: this is necessary because we cannot use runto_main (which would
# work for remote targets too) because of the different prompt we get
# when using annotation level 2.
#
if [is_remote target] then {
    return 0
}


#
# test running programs
#
set prms_id 0
set bug_id 0

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

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } {
    gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}


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

if [target_info exists gdb_stub] {
    gdb_step_for_stub;
}

#
# the line at which break main will put the breakpoint
#
set main_line 32

# The commands we test here produce many lines of output; disable "press 
# <return> to continue" prompts.
send_gdb "set height 0\n"
gdb_expect -re "$gdb_prompt $"

#
# break at main
#
gdb_test "break main" \
    "Breakpoint.*at.* file .*$srcfile, line.*" \
    "breakpoint main"


# NOTE: this prompt is OK only when the annotation level is > 1

# NOTE: When this prompt is in use the gdb_test procedure cannot be
# used because it assumes that the last char after the gdb_prompt is a
# white space. This is not true with this annotated prompt. So we must
# use send_gdb and gdb_expect or gdb_expect_list.

set old_gdb_prompt $gdb_prompt
set gdb_prompt "\r\n\032\032pre-prompt\r\n$gdb_prompt \r\n\032\032prompt\r\n"



#
# set the annotation level to 3
#
# of course, this will test:
# annotate-pre-prompt
# annotate-prompt
# annotate-post-prompt (in the next block)
#
send_gdb "set annotate 3\n" 
gdb_expect_list "annotation set at level 3" "\r\n$gdb_prompt$" {
    "set annotate 3"
}


#
# info break:
#
send_gdb "info break\n" 
gdb_expect_list "breakpoint info" "$gdb_prompt$" {
    "\r\n\032\032post-prompt\r\n"
    "Num Type           Disp Enb Address    +What\r\n"
    "1   breakpoint     keep y   0x\[0-9a-zA-Z\]+ +in main at .*annota3.c:32\r\n"
}


#
# run to a break point will test:
#
#exp_internal 1
send_gdb "run\n"
gdb_expect_list "run until main breakpoint" "$gdb_prompt$" {
    "\r\n\032\032post-prompt\r\n"
    "Starting program: .*annota3 \r\n"
    "\(\r\n\032\032\(frames-invalid|breakpoints-invalid\)\r\n\)+"
    "\r\n\032\032starting\r\n"
    "\(\r\n\032\032\(frames-invalid|breakpoints-invalid\)\r\n\)+"
    "\r\n\032\032breakpoint 1\r\n"
    "\r\n"
    "Breakpoint 1, main \\(\\) at .*annota3.c:32\r\n"
    "\r\n\032\032source.*annota3.c:32:.*:beg:0x\[0-9a-z\]+\r\n"
    "\r\n\032\032stopped\r\n"
}
#exp_internal 0
#exit 0

#
# Let's do a next, to get to a point where the array is initialized
# We don't care about the annotated output for this operation, it is the same as
# the one produced by run above
#
send_gdb "next\n" 
gdb_expect_list "go after array init line" "$gdb_prompt$" {
    "\r\n\032\032post-prompt\r\n"
    "\r\n\032\032starting\r\n"
    "\(\r\n\032\032frames-invalid\r\n\)+"
    "\r\n\032\032source .*annota3.c:\[0-9\]+:\[0-9\]+:beg:0x\[0-9a-z\]+\r\n"
    "\r\n\032\032stopped\r\n"
}


#
# printing the array:
#
send_gdb "print my_array\n"
gdb_expect_list "print array" "$gdb_prompt$" {
    "\r\n\032\032post-prompt\r\n"
    ".*= .1, 2, 3.\r\n"
}


#
# this should generate an error message, so to test:
# annotate-error-begin
# FIXME: annotate-error not tested
#

#exp_internal 1
send_gdb "print non_existent_value\n"
gdb_expect_list "print non_existent_value" "$gdb_prompt$" {
    "\r\n\032\032post-prompt\r\n"
    "\r\n\032\032error-begin\r\n"
    "No symbol \"non_existent_value\" in current context.\r\n"
    "\r\n\032\032error\r\n"
}


#
# break at signal handler
#
send_gdb "break handle_USR1\n"
gdb_expect_list "breakpoint handle_USR1" "$gdb_prompt$" {
    "\r\n\032\032post-prompt\r\n"
    "\r\n\032\032breakpoints-invalid\r\n"
    "Breakpoint.*at 0x\[0-9a-z\]+: file.*annota3.c, line.*\r\n"
}

# APPLE LOCAL: In gcc 4.0 on Mac OS X, setting a breakpoint on
# 'printf' actually sets a breakpoint on several functions
# (printf$LDBL64, printf$LDBL128).  This causes the output of "info
# break" and the breakpoint numbers to be different than those
# expected by this test-case.  There's really no reason this test-case
# needs to break on printf() proper, so the easiest fix is just to
# change the calls of printf() to sleep(), and change the two calls to
# printf() in annota3.c to calls to sleep().  We similarly change all
# references to "printf" here to references to "sleep."

#
# break at sleep. When we are stopped at sleep, we can test 
#
send_gdb "break sleep\n"
gdb_expect_list "breakpoint sleep" "$gdb_prompt$" {
    "\r\n\032\032post-prompt\r\n"
    "\r\n\032\032breakpoints-invalid\r\n"
    "Breakpoint.*at 0x\[0-9a-z\]+.*"
}

#
# get to sleep
#
send_gdb "continue\n"
gdb_expect_list "continue to sleep" "$gdb_prompt$" {
    "\r\n\032\032post-prompt\r\n"
    "Continuing.\r\n"
    "\r\n\032\032starting\r\n"
    "\r\n\032\032frames-invalid\r\n"
    "\r\n\032\032breakpoint 3\r\n"
    "\r\n"
    "Breakpoint 3, \[^\r\n\]*\r\n"
    "\r\n\032\032stopped\r\n"
}

send_gdb "backtrace\n"
gdb_expect_list "backtrace from shlibrary" "$gdb_prompt$" {
    "\r\n\032\032post-prompt\r\n"
    "#0 .* sleep \[^\r\n\]*\r\n"
    "#1 .* main \[^\r\n\]*\r\n"
}


#
# test printing a frame with some arguments: 
#
send_gdb "signal SIGUSR1\n"
gdb_expect_list "send SIGUSR1" "$gdb_prompt$" {
    "\r\n\032\032post-prompt\r\n"
    "Continuing with signal SIGUSR1.\r\n"
    "\r\n\032\032starting\r\n"
    "\r\n\032\032frames-invalid\r\n"
    "\r\n\032\032breakpoint 2\r\n"
    "Breakpoint 2, handle_USR1 \\(sig=\[0-9\]+\\) at .*annota3.c:\[0-9\]+\r\n"
    "\r\n\032\032source .*annota3.c:\[0-9\]+:\[0-9\]+:beg:0x\[0-9a-z\]+\r\n"
    "\r\n\032\032stopped\r\n"
}

if [target_info exists gdb,nosignals] {
    unsupported "send SIGUSR1"
    unsupported "backtrace @ signal handler"
} else {
    send_gdb "signal SIGUSR1\n"
    gdb_expect_list "send SIGUSR1" "$gdb_prompt$" {
	"\r\n\032\032post-prompt\r\n"
	"Continuing with signal SIGUSR1.\r\n"
	"\r\n\032\032starting\r\n"
	"\r\n\032\032frames-invalid\r\n"
	"\r\n\032\032breakpoint 2\r\n"
	"Breakpoint 2, handle_USR1 \\(sig=\[0-9\]+\\) at .*annota3.c:\[0-9\]+\r\n"
	"\r\n\032\032source .*annota3.c:\[0-9\]+:\[0-9\]+:beg:0x\[0-9a-z\]+\r\n"
	"\r\n\032\032stopped\r\n"
    }

    #
    # test:
    #
    verbose "match_max local is: [match_max]"
    verbose "match_max default is: [match_max -d]"
    # This is necessary because a 2000 buffer is not enought to get everything
    # up to the prompt ad the test gets a timeout.
    match_max 3000
    verbose "match_max now is: [match_max]"
    send_gdb "backtrace\n"
    gdb_expect_list "backtrace @ signal handler" "$gdb_prompt$" {
	"#0 +handle_USR1 \[^\r\n\]+\r\n"
	"#1 +.signal handler called.\r\n"
	"#2 .* sleep \[^\r\n\]+\r\n"
	"#3 .* main \[^\r\n\]+\r\n"
    }
}

#
# delete all the breakpoints
#
send_gdb "delete 1\n"
gdb_expect_list "delete bp 1" "$gdb_prompt$" {
    "\r\n\032\032post-prompt\r\n"
}

send_gdb "delete 2\n"
gdb_expect_list "delete bp 2" "$gdb_prompt$" {
    "\r\n\032\032post-prompt\r\n"
}

send_gdb "delete 3\n"
gdb_expect_list "delete bp 3" "$gdb_prompt$" {
    "\r\n\032\032post-prompt\r\n"
}

#
# break at main, after value is initialized. This is in preparation
# to test the annotate output for the display command.
#
send_gdb "break main\n"
gdb_expect_list "break at 28" "$gdb_prompt$" {
    "\r\n\032\032post-prompt\r\n"
    "\r\n\032\032breakpoints-invalid\r\n"
    "Breakpoint . at 0x\[0-9a-z\]+: file .*annota3.c, line 32.\r\n"
}

#
# display the value
#
send_gdb "display value\n"
gdb_expect_list "set up display" "$gdb_prompt$" {
    "\r\n\032\032post-prompt\r\n"
    "1: value = 7\r\n"
}


# should ask query. Test annotate-query.
# we don't care about anything else here, only the query.

send_gdb "run\n"
gdb_expect {
  -re "pre-query.*already.*\\(y or n\\).*query\r\n" {
         send_gdb "y\n"
         gdb_expect {
	     -re ".*post-query.*$gdb_prompt$" \
		     { pass "re-run" }
	     -re ".*$gdb_prompt$"  { fail "re-run" }
	     timeout { fail "re-run (timeout)" }
	 }
     }
  -re ".*$gdb_prompt$"  { fail "re-run" }
  timeout { fail "re-run (timeout)" }
}

#
# Test that breakpoints-invalid is issued once and only once for
# breakpoint ignore count changes, after annotation stopped.
#

# APPLE LOCAL:
#
# Unfortunately, gdb_expect_list doesn't allow you to capture subexpressions.
#
# I have to get the breakpoint number here, because the sleep breakpoint might
# generate an "equivalent breakpoint" somewhere else, putting off the count.
#
# This was originally implemented for printf(), and is probably no
# longer necessary since sleep() doesn't generate equivalent
# breakpoints like printf() does, but I'm leaving it in, as it's a
# generally positive change.

send_gdb "break 46\n"
gdb_expect {
    -re "Breakpoint (.) at $hex: file .*$srcfile, line 46.*$gdb_prompt$" {
	set break_46 $expect_out(1,string)
	pass "break at 46"
    }
    -re ".*$gdb_prompt$" { fail "break at 46" }
    timeout { fail "break at 46 (timeout)" }
}


send_gdb "ignore $break_46 4\n"
gdb_expect_list "ignore $break_46 4" "$gdb_prompt$" [format {
    "\r\n\032\032post-prompt\r\n"
    "Will ignore next 4 crossings of breakpoint %d"
    "\r\n\032\032breakpoints-invalid\r\n"
    "\r\n"
} $break_46]

send_gdb "continue\n"
gdb_expect_list "annotate ignore count change" "$gdb_prompt$" [format {
    "\r\n\032\032post-prompt\r\n"
    "\(\r\n\032\032frames-invalid\r\n\)+"
    "\r\n\032\032breakpoint %d\r\n"
    "Breakpoint %d, main \\(\\) at .*annota3.c:46\r\n"
    "\r\n\032\032source .*annota3.c:46:\[0-9\]+:beg:0x\[0-9a-z\]+\r\n"
    "1: value = 11\r\n"
    "\r\n\032\032stopped\r\n"
    "\r\n\032\032breakpoints-invalid\r\n"
} $break_46 $break_46]

# check that ignore command is working, or the above can provide
# misleading assurance ...

send_gdb "next\n"
gdb_expect_list "next to exit loop" "$gdb_prompt$"  {
    "\r\n\032\032post-prompt\r\n"
    "\r\n\032\032starting\r\n"
    "\(\r\n\032\032frames-invalid\r\n\)+"
    "\r\n\032\032source.*annota3.c:\[0-9\]+:\[0-9\]+:beg:0x\[0-9a-z\]+\r\n"
    "1: value = 12\r\n"
    "\r\n\032\032stopped\r\n"
}

send_gdb "next\n"
gdb_expect_list "breakpoint ignore count" "$gdb_prompt$" {
    "\r\n\032\032post-prompt\r\n"
    "\r\n\032\032starting\r\n"
    "\(\r\n\032\032frames-invalid\r\n\)+"
    "\r\n\032\032source.*annota3.c:49:\[0-9\]+:beg:0x\[0-9a-z\]+\r\n"
    "1: value = 12\r\n"
    "\r\n\032\032stopped\r\n"
}

#
# Send a signal that is not handled
#
# SIGTRAP signals are dropped before they get to the inferior process
# on hpux11.  In theory, this behaivor can be controlled by setting
# TTEO_NORM_SIGTRAP in the inferior, but doing so did not cause
# the signal to be properly delivered.
#
# It has been verified that other signals will be delivered.  However,
# rather than twiddle the test, I choose to leave it as-is as it
# exposes an interesting failure on hpux11.

if [target_info exists gdb,nosignals] {
    unsupported "signal sent"
} else {
    setup_xfail hppa*-*-hpux11*
    send_gdb "signal SIGTRAP\n"
    gdb_expect_list "signal sent" "$gdb_prompt$" {
	"\r\n\032\032post-prompt\r\n"
	"Continuing with signal SIGTRAP.\r\n"
	"\r\n\032\032starting\r\n"
	"\r\n\032\032frames-invalid\r\n"
	"\r\n\032\032frames-invalid\r\n"
	"\r\n\032\032signalled\r\n"
	"\r\nProgram terminated with signal SIGTRAP, Trace.breakpoint trap.\r\n"
	"The program no longer exists.\r\n"
	"\r\n\032\032stopped\r\n"
    }
}


# Check for production of a core file and remove it!

set exec_output [remote_exec build "ls core"]

set test "cleanup core file"
if [ regexp "core not found" $exec_output]  {
    pass "$test (not dumped)"
} else {
    if [ regexp "No such file or directory" $exec_output] {
	pass "$test (not dumped)"
    } else {
	remote_exec build "rm -f core"
	pass "$test (removed)"
    }
}

# restore the original prompt for the rest of the testsuite

set gdb_prompt $old_gdb_prompt
