#   Copyright 1998, 2007, 2008, 2009 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 Michael Snyder (msnyder@cygnus.com)

load_lib "trace-support.exp";

if $tracelevel then {
    strace $tracelevel
}

set prms_id 0
set bug_id 0

gdb_exit
gdb_start

if [istarget "m68k-*-elf"] then {
    set binfile [board_info target d490_binfile];
    set srcfile gdb_c_test.c
} else {
    set testfile "actions"
    set srcfile ${testfile}.c
    set binfile $objdir/$subdir/$testfile
    if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
	    executable {debug nowarnings}] != "" } {
	untested actions.exp
	return -1
    }
}
gdb_reinitialize_dir $srcdir/$subdir

# If testing on a remote host, download the source file.
# remote_download host $srcdir/$subdir/$srcfile

gdb_file_cmd $binfile

# define relative source line numbers:
# all subsequent line numbers are relative to this first one (baseline)

set baseline  [gdb_find_recursion_test_baseline $srcfile];
if { $baseline == -1 } then {
    fail "Could not find gdb_recursion_test function"
    return;
}

set testline1 [expr $baseline + 7]

#
# test actions command
#

gdb_delete_tracepoints
set trcpt1 [gdb_gettpnum gdb_c_test];
set trcpt2 [gdb_gettpnum gdb_asm_test];
set trcpt3 [gdb_gettpnum $testline1];
if { $trcpt1 <= 0 || $trcpt2 <= 0 || $trcpt3 <= 0 } then {
    fail "setting tracepoints"
    return;
}

# 5.1 actions of specified tracepoint

send_gdb "info tracepoints\n"
gdb_expect {
    -re "Actions for tracepoint \[0-9\]+:.*$gdb_prompt $" {
	fail "5.1a: testsuite failure (tracepoint already has action)!"
    }
    -re "No tracepoints.*$gdb_prompt $" {
	fail "5.1a: set three tracepoints, no actions (No tracepoints!)"
    }
    -re "$gdb_prompt $" {
	pass "5.1a: set three tracepoints, no actions"
    }
}

gdb_trace_setactions "5.1b: set actions for first tracepoint" \
	"$trcpt1" \
	"collect gdb_char_test" "^$"

gdb_test "info tracepoints" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+.
\[\t \]+A\[\t \]+collect gdb_char_test.
\[\t \]+A\[\t \]+end.
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+.
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+" \
		"5.1c: verify actions set for first tracepoint"

gdb_trace_setactions "5.1d: set actions for second tracepoint" \
	"$trcpt2" \
	"collect gdb_short_test" "^$"

gdb_test "info tracepoints" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+.
\[\t \]+A\[\t \]+collect gdb_char_test.
\[\t \]+A\[\t \]+end.
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+.
\[\t \]+A\[\t \]+collect gdb_short_test.
\[\t \]+A\[\t \]+end.
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+" \
		"5.1e: verify actions set for second tracepoint"

gdb_trace_setactions "5.2a: set actions for last (default) tracepoint" \
	"" \
	"collect gdb_long_test" "^$"

gdb_test "info tracepoints" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+.
\[\t \]+A\[\t \]+collect gdb_char_test.
\[\t \]+A\[\t \]+end.
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+.
\[\t \]+A\[\t \]+collect gdb_short_test.
\[\t \]+A\[\t \]+end.
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+.
\[\t \]+A\[\t \]+collect gdb_long_test.
\[\t \]+A\[\t \]+end." \
		"5.1e: verify actions set for second tracepoint"

# 5.3 replace actions set earlier

gdb_trace_setactions "5.3a: reset actions for first tracepoint" \
	"$trcpt1" \
	"collect gdb_struct1_test" "^$"

gdb_test "info tracepoints" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+.
\[\t \]+A\[\t \]+collect gdb_struct1_test.
\[\t \]+A\[\t \]+end.
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+.
\[\t \]+A\[\t \]+collect gdb_short_test.
\[\t \]+A\[\t \]+end.
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+.
\[\t \]+A\[\t \]+collect gdb_long_test.
\[\t \]+A\[\t \]+end." \
		"5.3b: verify actions set for first tracepoint"

#
# test end command (all by itself)
#

# 5.4 end outside of context

gdb_test "end" "This command cannot be used at the top level." \
			"5.4: 'end' command out of context"

# 5.5 empty actions (just an end with no other actions)

gdb_trace_setactions "5.5a: set empty actions for first tracepoint" \
	"$trcpt1"

send_gdb "info tracepoints\n"
gdb_expect {
    -re "No tracepoints.*$gdb_prompt $" {
	fail "5.5c: verify NO actions for first tracepoint"
    }
    -re "Actions for.* $trcpt1:.*$gdb_prompt $" {
	fail "5.5c: verify NO actions for first tracepoint"
    }
    -re "$gdb_prompt $" {
	pass "5.5c: verify NO actions for first tracepoint"
    }
}

# 5.6 actions for invalid tracepoint number

gdb_test "actions [expr $trcpt2 + $trcpt3]" \
    "No tracepoint number [expr $trcpt2 + $trcpt3]." \
			"5.6: actions for invalid tracepoint number"

# 5.7 invalid action (other than 'collect', 'while-stepping' or 'end')
#	    "warning: .print gdb_c_test. is not a supported trace.*> $" \

gdb_trace_setactions "5.7: invalid action" \
	"$trcpt1" \
	"print gdb_c_test" \
	"warning: .print gdb_c_test. is not a supported trace"

# 5.8 help actions (collect, while-stepping, end)

gdb_test "help actions" \
    "Specify the actions to be taken at a tracepoint.*" \
			"5.8a: help actions"

gdb_test "help collect" \
    "Specify one or more data items to be collected at a tracepoint.*" \
			"5.8b: help collect"

gdb_test "help while-stepping" \
    "Specify single-stepping behavior at a tracepoint.*" \
			"5.8c: help while-stepping"

gdb_test "help end" "Ends a list of commands or actions.*" \
			"5.8d: help end"

