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

load_lib "trace-support.exp";

if $tracelevel then {
    strace $tracelevel
}


gdb_exit
gdb_start

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

gdb_test_multiple "info tracepoints" "5.1a: set three tracepoints, no actions" {
    -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 \]+collect gdb_char_test.
\[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 \]+collect gdb_char_test.
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+.
\[\t \]+collect gdb_short_test.
\[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 \]+collect gdb_char_test.
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+.
\[\t \]+collect gdb_short_test.
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+.
\[\t \]+collect gdb_long_test." \
		"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 \]+collect gdb_struct1_test.
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+.
\[\t \]+collect gdb_short_test.
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+.
\[\t \]+collect gdb_long_test." \
		"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"

gdb_test_multiple "info tracepoints" "5.5c: verify NO actions for first tracepoint" {
    -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" \
	"`print gdb_c_test' is not a supported tracepoint action"

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

# 5.9 default-collect

gdb_test_no_output "set default-collect gdb_char_test, gdb_long_test - 100" \
    "5.9a: set default-collect"

gdb_test "show default-collect" \
    "The list of expressions to collect by default is \"gdb_char_test, gdb_long_test - 100\"..*" \
    "5.9b: show default-collect"

gdb_test_no_output "set default-collect" \
    "5.9c: set default-collect"

# 5.10 teval

gdb_test "tvariable \$tsv" \
  "Trace state variable \\\$tsv created, with initial value 0." \
  "Create a trace state variable"

gdb_trace_setactions "5.10a: set teval action for first tracepoint" \
	"$trcpt1" \
	"teval gdb_char_test" "^$"

gdb_trace_setactions "5.10a: set teval action for second tracepoint" \
	"$trcpt2" \
	"teval \$tsv += 1" "^$"

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 \]+teval gdb_char_test.
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+.
\[\t \]+teval \\\$tsv \\\+= 1.
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+.
\[\t \]+collect gdb_long_test." \
		"5.10a: verify teval actions set for two tracepoints"

