#   Copyright 1998-2021 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_trace_common_supports_arch] {
    unsupported "no trace-common.h support for arch"
    return -1
}
if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
	  executable {debug nowarnings}] != "" } {
    untested "failed to compile"
    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" \
	     "set passcount for tracepoint $trcpt"

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

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

gdb_test "ftrace fast_tracepoint_loc" \
	 "Fast tracepoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
	 "set a fast tracepoint"

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

# Save tracepoint definitions to a file, at path SAVE_PATH.
proc gdb_save_tracepoints { save_path } {
    set save_path_regexp [string_to_regexp $save_path]
    remote_file host delete $save_path
    gdb_test "save tracepoints $save_path" \
	     "Saved to file '$save_path_regexp'." \
	     "save tracepoint definitions"
}

# Load tracepoint definitions from a file, from path SAVE_PATH.
proc gdb_load_tracepoints { save_path } {
    # Cleanup existing tracepoints/collections
    gdb_delete_tracepoints
    gdb_test_no_output "set default-collect" "clear default-collect"

    gdb_test "info tracepoints" "No tracepoints." "delete tracepoints"

    gdb_test "source $save_path" "Tracepoint \[0-9\]+ at .*" \
	     "read back saved tracepoints"
}

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 >= 7 } {
		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\"..*" \
	"verify default-collect"
}

proc do_save_load_test { save_path } {
    # Save current tracepoint definitions to a file
    gdb_save_tracepoints $save_path

    # Clear existing tracepoints and reload from file
    gdb_load_tracepoints $save_path

    # Check if they match the expected tracepoints
    gdb_verify_tracepoints "verify recovered tracepoints"
}

gdb_verify_tracepoints "verify trace setup"

with_test_prefix "relative" {
    set filepath [standard_output_file "savetrace-relative.tr"]

    # This only works because the pwd is a prefix of the standard output
    # directory.  If this assumption becomes false, then this test needs to be
    # changed (the relative path from [pwd] to the standard output directory
    # will become a bit more complicated to compute).
    if {[string first [pwd] $filepath] != 0} {
	error "[pwd] is not a prefix of $filepath."
    }

    set filepath [string map "[pwd] ." $filepath]
    do_save_load_test "$filepath"
}

with_test_prefix "absolute" {
    do_save_load_test [standard_output_file "savetrace-absolute.tr"]
}

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

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

# help save tracepoints

gdb_test "help save tracepoints" \
	"Save current tracepoint definitions as a script.*" \
	"verify help save tracepoints"
