# This testcase is part of GDB, the GNU debugger.
#
# Copyright 2013-2020 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/>.

if { [skip_btrace_tests] } {
    unsupported "target does not support record-btrace"
    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"

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

if ![runto_main] {
    untested "failed to run to 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\\.  Use \"record stop\" to stop recording first\\." "record btrace the second time"

# full record cannot be activated as long as btrace is active
gdb_test "record full" "The process is already being recorded\\.  Use \"record stop\" to stop recording first\\." "record full cannot be enabled"

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

# stop btrace record
gdb_test "record stop" "Process record is stopped and all execution logs are deleted\\."
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\\.  Use \"record stop\" to stop recording first\\." "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_gdbserver_tests requires GDB not running.
gdb_exit

# skip the rerun test when using gdbserver
# otherwise rerun twice, target should be automatically disabled
load_lib gdbserver-support.exp
if [skip_gdbserver_tests] {
    unsupported "target does not support gdbserver"
    return 0
}
clean_restart $testfile
if ![runto_main] {
    untested "failed to run to main"
    return -1
}
if ![runto_main] {
    untested "failed to run to main"
    return -1
}

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