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

load_lib "trace-support.exp"

standard_testfile

if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug nopie}]} {
    return -1
}

if ![runto_main] {
    return -1
}

if ![gdb_target_supports_trace] {
    unsupported "target does not support trace"
    return -1
}

# Set tracepoints, start tracing and collect data.

proc set_tracepoint_and_collect { } {
    global testfile srcfile

    # Start with a fresh gdb.
    clean_restart ${testfile}
    if ![runto_main] {
	return -1
    }
    gdb_breakpoint "end" qualified
    gdb_test "trace start" "Tracepoint \[0-9\] at .*"
    gdb_trace_setactions "set action for tracepoint"  "" \
	"collect testglob" "^$" \
	"collect constglob" "^$"

    gdb_test_no_output "tstart"
    gdb_test "continue" ".*Breakpoint.* end .*at.*$srcfile.*" \
	"continue to end"
    gdb_test_no_output "tstop"
}

with_test_prefix "live" {
    set_tracepoint_and_collect

    gdb_test "print testglob" " = 2"
    gdb_test "print testglob_not_collected" " = 12"
    gdb_test "print constglob" " = 10000"
    gdb_test "print constglob_not_collected" " = 100"
}

with_test_prefix "live target tfind" {
    gdb_test "tfind 0" "Found trace frame 0, tracepoint \[0-9\]+.*" \
	"tfind 0"
    gdb_test "print testglob" " = 1"
    gdb_test "print testglob_not_collected" " = <unavailable>"
    gdb_test "print constglob" " = 10000"
    gdb_test "print constglob_not_collected" " = 100"
    gdb_test "tfind" "Target failed to find requested trace frame." \
	"tfind does not find a second frame"
}

# Save trace frames to trace file.
set tracefile [standard_output_file ${testfile}]
gdb_test "tsave ${tracefile}.tfile" \
    "Trace data saved to file '${tracefile}.tfile'.*" \
    "save tfile trace"

# Test read memory when changing target from remote to ${target}.

proc test_from_remote { target } {
    global gdb_prompt testfile
    global tracefile

    with_test_prefix "remote to ${target}" {
	set_tracepoint_and_collect

	# Change target to ${target}.
	set test "change target"
	gdb_test_multiple "target ${target} ${tracefile}.${target}" "$test" {
	    -re "A program is being debugged already.  Kill it. .y or n. " {
		send_gdb "y\n"
		exp_continue
	    }
	    -re "$gdb_prompt $" {
		pass "$test"
	    }
	}

	with_test_prefix "w/o setting traceframe" {
	    gdb_test "print testglob" " = <unavailable>"
	    gdb_test "print testglob_not_collected" " = <unavailable>"
	    gdb_test "print constglob" " = 10000"
	    gdb_test "print constglob_not_collected" " = 100"
	}
	with_test_prefix "w/ setting traceframe" {
	    gdb_test "tfind 0" "Found trace frame 0, tracepoint \[0-9\]+.*" \
		"tfind 0"
	    gdb_test "print testglob" " = 1"
	    gdb_test "print testglob_not_collected" " = <unavailable>"
	    gdb_test "print constglob" " = 10000"
	    gdb_test "print constglob_not_collected" " = 100"
	    gdb_test "tfind" "Target failed to find requested trace frame." \
		"tfind does not find a second frame"
	}
    }
}

test_from_remote "tfile"

# Test read memory when changing target from exec to ${target}

proc teset_from_exec { target } {
    global srcdir subdir binfile testfile
    global tracefile

    # Restart GDB and read the trace data in ${target} target.
    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_file_cmd $binfile

    gdb_test "target ${target} ${tracefile}.${target}" ".*" \
	"change to ${target} target"

    with_test_prefix "exec to ${target} w/o setting traceframe" {
	gdb_test "print testglob" " = <unavailable>"
	gdb_test "print testglob_not_collected" " = <unavailable>"
	gdb_test "print constglob" " = 10000"
	gdb_test "print constglob_not_collected" " = 100"
    }

    with_test_prefix "exec to ${target} w/ setting traceframe" {
	gdb_test "tfind 0" "Found trace frame 0, tracepoint \[0-9\]+.*" \
	    "tfind 0"
	gdb_test "print testglob" " = 1"
	gdb_test "print testglob_not_collected" " = <unavailable>"
	gdb_test "print constglob" " = 10000"
	gdb_test "print constglob_not_collected" " = 100"
	gdb_test "tfind" "Target failed to find requested trace frame." \
	    "tfind does not find a second frame"
    }
}

teset_from_exec "tfile"
