#   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/save-trace
if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
	  executable {debug nowarnings}] != "" } {
    untested save-trace.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 + 4]
set testline2 [expr $baseline + 5]
set testline3 [expr $baseline + 6]
set testline4 [expr $baseline + 7]
set testline5 [expr $baseline + 8]
set testline6 [expr $baseline + 9]

#
# test save-trace command
#

# setup a set of tracepoints to save

gdb_delete_tracepoints

foreach x { 1 2 3 4 5 6 } {
    set testline [expr \$testline$x];
    set trcpt [gdb_gettpnum $testline];
    set trcpt$x $trcpt;
    gdb_test "passcount $x" \
	     "Setting tracepoint $trcpt.* to $x" \
	     "10.x: set passcount for tracepoint $trcpt"

    gdb_test_no_output "condition $trcpt $x - 1 == $x / 2" \
	     "10.x: set condition for tracepoint $trcpt"

    gdb_trace_setactions "10.x: set actions for tracepoint $x" \
	    "" \
	    "collect q$x" "^$" \
	    "while-stepping $x" "^$" \
	    "collect q$x" "^$" \
	    "end" "^$"
}

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

proc gdb_verify_tracepoints { testname } {
    global gdb_prompt;

    set ws "\[\t \]+"
    set nl "\[\r\n\]+"
    set ourstate 1;
    set result "pass";
    gdb_test_multiple "info tracepoints" "$testname" {
	-re "\[0-9\]+\[\t \]+tracepoint\[\t \]+keep y\[\t \]+0x\[0-9a-fA-F\]+ in gdb_recursion_test\[^\r\n\]+\r\n\[ \t]+trace only if \[0-9\] - 1 == \[0-9\] / 2" {
#	    if { $expect_out(1,string) != $ourstate } {
#		set result "fail";
#	    }
	    incr ourstate;
	    exp_continue;
	}
	-re "$gdb_prompt $" {
	    if { $ourstate >= 6 } {
		set result "pass";
	    } else {
		set result "fail";
	    }
	}
	default {
	    set result "fail";
	}
    }
    $result $testname;

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

gdb_verify_tracepoints "10.x: verify trace setup";

# 10.1 Save current tracepoint definitions to a file

remote_file host delete savetrace.tr
gdb_test "save-tracepoints savetrace.tr" \
	"Saved to file 'savetrace.tr'." \
	"10.1: save tracepoint definitions"

# 10.2 Read back tracepoint definitions

gdb_delete_tracepoints
gdb_test_no_output "set default-collect" "10.2: clear default-collect"
gdb_test "info tracepoints" "No tracepoints." "10.2: delete tracepoints"
gdb_test "source savetrace.tr" \
	"Tracepoint \[0-9\]+ at .*" \
	"10.2: read back saved tracepoints"
gdb_verify_tracepoints "10.2: verify recovered tracepoints";
remote_file host delete savetrace.tr

# 10.3 repeat with a path to the file

set escapedfilename [string_to_regexp $objdir/savetrace.tr]
remote_file host delete $objdir/savetrace.tr
gdb_test "save-tracepoints $objdir/savetrace.tr" \
	"Saved to file '${escapedfilename}'." \
	"10.3: save tracepoint definitions, full path"

gdb_delete_tracepoints
gdb_test_no_output "set default-collect" "10.3: clear default-collect"
gdb_test "info tracepoints" "No tracepoints." "10.3: delete tracepoints"
gdb_test "source $objdir/savetrace.tr" \
	"Tracepoint \[0-9\]+ at .*" \
	"10.4: read saved tracepoints, full path"
gdb_verify_tracepoints "10.3: verify recovered tracepoints, full path";
remote_file host delete $objdir/savetrace.tr

# 10.5 invalid filename
#      [deferred -- not sure what a good invalid filename would be]

# 10.6 save-trace (file already exists)
#      [expect it to clobber the old one]

# 10.7 help save-tracepoints

gdb_test "help save-tracepoints" \
	"Save current tracepoint definitions as a script.*" \
	"10.7: help save-tracepoints"
