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

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# 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 additional_flags=-w}] != "" } {
	gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
    }
}
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" "^$"

send_gdb "info tracepoints\n"
gdb_expect {
    -re "Actions for.* $trcpt1:.*collect gdb_char_test.*$gdb_prompt $" {
	pass "5.1c: verify actions set for first tracepoint"
    }
    -re "$gdb_prompt $" {
	fail "5.1c: verify actions set for first tracepoint"
    }
}

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

send_gdb "info tracepoints\n"
gdb_expect {
    -re "Actions for.* $trcpt2:.*collect gdb_short_test.*$gdb_prompt $" {
	pass "5.1e: verify actions set for second tracepoint"
    }
    -re "$gdb_prompt $" {
	fail "5.1e: verify actions set for second tracepoint"
    }
}

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

send_gdb "info tracepoints\n"
gdb_expect {
    -re "Actions for.* $trcpt3:.*collect gdb_long_test.*$gdb_prompt $" {
	pass "5.2b: verify actions set for last (default) tracepoint"
    }
    -re "$gdb_prompt $" {
	fail "5.2b: verify actions set for last (default) tracepoint"
    }
}

# 5.3 replace actions set earlier

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

send_gdb "info tracepoints\n"
gdb_expect {
    -re "Actions for.* $trcpt1:.*collect gdb_struct1_test.*$gdb_prompt $" {
	pass "5.3b: verify actions set for first tracepoint"
    }
    -re "$gdb_prompt $" {
	fail "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"

