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

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 tfile-basic.tf
remote_file target delete tfile-basic.tf

remote_exec target "$binfile"
# Copy tracefile from target to host.
remote_download host [remote_upload target tfile-basic.tf] \
    tfile-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 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" "=breakpoint-modified,bkpt={.*installed=\"y\".*}.*\\^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
