[2/2] gdb/testsuite: make gdb_unload use gdb_test_multiple

Message ID 20221122155546.599061-2-simon.marchi@efficios.com
State New
Headers
Series [1/2] gdb/testsuite: make gdb_test_multiple return immediately if send_gdb fails |

Commit Message

Simon Marchi Nov. 22, 2022, 3:55 p.m. UTC
  From: Simon Marchi <simon.marchi@polymtl.ca>

In the failure seen by Philippe here:

  https://inbox.sourceware.org/gdb-patches/20221120173024.3647464-1-philippe.waroquiers@skynet.be/

gdb_unload crashed GDB, leaving no trace in the test results.  Change it
to use gdb_test_multiple, so that it leaves an UNRESOLVED result.  I
think it is good practice anyway.

Make it return the result of gdb_test_multiple directly, change
gdb.python/py-objfile.exp accordingly.

Change gdb.base/endian.exp as well to avoid duplicate test names.

Change gdb.base/gnu-debugdata.exp to avoid recording a test result,
since gdb_unload does it already now.

Change-Id: I59a1e4947691330797e6ce23277942547c437a48
---
 gdb/testsuite/gdb.base/endian.exp        |  6 ++---
 gdb/testsuite/gdb.base/gnu-debugdata.exp |  7 ++---
 gdb/testsuite/gdb.python/py-objfile.exp  |  9 ++++---
 gdb/testsuite/lib/gdb.exp                | 34 ++++++++++--------------
 4 files changed, 24 insertions(+), 32 deletions(-)
  

Comments

Tom de Vries Nov. 29, 2022, 4:28 p.m. UTC | #1
On 11/22/22 16:55, Simon Marchi via Gdb-patches wrote:
> From: Simon Marchi <simon.marchi@polymtl.ca>
> 
> In the failure seen by Philippe here:
> 
>    https://inbox.sourceware.org/gdb-patches/20221120173024.3647464-1-philippe.waroquiers@skynet.be/
> 
> gdb_unload crashed GDB, leaving no trace in the test results.  Change it
> to use gdb_test_multiple, so that it leaves an UNRESOLVED result.  I
> think it is good practice anyway.
> 

Agreed.  I do remember some cases where I had to downgrade from 
gdb_test_multiple to gdb_expect, but I guess for the common case 
gdb_test_multiple is the best.

> Make it return the result of gdb_test_multiple directly, change
> gdb.python/py-objfile.exp accordingly.
> 
> Change gdb.base/endian.exp as well to avoid duplicate test names.
> 
> Change gdb.base/gnu-debugdata.exp to avoid recording a test result,
> since gdb_unload does it already now.
> 

LGTM.

Thanks,
- Tom

