# 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
set MIFLAGS "-i=mi"

standard_testfile tfile.c
set executable $testfile

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
	   executable {debug nowarnings}] != "" } {
     untested ${testfile}.exp
     return -1
}

# Make sure we are starting fresh.
remote_file host delete basic.tf
remote_file target delete basic.tf

remote_exec target "$binfile"
# Copy tracefile from target to host.
remote_download host [remote_upload target basic.tf] basic.tf

proc test_tfind_tfile { } { with_test_prefix "tfile" {
    global binfile
    global decimal

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

    mi_gdb_test "-target-select tfile basic.tf" \
	".*=breakpoint-created,bkpt=\{number=\"${decimal}\",type=\"tracepoint\",disp=\"keep\",enabled=\"y\",.*,func=\"write_basic_trace_file\".*\\^connected" \
	"select trace file"

    mi_gdb_test "tfind 0" \
	".*=traceframe-changed,num=\"0\",tracepoint=\"${decimal}\".*\\^done" \
	"tfind 0"

    # No MI notification is sent because traceframe is not changed.
    mi_gdb_test "tfind 0" \
	"\\&\"tfind 0\\\\n\"\r\n\~\"Found.*\\^done" \
	"tfind 0 again"

    mi_gdb_test "tfind end" \
	".*=traceframe-changed,end.*\\^done" \
	"tfind end"

    # No MI notification is send because request is from MI command.
    mi_gdb_test "-trace-find frame-number 0" \
	"-trace-find frame-number 0\r\n\\^done,found=\"1\",tracepoint=\"${decimal}\",traceframe=\"0\",frame=\{.*" \
	"-trace-find frame-number 0"

    mi_gdb_exit
}}

test_tfind_tfile

# Change to a different test case in order to run it on target, and get
# several traceframes.
standard_testfile status-stop.c
set testfile ${testfile}-1
set binfile ${objdir}/${subdir}/${testfile}
set executable $testfile

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
	   executable {debug nowarnings}] != "" } {
     untested ${testfile}.exp
     return -1
}

# Test target supports tracepoints or not.

clean_restart $executable

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

proc test_tfind_remote { } { with_test_prefix "remote" {
    global decimal

    if [mi_gdb_start] {
	return
    }
    mi_run_to_main

    mi_gdb_test "-break-insert end" "\\^done.*" "break end"
    mi_gdb_test "-break-insert -a func2" "\\^done.*" "break func2"
    mi_gdb_test "-trace-start" "\\^done.*" "trace start"

    mi_execute_to "exec-continue" "breakpoint-hit" end "" ".*" ".*" \
	{ "" "disp=\"keep\"" } \
	"continue to end"
    mi_gdb_test "-trace-stop" "\\^done.*" "trace stop"

    mi_gdb_test "tfind 0" \
	".*=traceframe-changed,num=\"0\",tracepoint=\"${decimal}\".*\\^done" \
	"tfind 0"

    mi_gdb_test "tfind" \
	".*=traceframe-changed,num=\"1\",tracepoint=\"${decimal}\".*\\^done" \
	"tfind"

    mi_gdb_test "tfind end" \
	".*=traceframe-changed,end.*\\^done" \
	"tfind end"

    mi_gdb_exit
}}

test_tfind_remote

return 0
