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

load_lib "trace-support.exp"

standard_testfile

if {[prepare_for_testing $testfile.exp $testfile $srcfile debug]} {
    untested $testfile.exp
    return -1
}

if ![runto_main] {
    fail "Can't run to main to check for trace support"
    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] {
	fail "Can't run to main"
	return -1
    }
    gdb_test "break end" "Breakpoint \[0-9\] at .*"
    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"
