From 188a61b4404369ae30dce95ad4b05975a3609a33 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Wed, 29 Jul 2015 11:09:37 +0100 Subject: [PATCH] Introduce gdb_test_stdio This adds a new helper procedure to be used by tests that rely on stdio. gdb/testsuite/ChangeLog: 2015-07-29 Pedro Alves * lib/gdb.exp (gdb_test_stdio): New procedure. --- gdb/testsuite/ChangeLog | 4 +++ gdb/testsuite/lib/gdb.exp | 67 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 1820b275d30..f2f6adada2c 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2015-07-29 Pedro Alves + + * lib/gdb.exp (gdb_test_stdio): New procedure. + 2015-07-29 Pedro Alves * gdb.base/restore.exp (restore_tests): Use gdb_continue_to_end. diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index c5cfa4b5d93..e3faf181daa 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -1230,6 +1230,73 @@ proc gdb_test_list_exact { cmd name elm_find_regexp elm_extract_regexp result_ma } } } + +# gdb_test_stdio COMMAND INFERIOR_PATTERN GDB_PATTERN MESSAGE +# Send a command to gdb; expect inferior and gdb output. +# +# See gdb_test_multiple for a description of the COMMAND and MESSAGE +# parameters. +# +# INFERIOR_PATTERN is the pattern to match against inferior output. +# +# GDB_PATTERN is the pattern to match against gdb output, and must NOT +# include the \r\n sequence immediately before the gdb prompt, nor the +# prompt. The default is empty. +# +# Both inferior and gdb patterns must match for a PASS. +# +# If MESSAGE is ommitted, then COMMAND will be used as the message. +# +# Returns: +# 1 if the test failed, +# 0 if the test passes, +# -1 if there was an internal error. +# + +proc gdb_test_stdio {command inferior_pattern {gdb_pattern ""} {message ""}} { + global inferior_spawn_id gdb_spawn_id + global gdb_prompt + + if {$message == ""} { + set message $command + } + + set inferior_matched 0 + set gdb_matched 0 + + # Use an indirect spawn id list, and remove the inferior spawn id + # from the expected output as soon as it matches, in case + # $inferior_pattern happens to be a prefix of the resulting full + # gdb pattern below (e.g., "\r\n"). + global gdb_test_stdio_spawn_id_list + set gdb_test_stdio_spawn_id_list "$inferior_spawn_id" + + # Note that if $inferior_spawn_id and $gdb_spawn_id are different, + # then we may see gdb's output arriving before the inferior's + # output. + set res [gdb_test_multiple $command $message { + -i gdb_test_stdio_spawn_id_list -re "$inferior_pattern" { + set inferior_matched 1 + if {!$gdb_matched} { + set gdb_test_stdio_spawn_id_list "" + exp_continue + } + } + -i $gdb_spawn_id -re "$gdb_pattern\r\n$gdb_prompt $" { + set gdb_matched 1 + if {!$inferior_matched} { + exp_continue + } + } + }] + if {$res == 0} { + pass $message + } else { + verbose -log "inferior_matched=$inferior_matched, gdb_matched=$gdb_matched" + } + return $res +} + # Issue a PASS and return true if evaluating CONDITION in the caller's -- 2.30.2