#   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
