This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 6/6] Fix racy output matching in gdb.tui/tui-completion.exp


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"
 		}
 	    }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]