[committed,gdb/testsuite] Fix gdb.base/define.exp with check-read1

Message ID c8fba06e-d6cc-7434-4d16-fcb0c78824a9@suse.de
State New, archived
Headers

Commit Message

Tom de Vries July 29, 2019, 9:38 a.m. UTC
  [ was: Re: [PATCH v2] Restore original GDB prompt in define.exp ]
On 09-07-19 09:17, Richard Bunt wrote:
> Restore original GDB prompt in define.exp
> 
> define.exp will fail on a GDB which has set a custom prompt to identify
> itself.  This is because the test resets the prompt to a hard coded
> "(gdb)" but then verifies the success of this against the value in
> $gdb_prompt, which is set to the custom prompt.
> 
> The original approach to fix this involved resetting the prompt to
> $gdb_prompt rather than a hard coded "(gdb)". However it was noted during
> review that $gdb_prompt is a regular expression rather than a string.
> This is problematic because in general the prompt would be reset to a
> regular expression rather than an instance of a string accepted by said
> regular expression.
> 
> The fix used in commit avoids the above issue by capturing the literal
> prompt from running "show prompt" and uses this literal to restore the
> previous prompt.
> 
> Regression tested with GCC 7.3.0 on x86_64, ppc64le, aarch64.
> 
> gdb/testsuite/ChangeLog:
> 
> 2019-07-04  Richard Bunt  <richard.bunt@arm.com>
> 	Stephen Roberts  <stephen.roberts@arm.com>
> 
> 	* gdb.base/define.exp: Restore original prompt.
> 
> ---
>  gdb/testsuite/gdb.base/define.exp | 11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
> 
> diff --git a/gdb/testsuite/gdb.base/define.exp b/gdb/testsuite/gdb.base/define.exp
> index 0590da9..e8508b8 100644
> --- a/gdb/testsuite/gdb.base/define.exp
> +++ b/gdb/testsuite/gdb.base/define.exp
> @@ -283,6 +283,15 @@ gdb_test_multiple "define target hookpost-testsuite" "" {
> 
>  gdb_test "target testsuite" "one\r\nhello\r\ntwo" "target testsuite with hooks"
> 
> +# Save the GDB prompt so it can be restored to the original value later.
> +set prior_prompt ""
> +gdb_test_multiple "show prompt" "save gdb_prompt" {
> +    -re "Gdb's prompt is \"($gdb_prompt) \"\.\[\r\n\]*$gdb_prompt $" {
> +	set prior_prompt $expect_out(1,string)
> +	pass "save gdb_prompt"
> +    }
> +}
> +
>  # This is a quasi-define command: Verify that the user can redefine
>  # GDB's gdb_prompt.
>  #
> @@ -292,7 +301,7 @@ gdb_test_multiple "set prompt \\(blah\\) " "set gdb_prompt" {
>      }
>  }
> 
> -gdb_test_multiple "set prompt \\(gdb\\) " "reset gdb_prompt" {
> +gdb_test_multiple "set prompt $prior_prompt " "reset gdb_prompt" {
>      -re "$gdb_prompt $" {
>  	pass "reset gdb_prompt"
>      }
> 

This seems to have caused a check-read1 regression.

Fixed by patch below, committed to trunk.

Thanks,
- Tom
  

Comments

Richard Bunt July 30, 2019, 8:21 a.m. UTC | #1
Sorry about this and thanks for fixing. I'll be adding check-read1 to my
test case checklist.

Rich

On 7/29/19 10:38 AM, Tom de Vries wrote:
> [ was: Re: [PATCH v2] Restore original GDB prompt in define.exp ]

> On 09-07-19 09:17, Richard Bunt wrote:

>> Restore original GDB prompt in define.exp

>>

>> define.exp will fail on a GDB which has set a custom prompt to identify

>> itself.  This is because the test resets the prompt to a hard coded

>> "(gdb)" but then verifies the success of this against the value in

>> $gdb_prompt, which is set to the custom prompt.

>>

>> The original approach to fix this involved resetting the prompt to

>> $gdb_prompt rather than a hard coded "(gdb)". However it was noted during

>> review that $gdb_prompt is a regular expression rather than a string.

>> This is problematic because in general the prompt would be reset to a

>> regular expression rather than an instance of a string accepted by said

>> regular expression.

>>

>> The fix used in commit avoids the above issue by capturing the literal

>> prompt from running "show prompt" and uses this literal to restore the

>> previous prompt.

>>

>> Regression tested with GCC 7.3.0 on x86_64, ppc64le, aarch64.

>>

>> gdb/testsuite/ChangeLog:

>>

>> 2019-07-04  Richard Bunt  <richard.bunt@arm.com>

>> 	Stephen Roberts  <stephen.roberts@arm.com>

>>

>> 	* gdb.base/define.exp: Restore original prompt.

>>

>> ---

>>  gdb/testsuite/gdb.base/define.exp | 11 ++++++++++-

>>  1 file changed, 10 insertions(+), 1 deletion(-)

>>

>> diff --git a/gdb/testsuite/gdb.base/define.exp b/gdb/testsuite/gdb.base/define.exp

>> index 0590da9..e8508b8 100644

>> --- a/gdb/testsuite/gdb.base/define.exp

>> +++ b/gdb/testsuite/gdb.base/define.exp

>> @@ -283,6 +283,15 @@ gdb_test_multiple "define target hookpost-testsuite" "" {

>>

>>  gdb_test "target testsuite" "one\r\nhello\r\ntwo" "target testsuite with hooks"

>>

>> +# Save the GDB prompt so it can be restored to the original value later.

>> +set prior_prompt ""

>> +gdb_test_multiple "show prompt" "save gdb_prompt" {

>> +    -re "Gdb's prompt is \"($gdb_prompt) \"\.\[\r\n\]*$gdb_prompt $" {

>> +	set prior_prompt $expect_out(1,string)

>> +	pass "save gdb_prompt"

>> +    }

>> +}

>> +

>>  # This is a quasi-define command: Verify that the user can redefine

>>  # GDB's gdb_prompt.

>>  #

>> @@ -292,7 +301,7 @@ gdb_test_multiple "set prompt \\(blah\\) " "set gdb_prompt" {

>>      }

>>  }

>>

>> -gdb_test_multiple "set prompt \\(gdb\\) " "reset gdb_prompt" {

>> +gdb_test_multiple "set prompt $prior_prompt " "reset gdb_prompt" {

>>      -re "$gdb_prompt $" {

>>  	pass "reset gdb_prompt"

>>      }

>>

> 

> This seems to have caused a check-read1 regression.

> 

> Fixed by patch below, committed to trunk.

> 

> Thanks,

> - Tom

>
  

Patch

[gdb/testsuite] Fix gdb.base/define.exp with check-read1

When running gdb.base/define.exp with check-read1, we get:
...
show prompt^M
Gdb's prompt is "(gdb) ".^M
(gdb) PASS: gdb.base/define.exp: save gdb_prompt
set prompt \(blah\) ^M
(blah) PASS: gdb.base/define.exp: set gdb_prompt
set prompt (gdb) PASS: gdb.base/define.exp: reset gdb_prompt
^M
(gdb) FAIL: gdb.base/define.exp: define do-define
...

The problem is that the "$gdb_prompt $" regexp here:
...
gdb_test_multiple "set prompt $prior_prompt " "reset gdb_prompt" {
    -re "$gdb_prompt $" {
        pass "reset gdb_prompt"
    }
}
...
triggers for the echoing of the command "set prompt $prior_prompt " rather
than for the prompt after the command has executed.

Fix this by changing the regexp to "\r\n$gdb_prompt $".

Tested on x86_64-linux.

gdb/testsuite/ChangeLog:

2019-07-29  Tom de Vries  <tdevries@suse.de>

	* gdb.base/define.exp: Add "\r\n" to "reset gdb_prompt" regexp.

---
 gdb/testsuite/gdb.base/define.exp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gdb/testsuite/gdb.base/define.exp b/gdb/testsuite/gdb.base/define.exp
index e8508b8728..d7d4fd03ba 100644
--- a/gdb/testsuite/gdb.base/define.exp
+++ b/gdb/testsuite/gdb.base/define.exp
@@ -302,7 +302,7 @@  gdb_test_multiple "set prompt \\(blah\\) " "set gdb_prompt" {
 }
 
 gdb_test_multiple "set prompt $prior_prompt " "reset gdb_prompt" {
-    -re "$gdb_prompt $" {
+    -re "\r\n$gdb_prompt $" {
 	pass "reset gdb_prompt"
     }
 }