# Copyright 2011-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
set executable $testfile
set expfile $testfile.exp


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

if ![runto_main] {
    return -1
}

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

# Verify that the sequence of commands "tstart tstop tstart" works well.

proc test_tstart_tstop_tstart { } {
    with_test_prefix "tstart_tstop_tstart" {
	global executable
	global hex

	# Start with a fresh gdb.
	clean_restart ${executable}
	if ![runto_main] {
	    return -1
	}

	gdb_test "trace func1" "Tracepoint \[0-9\] at $hex: file.*"
	gdb_test_no_output "tstart"

	gdb_breakpoint "end" qualified
	gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" \
	    "continue to end"

	gdb_test_no_output "tstop"

	gdb_test_no_output "tstart"
    }
}

# Verify the sequence of commands "tstart tstart" works well.

proc test_tstart_tstart { } {
    with_test_prefix "tstart_tstart" {
	global executable
	global hex

	# Start with a fresh gdb.
	clean_restart ${executable}
	if ![runto_main] {
	    return -1
	}

	gdb_test "trace func1" "Tracepoint \[0-9\] at $hex: file.*"
	gdb_test_no_output "tstart"

	set test "tstart again"
	gdb_test_multiple "tstart" $test {
	    -re "A trace is running already.  Start a new run.*y or n.*" {
		# Send 'y' and make sure that we don't get any error.
		gdb_test_no_output "y" $test
	    }
	}
    }
}

# Verify that trace stops clearly when trace buffer is full.

proc test_buffer_full_tstart { } {
    with_test_prefix "buffer_full_tstart" {
	global executable
	global hex

	# Start with a fresh gdb.
	clean_restart ${executable}
	if ![runto_main] {
	    return -1
	}

	gdb_test "trace func2" "Tracepoint \[0-9\] at $hex: file.*"
	gdb_trace_setactions "collect buf: define actions" \
	    "" \
	    "collect buf" "^$"

	gdb_test_no_output "tstart"
	gdb_breakpoint "end" qualified
	gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end"

	gdb_test "tstatus" ".*buffer was full.*"
	gdb_test_no_output "tstart"
    }
}

test_tstart_tstop_tstart

test_tstart_tstart

test_buffer_full_tstart
