#   Copyright 1998, 1999, 2007, 2008, 2009 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/>.

# This file was written by Michael Snyder (msnyder@cygnus.com)

load_lib "trace-support.exp";

if $tracelevel then {
    strace $tracelevel
}

set prms_id 0
set bug_id 0

gdb_exit
gdb_start

if [istarget "m68k-*-elf"] then {
    set srcfile gdb_c_test.c
    set binfile [board_info target d490_binfile];
} else {
    set testfile "actions"
    set srcfile ${testfile}.c
    set binfile $objdir/$subdir/deltrace
    if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
	    executable {debug nowarnings}] != "" } {
	untested deltrace.exp
	return -1
    }
}
gdb_reinitialize_dir $srcdir/$subdir

# If testing on a remote host, download the source file.
# remote_download host $srcdir/$subdir/$srcfile

gdb_file_cmd $binfile

# define relative source line numbers:
# all subsequent line numbers are relative to this first one (baseline)
set baseline [gdb_find_recursion_test_baseline $srcfile];
if { $baseline == -1 } then {
    fail "Could not find gdb_recursion_test function"
    return;
}
set testline1 [expr $baseline + 4]

#
# test "delete tracepoints" command
#

# 3.1 delete tracepoints (all)
gdb_delete_tracepoints
gdb_test "trace gdb_c_test"   "Tracepoint \[0-9\]+ at .*" "set tracepoint 1"
gdb_test "trace gdb_asm_test" "Tracepoint \[0-9\]+ at .*" "set tracepoint 2"
gdb_test "trace $testline1"   "Tracepoint \[0-9\]+ at .*" "set tracepoint 3"

gdb_test "info tracepoints" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+.
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+.
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+" \
			"3.1a: set three tracepoints"

send_gdb "delete tracepoints\n"
gdb_expect 30 {
    -re "Delete all tracepoints.*y or n.*$" {
	send_gdb "y\n"
	gdb_expect 30 {
	    -re "$gdb_prompt $" {
		pass "3.1b: delete all tracepoints"
	    }
	    timeout { fail "3.1b: delete all tracepoints (timeout)" }
	}
    }
    -re "$gdb_prompt $" { # This should only happen if there are no tracepoints
	fail "3.1b: delete all tracepoints (no tracepoints?)"
    }
    timeout { fail "3.1b: delete all tracepoints (timeout)" }
}

# 3.2 delete tracepoint <n>
gdb_delete_tracepoints
set trcpt1 [gdb_gettpnum gdb_c_test];
set trcpt2 [gdb_gettpnum gdb_asm_test];
set trcpt3 [gdb_gettpnum $testline1];
if { $trcpt1 <= 0 || $trcpt2 <= 0 || $trcpt3 <= 0 } then {
    fail "setting tracepoints"
    return;
}

gdb_test "info tracepoints" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+.
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+.
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+" \
			"3.2a: set three tracepoints"

#gdb_test "delete tracepoint $trcpt1" "" ""
send_gdb "delete tracepoint $trcpt1\n"
gdb_expect {
    -re "No tracepoint number.*$gdb_prompt $" {
	fail "3.2b: delete first tracepoint"
    }
    -re ".*\[Ee\]rror.*$gdb_prompt $" {
	fail "3.2b: delete first tracepoint"
    }
    -re "$gdb_prompt $" {
	pass "3.2b: delete first tracepoint"
    }
    timeout {
	fail "3.2b: delete first tracepoint (timeout)"
    }
}

gdb_test "info tracepoints" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+.
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+" \
			"3.2c: verify delete first tracepoint"

#gdb_test "delete tracepoint $trcpt2" "" ""
send_gdb "delete tracepoint $trcpt2\n"
gdb_expect {
    -re "No tracepoint number.*$gdb_prompt $" {
	fail "3.2d: delete second tracepoint"
    }
    -re ".*\[Ee\]rror.*$gdb_prompt $" {
	fail "3.2d: delete second tracepoint"
    }
    -re "$gdb_prompt $" {
	pass "3.2d: delete second tracepoint"
    }
    timeout {
	fail "3.2d: delete second tracepoint (timeout)"
    }
}

gdb_test "info tracepoints" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+" \
			"3.2e: verify delete second tracepoint"

#gdb_test "delete tracepoint $trcpt3" "" ""
send_gdb "delete tracepoint $trcpt3\n"
gdb_expect {
    -re "No tracepoint number.*$gdb_prompt $" {
	fail "3.2f: delete third tracepoint"
    }
    -re ".*\[Ee\]rror.*$gdb_prompt $" {
	fail "3.2f: delete third tracepoint"
    }
    -re "$gdb_prompt $" {
	pass "3.2f: delete third tracepoint"
    }
    timeout {
	fail "3.2f: delete third tracepoint (timeout)"
    }
}

# send_gdb "ARF! \\n\n"
gdb_test "info tracepoints" \
    "No tracepoints." \
			"3.2g: verify delete third tracepoint"

# 3.3 delete three tracepoints at once
gdb_delete_tracepoints
set trcpt1 [gdb_gettpnum gdb_c_test];
set trcpt2 [gdb_gettpnum gdb_asm_test];
set trcpt3 [gdb_gettpnum $testline1];
if { $trcpt1 <= 0 || $trcpt2 <= 0 || $trcpt3 <= 0 } then {
    fail "setting tracepoints"
    return;
}

gdb_test "info tracepoints" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+.
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+.
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+" \
			"3.3a: set three tracepoints"

#gdb_test "delete tracepoint $trcpt1 $trcpt2 $trcpt3" "" ""
send_gdb "delete tracepoint $trcpt1 $trcpt2 $trcpt3\n"
gdb_expect {
    -re "No tracepoint number.*$gdb_prompt $" {
	fail "3.3b: delete three tracepoints"
    }
    -re ".*\[Ee\]rror.*$gdb_prompt $" {
	fail "3.3b: delete three tracepoints"
    }
    -re "$gdb_prompt $" {
	pass "3.3b: delete three tracepoints"
    }
    timeout {
	fail "3.3b: delete three tracepoint (timeout)"
    }
}

gdb_test "info tracepoints" \
    "No tracepoints." \
			"3.3c: verify delete three tracepoints" 

# 3.4 delete invalid tracepoint number
gdb_test "delete tracepoint [expr $trcpt2 + $trcpt3]" \
    "No breakpoint number [expr $trcpt2 + $trcpt3]." \
			"3.4: delete invalid tracepoint number"

# 3.5 delete tracepoint number zero
gdb_test "delete tracepoint 0" "bad breakpoint number at or near '0'" \
			"3.5: delete tracepoint number zero"

# 3.6 help delete tracepoints
gdb_test "help delete tracepoints" \
    "Delete specified tracepoints.*" \
			"3.6: help delete tracepoints"
