#   Copyright 1998-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/>.

# This file was written by Michael Snyder (msnyder@cygnus.com)

load_lib "trace-support.exp"


gdb_exit
gdb_start

standard_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

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

gdb_test "break main"
gdb_run_cmd
gdb_test "" "Breakpoint .*"
if ![gdb_target_supports_trace] {
    unsupported "target does not support trace"
    return -1
}

gdb_trace_setactions "set actions for first tracepoint" \
    "$trcpt1" \
    "collect \$regs" "^$" \
    "end" ""

# Check the definition of tracepoints.  These tracepoints may have
# different number in different runs.

proc check_tracepoint { data_source } {
    with_test_prefix "$data_source" {
	global gdb_prompt
	global srcfile

	set tp_on_gdb_c_test 0
	set tp_on_gdb_asm_test 0
	set tp_on_gdb_recursion_test 0

	# Since the three tracepoints may appear in different orders, so
	# we can't do 'info tracepoints' to match the output.  Instead, we
	# show each tracepoint one by one and record the number of each
	# tracepoint shown up the output.  Check the number finally.
	for {set i 1} {$i < 4} {incr i 1} {
	    set test "info tracepoints $i"
	    gdb_test_multiple "info tracepoints $i" $test {
		-re "\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+\\r\\n\[\t \]+collect \\\$regs\\r\\n\[\t \]+installed on target" {
		    incr tp_on_gdb_c_test
		    exp_continue
		}
		-re "\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+\\r\\n\[\t \]+teval \\\$tsv \\+= 1\\r\\n\[\t \]+installed on target" {
		    incr tp_on_gdb_asm_test
		    exp_continue
		}
		-re "\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+\\r\\n\[\t \]+collect gdb_long_test\\r\\n\[\t \]+installed on target" {
		    incr tp_on_gdb_recursion_test
		    exp_continue
		}
		-re "${gdb_prompt} $" {
		}
	    }
	}

	if {$tp_on_gdb_c_test == 1} {
	    pass "tracepoint on gdb_c_test"
	} else {
	    fail "tracepoint on gdb_c_test"
	}
	if {$tp_on_gdb_asm_test == 1} {
	    pass "tracepoint on gdb_asm_test"
	} else {
	    fail "tracepoint on gdb_asm_test"
	}
	if {$tp_on_gdb_recursion_test == 1} {
	    pass "tracepoint on gdb_recursion_test"
	} else {
	    fail "tracepoint on gdb_recursion_test $tp_on_gdb_recursion_test"
	}
    }
}

# Start and stop the tracing, so that we can save tracepoints
# definitions to trace file.
gdb_test_no_output "tstart" ""
check_tracepoint "live"
gdb_test_no_output "tstop" ""
set tracefile [standard_output_file ${testfile}]
gdb_test "tsave ${tracefile}.tf" \
    "Trace data saved to file '${tracefile}.tf'\.\\r" \
    "tsave ${testfile}.tf"
gdb_test "tsave -ctf ${tracefile}.ctf" \
    "Trace data saved to directory '${tracefile}.ctf'\.\\r" \
    "save ctf trace file"

# Restart GDB and read the trace data in tfile target.
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_file_cmd $binfile
gdb_test "target tfile ${tracefile}.tf" ".*" \
    "change to tfile target"
check_tracepoint "tfile"

# Try to read ctf data if GDB supports.
set gdb_can_read_ctf_data 0
gdb_test_multiple "target ctf" "" {
    -re "Undefined target command: \"ctf\"\.  Try \"help target\"\.\r\n$gdb_prompt $" {
	set gdb_can_read_ctf_data 0
    }
    -re "No CTF directory specified.*\r\n$gdb_prompt $" {
	set gdb_can_read_ctf_data 1
    }
}

if { $gdb_can_read_ctf_data } {
    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_file_cmd $binfile
    gdb_test "target ctf ${tracefile}.ctf" ".*" \
	"change to ctf target"
    check_tracepoint "ctf"
}
