From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3888 invoked by alias); 1 Aug 2019 12:04:50 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 3753 invoked by uid 89); 1 Aug 2019 12:04:49 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_NUMSUBJECT,SPF_PASS autolearn=ham version=3.3.1 spammy=regexps, gdb_prompt, a*, $gdb_prompt X-HELO: mx1.suse.de Received: from mx2.suse.de (HELO mx1.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 01 Aug 2019 12:04:47 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id E8C83AC63; Thu, 1 Aug 2019 12:04:44 +0000 (UTC) Date: Thu, 01 Aug 2019 12:04:00 -0000 From: Tom de Vries To: gdb-patches@sourceware.org Cc: Keith Seitz Subject: [PATCH][gdb/testsuite] Fix gdb.base/info-macros.exp timeout with check-run1 Message-ID: <20190801120441.GA19981@delia> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.10.1 (2018-07-13) X-IsSubscribed: yes X-SW-Source: 2019-08/txt/msg00006.txt.bz2 Hi, With gdb.base/info-macros.exp and check-run1 we get: ... FAIL: gdb.base/info-macros.exp: info macros 2 (timeout) FAIL: gdb.base/info-macros.exp: next (timeout) FAIL: gdb.base/info-macros.exp: info macros 3 (timeout) FAIL: gdb.base/info-macros.exp: next (timeout) FAIL: gdb.base/info-macros.exp: next (timeout) FAIL: gdb.base/info-macros.exp: info macros (timeout) FAIL: gdb.base/info-macros.exp: next (timeout) FAIL: gdb.base/info-macros.exp: next (timeout) FAIL: gdb.base/info-macros.exp: info macros 7 (timeout) ... Fix this by using gdb_test_sequence. Tested on x86_64-linux. OK for trunk? Thanks, - Tom [gdb/testsuite] Fix gdb.base/info-macros.exp timeout with check-run1 gdb/testsuite/ChangeLog: 2019-07-31 Tom de Vries * gdb.base/info-macros.exp: Fix check-read1 timeout using gdb_test_sequence. * lib/gdb.exp (gdb_test_sequence, gdb_expect_list): Add and handle fail and sep parameter. (regexp_or): New proc. --- gdb/testsuite/gdb.base/info-macros.exp | 201 ++++++++++++--------------------- gdb/testsuite/lib/gdb.exp | 47 +++++++- 2 files changed, 118 insertions(+), 130 deletions(-) diff --git a/gdb/testsuite/gdb.base/info-macros.exp b/gdb/testsuite/gdb.base/info-macros.exp index b76a5bbeef..9f61bd3f2e 100644 --- a/gdb/testsuite/gdb.base/info-macros.exp +++ b/gdb/testsuite/gdb.base/info-macros.exp @@ -133,153 +133,102 @@ set testname "$test" gdb_test "$test" "$r1$r2$r3$r4" "$testname" set test "info macros" -set r1 ".*#define FOO \"hello\"" -set r2 ".*#define ONE" -set r3 ".*\r\n$gdb_prompt" set testname "$test 2" -gdb_test_multiple "$test" $testname { - -re "$r1$r2$r3" { - pass $testname - } - -re ".*#define TWO.*\r\n$gdb_prompt" { - fail $testname - } - -re ".*#define THREE.*\r\n$gdb_prompt" { - fail $testname - } - -re ".*#define FOUR.*\r\n$gdb_prompt" { - fail $testname - } -} +gdb_test_sequence "$test" $testname \ + [list \ + "#define FOO \"hello\"" \ + "#define ONE"] \ + [list \ + "#define TWO" \ + "#define THREE" \ + "#define FOUR"] \ + "\r\nDefined at " + gdb_test "next" ".*" "" -set r1 ".*#define FOO \" \"" -set r2 ".*#define ONE" -set r3 ".*#define TWO" -set r4 ".*\r\n$gdb_prompt" set testname "$test 3" -gdb_test_multiple "$test" $testname { - -re ".*#define THREE.*\r\n$gdb_prompt" { - fail $testname - } - -re ".*#define FOUR.*\r\n$gdb_prompt" { - fail $testname - } - -re "$r1$r2$r3$r4" { - pass $testname - } -} +gdb_test_sequence "$test" $testname \ + [list \ + "#define FOO \" \"" \ + "#define ONE" \ + "#define TWO"] \ + [list \ + "#define THREE" \ + "#define FOUR"] \ + "\r\nDefined at " + gdb_test "next" ".*" "" # in alpabetical order... -set r1 ".*#define FOO \"world\"" -set r2 ".*#define ONE" -set r3 ".*#define THREE" -set r4 ".*#define TWO" -set r5 ".*\r\n$gdb_prompt" set testname "$test 4" -gdb_test_multiple "$test" $testname { - -re ".*#define FOUR.*\r\n$gdb_prompt" { - fail $testname - } - -re "$r1$r2$r3$r4$r5" { - pass $testname - } -} +gdb_test_sequence "$test" $testname \ + [list \ + "#define FOO \"world\"" \ + "#define ONE" \ + "#define THREE" \ + "#define TWO"] \ + [list "#define FOUR"] \ + "\r\nDefined at " + # same as above with a linespec. set test "info macros *\$pc" -gdb_test_multiple "$test" $test { - -re ".*#define FOUR.*\r\n$gdb_prompt" { - fail $test - } - -re "$r1$r2$r3$r4$r5" { - pass $test - } -} +gdb_test_sequence "$test" $test \ + [list \ + "#define FOO \"world\"" \ + "#define ONE" \ + "#define THREE" \ + "#define TWO"] \ + [list "#define FOUR"] \ + "\r\nDefined at " + gdb_test "next" ".*" "" -set r1 ".*#define FOO \" \"" -set r2 ".*#define ONE" -set r3 ".*#define TWO." -set r4 ".*\r\n$gdb_prompt" set test "info macros" set testname "$test 5" -gdb_test_multiple "$test" $test { - -re ".*#define THREE.*\r\n$gdb_prompt" { - fail $testname - } - -re ".*#define FOUR.*\r\n$gdb_prompt" { - fail $testname - } - -re "$r1$r2$r3$r4" { - pass $testname - } -} +gdb_test_sequence "$test" $testname \ + [list \ + "#define FOO \" \"" \ + "#define ONE" \ + "#define TWO."] \ + [list \ + "#define THREE" \ + "#define FOUR"] \ + "\r\nDefined at " + gdb_test "next" ".*" "" gdb_test "next" ".*" "" -set r1 ".*#define DEF_MACROS" -set r2 ".*\r\n$gdb_prompt" +set r2 "\r\n$gdb_prompt" set testname "$test 6" -gdb_test_multiple "$test" $testname { - -re ".*#define FOO \" \".*\r\n$gdb_prompt" { - fail $testname - } - -re ".*#define FOO \"hello\".*\r\n$gdb_prompt" { - fail $testname - } - -re ".*#define FOO \"world\".*\r\n$gdb_prompt" { - fail $testname - } - -re ".*#define FOO\\(a\\) foo = a.*" { - fail $testname - } - -re ".*#define ONE.*\r\n$gdb_prompt" { - fail $testname - } - -re ".*#define TWO.*\r\n$gdb_prompt" { - fail $testname - } - -re ".*#define THREE.*\r\n$gdb_prompt" { - fail $testname - } - -re ".*#define FOUR.*\r\n$gdb_prompt" { - fail $testname - } - -re "$r1$r2" { - pass $testname - } -} +gdb_test_sequence "$test" $testname \ + [list \ + "#define DEF_MACROS"] \ + [list \ + "#define FOO \" \"" \ + "#define FOO \"hello\"" \ + "#define FOO \"world\"" \ + "#define FOO\\(a\\) foo = a" \ + "#define ONE" \ + "#define TWO" \ + "#define THREE" \ + "#define FOUR"] \ + "\r\nDefined at " gdb_test "next" ".*" "" -set r1 ".*#define DEF_MACROS" -set r2 ".*#define FOO\\(a\\) foo = a" -set r3 ".*#define FOUR" -set r4 ".*\r\n$gdb_prompt" set testname "$test 7" -gdb_test_multiple "$test" $testname { - -re ".*#define FOO \" \".*\r\n$gdb_prompt" { - fail $testname - } - -re ".*#define FOO \"hello\".*\r\n$gdb_prompt" { - fail $testname - } - -re ".*#define FOO \"world\".*\r\n$gdb_prompt" { - fail $testname - } - -re ".*#define ONE.*\r\n$gdb_prompt" { - fail $testname - } - -re ".*#define TWO.*\r\n$gdb_prompt" { - fail $testname - } - -re ".*#define THREE.*\r\n$gdb_prompt" { - fail $testname - } - -re "$r1$r2$r3$r4" { - pass $testname - } -} +gdb_test_sequence "$test" $testname \ + [list \ + "#define DEF_MACROS" \ + "#define FOO\\(a\\) foo = a" \ + "#define FOUR"] \ + [list \ + "#define FOO \" \"" \ + "#define FOO \"hello\"" \ + "#define FOO \"world\"" \ + "#define ONE" \ + "#define TWO" \ + "#define THREE"] \ + "\r\nDefined at " set test "info macros info-macros.c:42" diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index 9ca34d8b15..cc907c3ac6 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -1171,6 +1171,9 @@ proc gdb_test_no_output { args } { # TEST_NAME is passed to pass/fail. COMMAND is used if TEST_NAME is "". # EXPECTED_OUTPUT_LIST is a list of regexps of expected output, which are # processed in order, and all must be present in the output. +# FAIL_LIST is a list or regexps that cause the test to fail +# SEP is a regexp that indicates where the output can be discarded using an +# exp_continue # # It is unnecessary to specify ".*" at the beginning or end of any regexp, # there is an implicit ".*" between each element of EXPECTED_OUTPUT_LIST. @@ -1184,7 +1187,8 @@ proc gdb_test_no_output { args } { # 0 if the test passes, # -1 if there was an internal error. -proc gdb_test_sequence { command test_name expected_output_list } { +proc gdb_test_sequence { command test_name expected_output_list \ + {fail_list "" } {sep ""}} { global gdb_prompt if { $test_name == "" } { set test_name $command @@ -1193,7 +1197,8 @@ proc gdb_test_sequence { command test_name expected_output_list } { if { $command != "" } { send_gdb "$command\n" } - return [gdb_expect_list $test_name "$gdb_prompt $" $expected_output_list] + return [gdb_expect_list $test_name "$gdb_prompt $" $expected_output_list \ + $fail_list $sep] } @@ -4103,12 +4108,24 @@ proc gdb_expect { args } { } } -# gdb_expect_list TEST SENTINEL LIST -- expect a sequence of outputs +# Return a regexp that matches any of the regexp elements in L. +proc regexp_or { l } { + if { [llength $l] == 1 } { + return [lindex $l 0] + } + return [join [list "(" [join $l "|" ] ")"] ""] +} + +# gdb_expect_list TEST SENTINEL LIST FAIL_LIST SEP +# -- expect a sequence of outputs # # Check for long sequence of output by parts. # TEST: is the test message to be printed with the test success/fail. # SENTINEL: Is the terminal pattern indicating that output has finished. # LIST: is the sequence of outputs to match. +# FAIL_LIST: is a list or regexps that cause the test to fail +# SEP: is a regexp that indicates where the output can be discarded using an +# exp_continue # If the sentinel is recognized early, it is considered an error. # # Returns: @@ -4116,7 +4133,7 @@ proc gdb_expect { args } { # 0 if the test passes, # -1 if there was an internal error. -proc gdb_expect_list {test sentinel list} { +proc gdb_expect_list {test sentinel list {fail_list ""} {sep ""} } { global gdb_prompt global suppress_flag set index 0 @@ -4125,6 +4142,14 @@ proc gdb_expect_list {test sentinel list} { set ok 0 unresolved "${test}" } + if { $fail_list == "" } { + set fail_pat {\$^} + } else { + set fail_pat [regexp_or $fail_list] + } + if { $sep == "" } { + set sep {\$^} + } while { ${index} < [llength ${list}] } { set pattern [lindex ${list} ${index}] set index [expr ${index} + 1] @@ -4132,6 +4157,10 @@ proc gdb_expect_list {test sentinel list} { if { ${index} == [llength ${list}] } { if { ${ok} } { gdb_expect { + -re "${fail_pat}" { + fail "${test}" + set ok 0 + } -re "${pattern}${sentinel}" { # pass "${test}, pattern ${index} + sentinel" } @@ -4148,6 +4177,9 @@ proc gdb_expect_list {test sentinel list} { fail "${test} (pattern ${index} + sentinel) (timeout)" set ok 0 } + -re "${sep}" { + exp_continue + } } } else { # unresolved "${test}, pattern ${index} + sentinel" @@ -4155,6 +4187,10 @@ proc gdb_expect_list {test sentinel list} { } else { if { ${ok} } { gdb_expect { + -re "${fail_pat}" { + fail "${test}" + set ok 0 + } -re "${pattern}" { # pass "${test}, pattern ${index}" } @@ -4171,6 +4207,9 @@ proc gdb_expect_list {test sentinel list} { fail "${test} (pattern ${index}) (timeout)" set ok 0 } + -re "${sep}" { + exp_continue + } } } else { # unresolved "${test}, pattern ${index}"