[gdb/testsuite] Fix handling of nr_args < 3 in mi_gdb_test

The documentation of mi_gdb_test states that the command, pattern and message
arguments are mandatory:
...
 # mi_gdb_test COMMAND PATTERN MESSAGE [IPATTERN] -- send a command to gdb;
 #   test the result.
...

However, this is not checked, and when mi_gdb_test is called with less than 3
arguments, it passes or fails silently.

Fix this by using the following semantics:
- if there are 1 or 2 arguments, use the command as the message.
- if there is 1 argument, use ".*" as the pattern.
- if there are no or too much arguments, error out.

Fix a PATH issue in gdb.mi/mi-logging.exp, introduced by using the command as
message.  Fix a few other trivial-looking FAILs.

There are 11 less trivial-looking FAILs left in gdb.mi in test-cases:
- mi-nsmoribund.exp
- mi-breakpoint-changed.exp
- mi-break.exp.

Tested on x86_64-linux.
This commit is contained in:
Tom de Vries 2021-09-10 17:16:48 +02:00
parent ca49878470
commit e36788d135
6 changed files with 43 additions and 12 deletions

View file

@ -341,7 +341,7 @@ proc_with_prefix test_explicit_breakpoints {} {
# First check mixed explicit/parsed linespecs. # First check mixed explicit/parsed linespecs.
mi_gdb_test "-break-insert --function main $srcfile:$line_callee3_head" \ mi_gdb_test "-break-insert --function main $srcfile:$line_callee3_head" \
".*Garbage following explicit linespec" ".*Garbage following explicit location.*"
# Insert some breakpoints and list them # Insert some breakpoints and list them
# Also, disable some so they do not interfere with other tests # Also, disable some so they do not interfere with other tests

View file

@ -32,7 +32,8 @@ if {[mi_runto_main] < 0} {
set milogfile [standard_output_file "milog.txt"] set milogfile [standard_output_file "milog.txt"]
mi_gdb_test "-gdb-set logging file $milogfile" ".*" mi_gdb_test "-gdb-set logging file $milogfile" "\\^done" \
"-gdb-set logging file"
mi_gdb_test "-gdb-set logging overwrite on" ".*" mi_gdb_test "-gdb-set logging overwrite on" ".*"

View file

@ -75,7 +75,8 @@ gdb_expect {
} }
} }
mi_gdb_test "set var *(unsigned int *) ${main_addr} = ${main_insn}" \ regsub ^0x0* $main_addr "" main_addr
".*=memory-changed,thread-group=\"i${decimal}\".addr=\"${main_addr}\",len=\"0x4\",type=\"code\".*\\^done" mi_gdb_test "set var *(unsigned int *) 0x${main_addr} = ${main_insn}" \
".*=memory-changed,thread-group=\"i${decimal}\".addr=\"0x0*${main_addr}\",len=\"0x4\",type=\"code\".*\\^done"
mi_gdb_exit mi_gdb_exit
return 0 return 0

View file

