# This testcase is part of GDB, the GNU debugger.
#
# Copyright 2013 Free Software Foundation, Inc.
#
# Contributed by Intel Corp. <christian.himpel@intel.com>
#
# 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/>.

# check for btrace support
if { [skip_btrace_tests] } { return -1 }

# start fresh - without an executable
gdb_exit
gdb_start

# record cannot be stopped, if it was never active
gdb_test "record stop" "No record target is currently active\\..*" "record stop without target"

# btrace cannot be enabled without a running inferior
gdb_test "record btrace" "The program is not being run\\." "record btrace without running program"

# no function and no instruction history without btrace enabled
gdb_test "record function-call-history" "No record target is currently active\\..*" "record function-call-history without target"
gdb_test "record instruction-history" "No record target is currently active\\..*" "record instruction-history without target"
gdb_test "info record" "No record target is currently active\\." "info record without target"

# start inferior
standard_testfile
if [prepare_for_testing $testfile.exp $testfile {} {debug}] {
    return -1
}
if ![runto_main] {
    return -1
}

# enable btrace
gdb_test_no_output "record btrace" "record btrace"
gdb_test "record function-call-history" "No trace\\." "record function-call-history without trace"
gdb_test "record instruction-history" "No trace\\." "record instruction-history without trace"

# btrace cannot be enabled twice
gdb_test "record btrace" "The process is already being recorded\\." "record btrace the second time"

# full record cannot be activated as long as btrace is active
gdb_test "record full" "Process record target already running\\.  Use \"record stop\" to stop record target first\\." "record full cannot be enabled"

# no trace recorded yet
gdb_test "info record" "Active record target: record-btrace\r\nRecorded 0 instructions in 0 functions for thread 1.*\\." "info record without trace"

# stop btrace record
gdb_test "record stop" "Process record is stopped and all execution logs are deleted\\." "record stop"
gdb_test "record stop" "No record target is currently active\\..*" "record stop the second time"

# enable btrace again
gdb_test_no_output "record btrace" "record btrace re-enable"
gdb_test "record btrace" "The process is already being recorded\\." "record btrace re-enable twice"

# continue to the end and make sure we don't die
gdb_test "continue" ".*Inferior.*exited.*" "continue to end"

# skip the rerun test when using gdbserver
# otherwise rerun twice, target should be automatically disabled
load_lib gdbserver-support.exp
if [skip_gdbserver_tests] {
    return 0
}
clean_restart $testfile
if ![runto_main] {
    return -1
}
if ![runto_main] {
    return -1
}

# make sure record-btrace can be enabled after re-run
clean_restart $testfile
if ![runto_main] {
    return -1
}
gdb_test_no_output "record btrace"
if ![runto_main] {
    return -1
}
gdb_test_no_output "record btrace" "enable after re-run"
