#   Copyright 1998, 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/infotrace
if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
	  executable {debug nowarnings}] != "" } {
    untested infotrace.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

#
# test "info tracepoints" command
#

gdb_delete_tracepoints
set c_test_num [gdb_gettpnum gdb_c_test];
set asm_test_num [gdb_gettpnum gdb_asm_test];
if { $c_test_num <= 0 || $asm_test_num <= 0 } then {
    fail "setting tracepoints"
    return;
}

# 2.1 info tracepoints (all)
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\]+." \
    "2.1: info tracepoints (all)"

# 2.2 info tracepoint (specific)
gdb_test "info tracepoint $c_test_num" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+." \
    "2.2a: info tracepoint $c_test_num (gdb_c_test)"

gdb_test "info tracepoint $asm_test_num" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+." \
    "2.2b: info tracepoint $asm_test_num (gdb_asm_test)"

# 2.3 info tracepoint (invalid tracepoint number)
gdb_test "info tracepoint [expr $c_test_num + $asm_test_num]" \
    "No tracepoint number [expr $c_test_num + $asm_test_num]." \
    "2.3: info tracepoint (invalid tracepoint number)"

# 2.4 info tracepoints (list of numbers)
gdb_test_multiple "info tracepoints $c_test_num $asm_test_num " \
    "2.4: info trace rejects multiple tracepoint numbers" {
	-re "Num Enb .*$gdb_prompt $" {
	    fail "2.4: info trace rejects multiple tracepoint numbers"
	}
	-re ".*$gdb_prompt $" {
	    pass "2.4: info trace rejects multiple tracepoint numbers"
	}
    }

# 2.5 help info trace
gdb_test "help info tracepoints" \
    "Status of tracepoints, or tracepoint number NUMBER.*" \
    "2.5: help info tracepoints"

