#   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 actions.c
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 trace_file_name [standard_output_file savetrace.tr]
set escapedfilename [string_to_regexp $trace_file_name]
remote_file host delete $trace_file_name
gdb_test "save-tracepoints $trace_file_name" \
	"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 $trace_file_name" \
	"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 $trace_file_name

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