# 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
append testfile -1
append binfile -1
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
