# Copyright 1998-2021 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/>.

load_lib "trace-support.exp"

standard_testfile

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

if ![runto_main] {
    return -1
}

if ![gdb_target_supports_trace] {
    unsupported "target does not support trace"
    return -1
}

set BUFFER_SIZE 4
set default_size -1
set test "get default buffer size"

# Save default trace buffer size in 'default_size'.
gdb_test_multiple "tstatus" $test {
    -re ".*Trace buffer has ($decimal) bytes of ($decimal) bytes free.*$gdb_prompt $" {
        set default_size $expect_out(2,string)
        pass $test
    }
}

# If we did not get the default size then there is no point in running the
# tests below.
if { $default_size < 0 } {
  return -1
}

# Change buffer size to 'BUFFER_SIZE'.
gdb_test_no_output \
  "set trace-buffer-size $BUFFER_SIZE" \
  "set trace buffer size 1"

gdb_test "tstatus" \
  ".*Trace buffer has $decimal bytes of $BUFFER_SIZE bytes free.*" \
  "tstatus check 2"

gdb_test "show trace-buffer-size $BUFFER_SIZE" \
  "Requested size of trace buffer is $BUFFER_SIZE.*" \
  "show trace buffer size"

# -1 means "no limit on GDB's end.  Let the target choose."
gdb_test_no_output \
  "set trace-buffer-size -1" \
  "set trace buffer size 2"

# "unlimited" means the same.
gdb_test_no_output "set trace-buffer-size unlimited"

# Test that tstatus gives us default buffer size now.
gdb_test "tstatus" \
  ".*Trace buffer has $decimal bytes of $default_size bytes free.*" \
  "tstatus check 3"

gdb_test_no_output \
  "set trace-buffer-size $BUFFER_SIZE" \
  "set trace buffer size 3"

# We set trace buffer to very small size.  Then after running trace,
# we check if it is full.  This will show if setting trace buffer
# size really worked.
gdb_breakpoint ${srcfile}:[gdb_get_line_number "breakpoint1"]
gdb_test "trace test_function" \
  "Tracepoint \[0-9\]+ at .*" \
  "set tracepoint at test_function"
gdb_trace_setactions "Set action for trace point 1" "" \
  "collect var" "^$"
gdb_test_no_output "tstart"
gdb_test "continue" \
  "Continuing.*Breakpoint $decimal.*" \
  "run trace experiment 1"
gdb_test "tstatus" \
  ".*Trace stopped because the buffer was full.*" \
  "buffer full check 1"

# Use the default size -- the trace buffer should not end up
# full this time
clean_restart ${testfile}
runto_main
gdb_breakpoint ${srcfile}:[gdb_get_line_number "breakpoint1"]
gdb_test "trace test_function" \
  "Tracepoint \[0-9\]+ at .*" \
  "set tracepoint at test_function"
gdb_trace_setactions "Set action for trace point 2" "" \
  "collect var" "^$"
gdb_test_no_output "tstart"
gdb_test "continue" \
  "Continuing.*Breakpoint $decimal.*" \
  "run trace experiment 2"
gdb_test "tstatus" \
  ".*Trace is running on the target.*" \
  "buffer full check 2"
gdb_test_no_output "tstop"
