This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH 6/6] Fix racy output matching in gdb.tui/tui-completion.exp
- From: Simon Marchi <simon dot marchi at ericsson dot com>
- To: Pedro Alves <palves at redhat dot com>, <gdb-patches at sourceware dot org>
- Date: Wed, 15 Nov 2017 11:08:35 -0500
- Subject: Re: [PATCH 6/6] Fix racy output matching in gdb.tui/tui-completion.exp
- Authentication-results: sourceware.org; auth=none
- Authentication-results: spf=none (sender IP is ) smtp.mailfrom=simon dot marchi at ericsson dot com;
- References: <1509039747-15026-1-git-send-email-palves@redhat.com> <1509039747-15026-7-git-send-email-palves@redhat.com>
- Spamdiagnosticmetadata: NSPM
- Spamdiagnosticoutput: 1:99
On 2017-10-26 01:42 PM, Pedro Alves wrote:
> 'make check-read1 TESTS="gdb.tui/tui-completion.exp"' exposes this test race:
>
> (gdb) PASS: gdb.tui/completion.exp: set max-completions unlimited
> layout ^G
> asm next prev regs split src
> (gdb) FAIL: gdb.tui/completion.exp: completion of layout names: tab completion
> Quit
> (gdb) PASS: gdb.tui/completion.exp: completion of layout names: quit command input
> focus ^G
> cmd next prev src
> (gdb) FAIL: gdb.tui/completion.exp: completion of focus command: tab completion
> Quit
>
> This is caused by expecting "$gdb_prompt layout $".
> gdb_test_multiple's internal prompt regexp can match first if expect's
> internal buffer is filled with partial output. Fix that by splitting
> the gdb_test_multiple in question in two. Since the same problem/code
> appears twice in the file, factor out a common procedure.
>
> gdb/testsuite/ChangeLog:
> yyyy-mm-dd Pedro Alves <palves@redhat.com>
>
> * gdb.tui/tui-completion.exp (test_tab_completion): New procedure,
> factored out from ...
> (top level): ... here, and adjusted to avoid expecting beyond the
> prompt in a single gdb_test_multiple.
> ---
> gdb/testsuite/gdb.tui/completion.exp | 36 +++++++++++++++++-------------------
> 1 file changed, 17 insertions(+), 19 deletions(-)
>
> diff --git a/gdb/testsuite/gdb.tui/completion.exp b/gdb/testsuite/gdb.tui/completion.exp
> index ac5d5f2..f53a244 100644
> --- a/gdb/testsuite/gdb.tui/completion.exp
> +++ b/gdb/testsuite/gdb.tui/completion.exp
> @@ -22,12 +22,20 @@ if {[skip_tui_tests] || [target_info exists gdb,nointerrupts]} {
>
> gdb_test_no_output "set max-completions unlimited"
>
> -with_test_prefix "completion of layout names" {
> +# TAB-complete INPUT_LINE, and expect EXPECTED_RE as completion match
> +# output.
> +proc test_tab_completion {input_line expected_re} {
> + global gdb_prompt
> +
> set test "tab completion"
> - send_gdb "layout\t\t\t"
> + send_gdb "$input_line\t\t\t"
> gdb_test_multiple "" "$test" {
> - -re "asm *next *prev *regs *split *src *\r\n$gdb_prompt layout $" {
> - pass "$test"
> + -re "$expected_re\r\n$gdb_prompt " {
> + gdb_test_multiple "" "$test" {
> + -re "^$input_line$" {
> + pass "$test"
> + }
> + }
> }
> }
> send_gdb "\003"
> @@ -39,20 +47,10 @@ with_test_prefix "completion of layout names" {
> }
> }
>
> -with_test_prefix "completion of focus command" {
> - set test "tab completion"
> - send_gdb "focus \t\t"
> - gdb_test_multiple "" "$test" {
> - -re "cmd *next *prev *src *\r\n$gdb_prompt focus $" {
> - pass "$test"
> - }
> - }
> +with_test_prefix "completion of layout names" {
> + test_tab_completion "layout" "asm *next *prev *regs *split *src *"
> +}
>
> - send_gdb "\003"
> - set test "quit command input"
> - gdb_test_multiple "" "$test" {
> - -re "$gdb_prompt $" {
> - pass "$test"
> - }
> - }
> +with_test_prefix "completion of focus command" {
> + test_tab_completion "focus" "cmd *next *prev *src *"
> }
>
Hi Pedro,
I am seeing a failure in this test (gdb.tui/completion.exp), I pushed
this patch to fix it.
commit 71774bc994e3f2a09c3b1988dbf2e99b86f53e2e
Author: Simon Marchi <simon.marchi@ericsson.com>
Date: Wed Nov 15 11:07:02 2017 -0500
Fix gdb.tui/completion.exp test
When I run it locally, the test gdb.tui/completion.exp test fails
because of a timeout:
Running /home/emaisin/src/binutils-gdb/gdb/testsuite/gdb.tui/completion.exp ...
FAIL: gdb.tui/completion.exp: completion of layout names: tab completion (timeout)
The problem seems to be this regex, which confirms that after doing
layout<TAB>, "layout" is printed again after the gdb prompt:
-re "^$input_line$"
The problem is that there's a trailing space in the output after
"layout". Since the regex has an anchored end (the $), it doesn't
match. Adding a space fixes the test.
gdb/testsuite/ChangeLog:
* gdb.tui/completionn.exp (test_tab_completion): Add space in
regex.
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 8c57179..bb8dd79 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-11-15 Simon Marchi <simon.marchi@ericsson.com>
+
+ * gdb.tui/completionn.exp (test_tab_completion): Add space in
+ regex.
+
2017-11-13 Simon Marchi <simon.marchi@polymtl.ca>
* gdb.opt/inline-locals.exp: Remove trailing parentheses from
diff --git a/gdb/testsuite/gdb.tui/completion.exp b/gdb/testsuite/gdb.tui/completion.exp
index f53a244..426b6bf 100644
--- a/gdb/testsuite/gdb.tui/completion.exp
+++ b/gdb/testsuite/gdb.tui/completion.exp
@@ -32,7 +32,7 @@ proc test_tab_completion {input_line expected_re} {
gdb_test_multiple "" "$test" {
-re "$expected_re\r\n$gdb_prompt " {
gdb_test_multiple "" "$test" {
- -re "^$input_line$" {
+ -re "^$input_line $" {
pass "$test"
}
}