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

# Test of trace file support.

# Note that unlike most of the tracing tests, this can be run on
# targets lacking tracepoint support; the program tfile.c has the
# ability to generate synthetic trace files directly, and the tfile
# target is available to all GDB configs.

load_lib "trace-support.exp";

if [target_info exists gdb,nofileio] {
    verbose "Skipping tfile.exp because of no fileio capabilities."
    continue
}

if $tracelevel then {
    strace $tracelevel
}


gdb_exit
gdb_start
set testfile "tfile"
set srcfile ${testfile}.c
set binfile $objdir/$subdir/$testfile
if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
	  executable {debug nowarnings}] != "" } {
    untested file.exp
    return -1
}
gdb_reinitialize_dir $srcdir/$subdir

# Make sure we are starting fresh.
remote_file host delete basic.tf
remote_file host delete error.tf

gdb_load $binfile

runto_main

gdb_test "break done_making_trace_files" ".*" ""

gdb_test "continue" ".*" ""

# tsave command would be tested here...

gdb_test "continue" ".*" ""

# Program has presumably exited, now target a trace file it created.

gdb_test "target tfile basic.tf" "Created tracepoint.*" "target tfile"

gdb_test "info trace" ".*tracepoint.*in write_basic_trace_file.*" \
    "info tracepoints on trace file"

gdb_test "tfind 0" \
    "Found trace frame 0, tracepoint \[0-9\]+.
\#0  write_basic_trace_file ().*" \
    "tfind 0 on trace file"

# Note that there is no tracepoint collecting these globals, we
# just happen to know they are covered by the trace frame.

gdb_test "print testglob" " = 31415" "print testglob on trace file"

gdb_test "print testglob2" " = 271828" "print testglob2 on trace file"

gdb_test "print constglob" " = 10000" "print constglob on trace file"

gdb_test "tfind" "Target failed to find requested trace frame." \
    "tfind does not find a second frame in trace file"

gdb_test "tstatus" \
    "Using a trace file.*
Trace stopped by a tstop command.*
Collected 1 trace frame.*
Trace buffer has 256 bytes of 4096 bytes free \\(93% full\\).*
Looking at trace frame 0, tracepoint .*" \
    "tstatus on trace file"

# Now start afresh, using only a trace file.

gdb_exit
gdb_start

gdb_load $binfile

gdb_test "target tfile error.tf" "Created tracepoint.*" "target tfile"

gdb_test "tstatus" \
    "Using a trace file.*
Trace stopped by an error \\(made-up error, tracepoint 1\\).*
Collected 0 trace frame.*
Trace buffer has 256 bytes of 4096 bytes free \\(93% full\\).*
Not looking at any trace frame.*" \
    "tstatus on error trace file"
