#   Copyright 1998-1999, 2007-2012 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";


gdb_exit
gdb_start

standard_testfile actions.c
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"
