# Copyright 2011-2012 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";

set testfile "status-stop"
set executable $testfile
set srcfile ${testfile}.c
set binfile $objdir/$subdir/$testfile
set expfile $testfile.exp


if [prepare_for_testing $expfile $executable $srcfile \
        {debug nowarnings}] {
    untested "failed to prepare for trace tests"
    return -1
}

if ![runto_main] {
    fail "Can't run to main to check for trace support"
    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] {
        fail "Can't run to main"
        return -1
    }

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

    gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*"
    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] {
        fail "Can't run to main"
        return -1
    }

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

    gdb_test "tstart" "" "tstart again" "A trace is running already.  Start a new run\\? \\(y or n\\) " "y"
}}

# 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] {
        fail "Can't run to 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_test "break end" "Breakpoint \[0-9\] at $hex: file.*"
    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
