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

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