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


gdb_exit
gdb_start

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"

gdb_test "delete tracepoints" \
    "" \
    "3.1b: delete all tracepoints" \
    "Delete all tracepoints.*y or n.*$" \
    "y"


# 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_no_output "delete tracepoint $trcpt1" ""
gdb_test_multiple "delete tracepoint $trcpt1" "3.2b: delete first tracepoint" {
    -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"
    }
}

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_no_output "delete tracepoint $trcpt2" ""
gdb_test_multiple "delete tracepoint $trcpt2" "3.2d: delete second tracepoint" {
    -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"
    }
}

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_no_output "delete tracepoint $trcpt3" ""
gdb_test_multiple "delete tracepoint $trcpt3" "3.2f: delete third tracepoint" {
    -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"
    }
}

# 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_no_output "delete tracepoint $trcpt1 $trcpt2 $trcpt3" ""
gdb_test_multiple "delete tracepoint $trcpt1 $trcpt2 $trcpt3" \
    "3.3b: delete three tracepoints" {
	-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"
	}
    }

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"