@ -115,7 +115,12 @@ mi_check_thread_states \
# gdb_test_multiple (or an MI equivalent) # gdb_test_multiple (or an MI equivalent)
mi_gdb_test "102-break-delete" "102\\^done.*" mi_gdb_test "102-break-delete" "102\\^done.*"
mi_gdb_test "print done = 1" { = 1"} set re [list \
[string_list_to_regexp ~ {"} $] \
$decimal \
[string_list_to_regexp " = 1" \\ n {"} \r\n ^ done]]
set re [join $re ""]
mi_gdb_test "print done = 1" $re
mi_gdb_test "103-exec-continue --all" "\[^\n\]*\r\n$running_re" mi_gdb_test "103-exec-continue --all" "\[^\n\]*\r\n$running_re"
gdb_expect { gdb_expect {

View file

@ -44,7 +44,9 @@ mi_runto_main
set remote_python_file [gdb_remote_download host ${srcdir}/${subdir}/${pyfile}] set remote_python_file [gdb_remote_download host ${srcdir}/${subdir}/${pyfile}]
mi_gdb_test "source ${remote_python_file}" "load python file" set cmd "source ${remote_python_file}"
set re [string_list_to_regexp & {"} $cmd \\ n {"} \r\n ^ done]
mi_gdb_test $cmd $re "load python file"
mi_continue_to_line [gdb_get_line_number {MI breakpoint here} ${srcfile}] \ mi_continue_to_line [gdb_get_line_number {MI breakpoint here} ${srcfile}] \
"step to breakpoint" "step to breakpoint"
@ -74,7 +76,7 @@ with_test_prefix "varobj nscont" {
mi_delete_varobj nscont "delete varobj" mi_delete_varobj nscont "delete varobj"
} }
mi_gdb_test "-enable-pretty-printing" "" mi_gdb_test "-enable-pretty-printing" "\\^done"
mi_create_varobj_checked string string_1 \ mi_create_varobj_checked string string_1 \
"struct string_repr" \ "struct string_repr" \
@ -283,7 +285,9 @@ with_test_prefix "varobj nscont" {
"choose default visualizer" "choose default visualizer"
} }
mi_gdb_test "python exception_flag = True" "" set cmd "python exception_flag = True"
set re [string_list_to_regexp & {"} $cmd \\ n {"} \r\n ^ done]
mi_gdb_test $cmd $re
mi_create_dynamic_varobj nstype2 nstype2 1 \ mi_create_dynamic_varobj nstype2 nstype2 1 \
"create nstype2 varobj" "create nstype2 varobj"

View file

@ -691,16 +691,18 @@ proc mi_readnow { args } {
return $readnow_p return $readnow_p
} }
# mi_gdb_test COMMAND PATTERN MESSAGE [IPATTERN] -- send a command to gdb; # mi_gdb_test COMMAND [PATTERN [MESSAGE [IPATTERN]]] -- send a command to gdb;
# test the result. # test the result.
# #
# COMMAND is the command to execute, send to GDB with send_gdb. If # COMMAND is the command to execute, send to GDB with send_gdb. If
# this is the null string no command is sent. # this is the null string no command is sent.
# PATTERN is the pattern to match for a PASS, and must NOT include # PATTERN is the pattern to match for a PASS, and must NOT include
# the \r\n sequence immediately before the gdb prompt. # the \r\n sequence immediately before the gdb prompt.
# If not specified, .* is used.
# MESSAGE is the message to be printed. (If this is the empty string, # MESSAGE is the message to be printed. (If this is the empty string,
# then sometimes we don't call pass or fail at all; I don't # then sometimes we don't call pass or fail at all; I don't
# understand this at all.) # understand this at all.)
# If not specified, COMMAND is used.
# IPATTERN is the pattern to match for the inferior's output. This parameter # IPATTERN is the pattern to match for the inferior's output. This parameter
# is optional. If present, it will produce a PASS if the match is # is optional. If present, it will produce a PASS if the match is
# successful, and a FAIL if unsuccessful. # successful, and a FAIL if unsuccessful.
@ -717,9 +719,23 @@ proc mi_gdb_test { args } {
global inferior_exited_re async global inferior_exited_re async
upvar timeout timeout upvar timeout timeout
set command [lindex $args 0] if { [llength $args] >= 1 } then {
set pattern [lindex $args 1] set command [lindex $args 0]
set message [lindex $args 2] } else {
error "Not enough arguments in mi_gdb_test"
}
if { [llength $args] >= 2 } then {
set pattern [lindex $args 1]
} else {
set pattern ".*"
}
if { [llength $args] >= 3 } then {
set message [lindex $args 2]
} else {
set message $command
}
if [llength $args]==4 { if [llength $args]==4 {
set ipattern [lindex $args 3] set ipattern [lindex $args 3]
@ -732,6 +748,10 @@ proc mi_gdb_test { args } {
set question_string "^FOOBAR$" set question_string "^FOOBAR$"
} }
if { [llength $args] >= 6 } {
error "Too many arguments in mi_gdb_test"
}
if $verbose>2 then { if $verbose>2 then {
send_user "Sending \"$command\" to gdb\n" send_user "Sending \"$command\" to gdb\n"
send_user "Looking to match \"$pattern\"\n" send_user "Looking to match \"$pattern\"\n"