#   Copyright 2010-2012 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
}


gdb_exit
gdb_start
standard_testfile
if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
	  executable {debug nowarnings}] != "" } {
    untested ${testfile}.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"

gdb_test "tfind end" "No longer looking at any trace frame" "leave tfind mode"

gdb_test "backtrace" "No stack\." \
    "no stack if no traceframe selected"

gdb_test "info registers" "The program has no registers now\." \
    "no registers if no traceframe selected"

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

# Make sure we can reopen without error.
gdb_test \
    "interpreter-exec mi \"-target-select tfile basic.tf\"" \
    "\\^connected.*"
