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

# 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

    # 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 main" ".*"
    gdb_test_no_output "tstart"

    gdb_test "info tracepoints" ".*in main 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 main 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 "info tracepoints" ".*in main at.*" "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