> Change-Id: I59a1e4947691330797e6ce23277942547c437a48
> ---
>   gdb/testsuite/gdb.base/endian.exp        |  6 ++---
>   gdb/testsuite/gdb.base/gnu-debugdata.exp |  7 ++---
>   gdb/testsuite/gdb.python/py-objfile.exp  |  9 ++++---
>   gdb/testsuite/lib/gdb.exp                | 34 ++++++++++--------------
>   4 files changed, 24 insertions(+), 32 deletions(-)
> 
> diff --git a/gdb/testsuite/gdb.base/endian.exp b/gdb/testsuite/gdb.base/endian.exp
> index 05cf1280bad0..daa49b516545 100644
> --- a/gdb/testsuite/gdb.base/endian.exp
> +++ b/gdb/testsuite/gdb.base/endian.exp
> @@ -59,7 +59,7 @@ if { [gdb_test_multiple "show endian" "$test" {
>   
>   # Now check that the automatic endianness is updated
>   # according to the executable selected.
> -gdb_unload
> +gdb_unload "unload 1"
>   gdb_test "set endian big" "$en_set big endian\\." \
>       "override target endianness big"
>   gdb_test "set endian auto" "$en_auto \\\(currently big endian\\\)\\." \
> @@ -69,7 +69,7 @@ gdb_file_cmd $binfile
>   gdb_test "show endian" "$en_auto \\\(currently $endian endian\\\)\\." \
>       "previously big default executable endianness"
>   
> -gdb_unload
> +gdb_unload "unload 2"
>   gdb_test "show endian" "$en_auto \\\(currently $endian endian\\\)\\." \
>       "previously big default no executable endianness"
>   gdb_test "set endian little" "$en_set little endian\\." \
> @@ -81,6 +81,6 @@ gdb_file_cmd $binfile
>   gdb_test "show endian" "$en_auto \\\(currently $endian endian\\\)\\." \
>       "previously little default executable endianness"
>   
> -gdb_unload
> +gdb_unload "unload 3"
>   gdb_test "show endian" "$en_auto \\\(currently $endian endian\\\)\\." \
>       "previously little default no executable endianness"
> diff --git a/gdb/testsuite/gdb.base/gnu-debugdata.exp b/gdb/testsuite/gdb.base/gnu-debugdata.exp
> index 732eadcbd306..0900e2fc2d86 100644
> --- a/gdb/testsuite/gdb.base/gnu-debugdata.exp
> +++ b/gdb/testsuite/gdb.base/gnu-debugdata.exp
> @@ -150,10 +150,7 @@ if {$gdb_file_cmd_debug_info == "lzma"} {
>   }
>   
>   # Be sure to test the 'close' method on the MiniDebugInfo BFD.
> -if {[gdb_unload]} {
> -    fail "unload MiniDebugInfo"
> -} else {
> -    pass "unload MiniDebugInfo"
> -}
> +# gdb_unload records a pass/fail.
> +gdb_unload
>   
>   gdb_exit
> diff --git a/gdb/testsuite/gdb.python/py-objfile.exp b/gdb/testsuite/gdb.python/py-objfile.exp
> index 9565c16af96b..f42bc5fb9f0f 100644
> --- a/gdb/testsuite/gdb.python/py-objfile.exp
> +++ b/gdb/testsuite/gdb.python/py-objfile.exp
> @@ -92,7 +92,9 @@ gdb_test "python print (objfile.progspace)" "<gdb\.Progspace object at .*>" \
>     "Get objfile program space"
>   gdb_test "python print (objfile.is_valid())" "True" \
>     "Get objfile validity"
> -gdb_unload
> +
> +gdb_unload "unload 1"
> +
>   gdb_test "python print (objfile.is_valid())" "False" \
>     "Get objfile validity after unload"
>   
> @@ -103,9 +105,8 @@ gdb_test "python print (objfile.random_attribute)" "42" \
>   
>   # Verify invalid objfile handling.
>   
> -if { [gdb_unload] < 0 } {
> -    fail "unload all files"
> -    return -1
> +if { [gdb_unload "unload 2"] != 0 } {
> +    return
>   }
>   
>   gdb_test "python print(objfile.filename)" "None" \
> diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
> index fcd54c88f251..264d3ff435b3 100644
> --- a/gdb/testsuite/lib/gdb.exp
> +++ b/gdb/testsuite/lib/gdb.exp
> @@ -311,38 +311,32 @@ proc gdb_version { } {
>       return [default_gdb_version]
>   }
>   
> -#
>   # gdb_unload -- unload a file if one is loaded
> -# Return 0 on success, -1 on error.
>   #
> +# Returns the same as gdb_test_multiple.
>   
> -proc gdb_unload {} {
> +proc gdb_unload { {msg "file"} } {
>       global GDB
>       global gdb_prompt
> -    send_gdb "file\n"
> -    gdb_expect 60 {
> -	-re "No executable file now\[^\r\n\]*\[\r\n\]" { exp_continue }
> -	-re "No symbol file now\[^\r\n\]*\[\r\n\]" { exp_continue }
> -	-re "A program is being debugged already.*Are you sure you want to change the file.*y or n. $" {
> +    return [gdb_test_multiple "file" $msg {
> +	-re "A program is being debugged already.\r\nAre you sure you want to change the file. .y or n. $" {
>   	    send_gdb "y\n" answer
>   	    exp_continue
>   	}
> -	-re "Discard symbol table from .*y or n.*$" {
> -	    send_gdb "y\n" answer
> +
> +	-re "No executable file now\\.\r\n" {
>   	    exp_continue
>   	}
> -	-re "$gdb_prompt $" {}
> -	-re "A problem internal to GDB has been detected" {
> -	    perror "Couldn't unload file in $GDB (GDB internal error)."
> -	    gdb_internal_error_resync
> -	    return -1
> +
> +	-re "Discard symbol table from `.*'. .y or n. $" {
> +	    send_gdb "y\n" answer
> +	    exp_continue
>   	}
> -	timeout {
> -	    perror "couldn't unload file in $GDB (timeout)."
> -	    return -1
> +
> +	-re -wrap "No symbol file now\\." {
> +	    pass $gdb_test_name
>   	}
> -    }
> -    return 0
> +    }]
>   }
>   
>   # Many of the tests depend on setting breakpoints at various places and
  
Simon Marchi Nov. 29, 2022, 4:43 p.m. UTC | #2
On 11/29/22 11:28, Tom de Vries wrote:
> On 11/22/22 16:55, Simon Marchi via Gdb-patches wrote:
>> From: Simon Marchi <simon.marchi@polymtl.ca>
>>
>> In the failure seen by Philippe here:
>>
>>    https://inbox.sourceware.org/gdb-patches/20221120173024.3647464-1-philippe.waroquiers@skynet.be/
>>
>> gdb_unload crashed GDB, leaving no trace in the test results.  Change it
>> to use gdb_test_multiple, so that it leaves an UNRESOLVED result.  I
>> think it is good practice anyway.
>>
> 
> Agreed.  I do remember some cases where I had to downgrade from gdb_test_multiple to gdb_expect, but I guess for the common case gdb_test_multiple is the best.

Ack.

>> Make it return the result of gdb_test_multiple directly, change
>> gdb.python/py-objfile.exp accordingly.
>>
>> Change gdb.base/endian.exp as well to avoid duplicate test names.
>>
>> Change gdb.base/gnu-debugdata.exp to avoid recording a test result,
>> since gdb_unload does it already now.
>>
> 
> LGTM.

Thanks, will push.

Simon
  

Patch

diff --git a/gdb/testsuite/gdb.base/endian.exp b/gdb/testsuite/gdb.base/endian.exp
index 05cf1280bad0..daa49b516545 100644
--- a/gdb/testsuite/gdb.base/endian.exp
+++ b/gdb/testsuite/gdb.base/endian.exp
@@ -59,7 +59,7 @@  if { [gdb_test_multiple "show endian" "$test" {
 
 # Now check that the automatic endianness is updated
 # according to the executable selected.
-gdb_unload
+gdb_unload "unload 1"
 gdb_test "set endian big" "$en_set big endian\\." \
     "override target endianness big"
 gdb_test "set endian auto" "$en_auto \\\(currently big endian\\\)\\." \
@@ -69,7 +69,7 @@  gdb_file_cmd $binfile
 gdb_test "show endian" "$en_auto \\\(currently $endian endian\\\)\\." \
     "previously big default executable endianness"
 
-gdb_unload
+gdb_unload "unload 2"
 gdb_test "show endian" "$en_auto \\\(currently $endian endian\\\)\\." \
     "previously big default no executable endianness"
 gdb_test "set endian little" "$en_set little endian\\." \
@@ -81,6 +81,6 @@  gdb_file_cmd $binfile
 gdb_test "show endian" "$en_auto \\\(currently $endian endian\\\)\\." \
     "previously little default executable endianness"
 
-gdb_unload
+gdb_unload "unload 3"
 gdb_test "show endian" "$en_auto \\\(currently $endian endian\\\)\\." \
     "previously little default no executable endianness"
diff --git a/gdb/testsuite/gdb.base/gnu-debugdata.exp b/gdb/testsuite/gdb.base/gnu-debugdata.exp
index 732eadcbd306..0900e2fc2d86 100644
--- a/gdb/testsuite/gdb.base/gnu-debugdata.exp
+++ b/gdb/testsuite/gdb.base/gnu-debugdata.exp
@@ -150,10 +150,7 @@  if {$gdb_file_cmd_debug_info == "lzma"} {
 }
 
 # Be sure to test the 'close' method on the MiniDebugInfo BFD.
-if {[gdb_unload]} {
-    fail "unload MiniDebugInfo"
-} else {
-    pass "unload MiniDebugInfo"
-}
+# gdb_unload records a pass/fail.
+gdb_unload
 
 gdb_exit
diff --git a/gdb/testsuite/gdb.python/py-objfile.exp b/gdb/testsuite/gdb.python/py-objfile.exp
index 9565c16af96b..f42bc5fb9f0f 100644
--- a/gdb/testsuite/gdb.python/py-objfile.exp
+++ b/gdb/testsuite/gdb.python/py-objfile.exp
@@ -92,7 +92,9 @@  gdb_test "python print (objfile.progspace)" "<gdb\.Progspace object at .*>" \
   "Get objfile program space"
 gdb_test "python print (objfile.is_valid())" "True" \
   "Get objfile validity"
-gdb_unload
+
+gdb_unload "unload 1"
+
 gdb_test "python print (objfile.is_valid())" "False" \
   "Get objfile validity after unload"
 
@@ -103,9 +105,8 @@  gdb_test "python print (objfile.random_attribute)" "42" \
 
 # Verify invalid objfile handling.
 
-if { [gdb_unload] < 0 } {
-    fail "unload all files"
-    return -1
+if { [gdb_unload "unload 2"] != 0 } {
+    return
 }
 
 gdb_test "python print(objfile.filename)" "None" \
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index fcd54c88f251..264d3ff435b3 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -311,38 +311,32 @@  proc gdb_version { } {
     return [default_gdb_version]
 }
 
-#
 # gdb_unload -- unload a file if one is loaded
-# Return 0 on success, -1 on error.
 #
+# Returns the same as gdb_test_multiple.
 
-proc gdb_unload {} {
+proc gdb_unload { {msg "file"} } {
     global GDB
     global gdb_prompt
-    send_gdb "file\n"
-    gdb_expect 60 {
-	-re "No executable file now\[^\r\n\]*\[\r\n\]" { exp_continue }
-	-re "No symbol file now\[^\r\n\]*\[\r\n\]" { exp_continue }
-	-re "A program is being debugged already.*Are you sure you want to change the file.*y or n. $" {
+    return [gdb_test_multiple "file" $msg {
+	-re "A program is being debugged already.\r\nAre you sure you want to change the file. .y or n. $" {
 	    send_gdb "y\n" answer
 	    exp_continue
 	}
-	-re "Discard symbol table from .*y or n.*$" {
-	    send_gdb "y\n" answer
+
+	-re "No executable file now\\.\r\n" {
 	    exp_continue
 	}
-	-re "$gdb_prompt $" {}
-	-re "A problem internal to GDB has been detected" {
-	    perror "Couldn't unload file in $GDB (GDB internal error)."
-	    gdb_internal_error_resync
-	    return -1
+
+	-re "Discard symbol table from `.*'. .y or n. $" {
+	    send_gdb "y\n" answer
+	    exp_continue
 	}
-	timeout {
-	    perror "couldn't unload file in $GDB (timeout)."
-	    return -1
+
+	-re -wrap "No symbol file now\\." {
+	    pass $gdb_test_name
 	}
-    }
-    return 0
+    }]
 }
 
 # Many of the tests depend on setting breakpoints at various places and