# 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 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" "=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
