#   Copyright 2012-2013 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/>.

# Test of disconnected-tracing.

load_lib "trace-support.exp";

standard_testfile
set executable $testfile
set expfile $testfile.exp
set gdbserver_reconnect_p 1

if { [info proc gdb_reconnect] == "" } {
    unsupported "target does not support reconnect"
    return -1
}

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;
}

# Disconnect in tracing.

proc disconnected_tracing {  } { with_test_prefix "trace" {
    global executable
    global decimal
    global srcfile

    # Start with a fresh gdb.
    clean_restart ${executable}
    if ![runto_main] {
	fail "Can't run to main"
	return -1
    }

    gdb_test_no_output "set confirm off"
    gdb_test_no_output "set disconnected-tracing on"
    gdb_test "trace start" ".*"
    gdb_trace_setactions "collect on tracepoint 2" "2" \
	"collect foo" "^$"
    gdb_test "break end" "Breakpoint ${decimal} at .*"

    gdb_test_no_output "tstart"

    gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*"
    gdb_test_no_output "tstop"

    gdb_test "info tracepoints" ".*in start at.*" \
	"first info tracepoints"

    gdb_test "disconnect" "Ending remote debugging\\." "first disconnect"
    if { [gdb_reconnect] == 0 } {
	pass "first reconnect after unload"
    } else {
	fail "first reconnect after unload"
	return 0
    }
    gdb_test "info tracepoints" ".*in start at.*" \
	"second info tracepoints"

    delete_breakpoints
    gdb_test "info tracepoints" ".*No tracepoints..*" \
	"third info tracepoints"

    gdb_test "disconnect" "Ending remote debugging\\." "second disconnect"
    if { [gdb_reconnect] == 0 } {
	pass "second reconnect after unload"
    } else {
	fail "second reconnect after unload"
	return 0
    }
    gdb_test "tstatus"
    gdb_test "info tracepoints" \
	"Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+tracepoint     keep y.* in start at .*$srcfile:\[0-9\]+.
\[\t \]+tracepoint already hit 1 time.
\[\t \]+trace buffer usage ${decimal} bytes.
\[\t \]+collect foo.*" \
	"fourth info tracepoints"
}}

disconnected_tracing

# Disconnected in tfind

proc disconnected_tfind {  } { with_test_prefix "tfind" {
    global executable
    global decimal

    # Start with a fresh gdb.
    clean_restart ${executable}
    if ![runto_main] {
	fail "Can't run to main"
	return -1
    }

    gdb_test_no_output "set confirm off"
    gdb_test_no_output "set disconnected-tracing on"
    gdb_test "trace start" ".*"
    gdb_test_no_output "tstart"

    gdb_test "break end" "Breakpoint ${decimal} at .*"
    gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*"
    gdb_test_no_output "tstop"

    gdb_test "tfind" "Found trace frame 0, tracepoint .*" "tfind frame 0"
    gdb_test "p \$trace_frame" ".*\\\$${decimal} = 0.*" \
	"p \$trace_frame before disconnected"
    gdb_test "p \$tracepoint" ".*\\\$${decimal} = 2.*" \
	"p \$tracepoint before disconnected"

    gdb_test "disconnect" "Ending remote debugging\\." "first disconnect"

    gdb_test "p \$trace_frame" ".*\\\$${decimal} = -1.*"
    gdb_test "p \$tracepoint" ".*\\\$${decimal} = -1.*"
    gdb_test "p \$trace_line" ".*\\\$${decimal} = -1.*"
    gdb_test "p \$trace_file" ".*\\\$${decimal} = void.*"
    gdb_test "p \$trace_func" ".*\\\$${decimal} = void.*"
}}

disconnected_tfind
