# Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
# 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/>.

# 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 testfile "annota3"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}$EXEEXT

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } {
    untested annota3.exp
    return -1
}


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.
gdb_test_no_output "set height 0"

#
# 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"
}

#
# if construct:
#
gdb_test_multiple "if 1" "start if construct" {
    -re "^if 1\r\n\r\n\032\032post-prompt\r\n\r\n\032\032pre-commands\r\n >\r\n\032\032commands\r\n$" {
	pass "start if construct"
    }
}

gdb_test_multiple "end" "end if construct" {
    -re "^end\r\n\r\n\032\032post-commands\r\n$gdb_prompt$" {
 	pass "end if construct"
    }
}

#
# 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(|\.exe) \r\n"
    "\r\n\032\032starting\r\n"
    "\r\n\032\032breakpoint 1\r\n"
    "\r\n"
    "Breakpoint 1, "
    "\r\n\032\032frame-begin 0 0x\[0-9a-z\]+\r\n"
    "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\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"
    "Breakpoint.*at 0x\[0-9a-z\]+: file.*annota3.c, line.*\r\n"
}

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

#
# get to printf
#
send_gdb "continue\n"
gdb_expect_list "continue to printf" "$gdb_prompt$" {
    "\r\n\032\032post-prompt\r\n"
    "Continuing.\r\n"
    "\r\n\032\032starting\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 .* .*printf(@\[^ ]*)? \[^\r\n\]*\r\n"
    "#1 .* main \[^\r\n\]*\r\n"
}


#
# test printing a frame with some arguments: 
#

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\032breakpoint 2\r\n"
	"\r\n"
	"Breakpoint 2, "
	"\r\n\032\032frame-begin 0 0x\[0-9a-z\]+\r\n"
	"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:
    #
    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 .* .*printf(@\[^ \]*)? \[^\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"
    "Breakpoint 4 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.
# NOTE: breakpoints-invalid annotations have been removed from
# level 3 but keep these tests for continuity and comparison
# with annota1.exp.
send_gdb "break 46\n"
gdb_expect_list  "break at 46" "$gdb_prompt$" {
    "\r\n\032\032post-prompt\r\n"
    "Breakpoint 5 at 0x\[0-9a-z\]+: file .*annota3.c, line 46.\r\n"
}

send_gdb "ignore 5 4\n"
gdb_expect_list "ignore 5 4" "$gdb_prompt$" {
    "\r\n\032\032post-prompt\r\n"
    "Will ignore next 4 crossings of breakpoint 5"
    "\r\n"
}

send_gdb "continue\n"
gdb_expect_list "annotate ignore count change" "$gdb_prompt$" {
    "\r\n\032\032post-prompt\r\n"
    "\r\n\032\032breakpoint 5\r\n"
    "\r\n"
    "Breakpoint 5, "
    "\r\n\032\032frame-begin 0 0x\[0-9a-z\]+\r\n"
    "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"
}

# 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\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\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\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
