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

load_lib trace-support.exp
load_lib mi-support.exp

standard_testfile actions.c
if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
	  executable {debug nowarnings}] != "" } {
    untested mi-tsv-changed.exp
    return -1
}

# Test notifications on creating and deleting TSV.

proc test_create_delete_tsv { } {with_test_prefix "create delete" {
    global binfile
    global decimal

    if [mi_gdb_start] {
	return
    }
    mi_gdb_load ${binfile}

    mi_gdb_test "tvariable \$tvar1" \
	".*=tsv-created,name=\"tvar1\",value=\"0\"\\\\n.*\\^done" \
	"tvariable \$tvar1"
    mi_gdb_test "tvariable \$tvar2 = 45" \
	".*=tsv-created,name=\"tvar2\",value=\"45\"\\\\n.*\\^done" \
	"tvariable \$tvar2"

    mi_gdb_test "delete tvariable \$tvar2" \
	".*=tsv-deleted,name=\"tvar2\"\\\\n.*\\^done" \
	"delete tvariable \$tvar2"

    mi_gdb_test "delete tvariable" \
	".*=tsv-deleted\\\\n.*\\^done" \
	"delete all tvariables"

}}


# Test when GDB connects to a disconnected stub, existing TSVs in
# remote stub can be uploaded to GDB, and GDB emits MI notification
# for new uploaded TSVs.

proc test_upload_tsv { } { with_test_prefix "upload" {

    global gdbserver_reconnect_p
    global gdb_prompt
    global testfile
    global decimal

    set gdbserver_reconnect_p 1
    if { [info proc gdb_reconnect] == "" } {
	return 0
    }

    clean_restart $testfile
    if ![runto_main] then {
	fail "Can't run to main"
	return 0
    }

    gdb_test "tvariable \$tvar1" \
	"Trace state variable \\\$tvar1 created, with initial value 0." \
	"Create a trace state variable"

    gdb_test "tvariable \$tvar2 = 45" \
	"Trace state variable \\\$tvar2 created, with initial value 45." \
	"Create a trace state variable with initial value"
    # Define a tracepoint otherwise tracing cannot be started.
    gdb_test "trace main" "Tracepoint $decimal at .*"
    gdb_test_no_output "tstart" "start trace experiment"

    set test "disconnect"
    gdb_test_multiple "disconnect" $test {
	-re "Trace is running but will stop on detach; detach anyway\\? \\(y or n\\) $" {
	    pass $test

	    set test "disconnected"
	    gdb_test_multiple "y" $test {
		-re "$gdb_prompt $" {
		    pass "$test"
		}
	    }
	}
    }

    gdb_exit

    if [mi_gdb_start] {
	return
    }

    global srcdir
    global subdir
    global binfile

    mi_gdb_reinitialize_dir $srcdir/$subdir
    mi_gdb_load ${binfile}

    global gdbserver_protocol
    global gdbserver_gdbport

    send_gdb "47-target-select $gdbserver_protocol $gdbserver_gdbport\n"

    global mi_gdb_prompt
    set tsv1_created 0
    set tsv2_created 0
    gdb_expect {
	-re "=tsv-created,name=\"tvar1\",value=\"0\"" {
	    set tsv1_created 1
	    exp_continue
	}
	-re "=tsv-created,name=\"tvar2\",value=\"45\"" {
	    set tsv2_created 1
	    exp_continue
	}
	-re ".*${mi_gdb_prompt}" {

	}
    }

    if $tsv1_created {
	pass "tsv1 created"
    } else {
	fail "tsv1 created"
    }
    if $tsv2_created {
	pass "tsv2 created"
    } else {
	fail "tsv2 created"
    }

    set gdbserver_reconnect_p 0
}}

 test_create_delete_tsv

# Test target supports tracepoints or not.

clean_restart $testfile

if ![runto_main] {
    fail "Can't run to main to check for trace support"
    return -1
}

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

gdb_exit

test_upload_tsv

return 0
