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

require allow_btrace_tests

# start fresh - without an executable
gdb_exit
gdb_start

# record cannot be stopped, if it was never active
gdb_test "record stop" "No recording 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 recording is currently active\\..*" "record function-call-history without target"
gdb_test "record instruction-history" "No recording is currently active\\..*" "record instruction-history without target"
gdb_test "info record" "No recording is currently active\\." "info record without target"

standard_testfile
if [prepare_for_testing "failed to prepare" $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\\.  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 recording 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"

# allow_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
require allow_gdbserver_tests
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" "enable after restart"
if ![runto_main] {
    return -1
}
gdb_test_no_output "record btrace" "enable after re-run"
