public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH][gdb/testsuite] Fix gdb.tui/scroll.exp with read1
@ 2022-04-12 14:15 Tom de Vries
  2022-04-30 11:42 ` [PING][PATCH][gdb/testsuite] " Tom de Vries
  0 siblings, 1 reply; 3+ messages in thread
From: Tom de Vries @ 2022-04-12 14:15 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

Hi,

When running test-case gdb.tui/scroll.exp, I get:
...
Box Dump (80 x 8) @ (0, 0):
    0 $17 = 16
    1 (gdb) p 17
    2 $18 = 17
    3 (gdb) p 18
    4 $19 = 18
    5 (gdb) p 19
    6 $20 = 19
    7 (gdb)
PASS: gdb.tui/scroll.exp: check cmd window in flip layout
...
but with check-read1 I get instead:
...
Box Dump (80 x 8) @ (0, 0):
    0 (gdb) 15
    1 (gdb) p 16
    2 $17 = 16
    3 (gdb) p 17
    4 $18 = 17
    5 (gdb) p 18
    6 $19 = 18
    7 (gdb) p 19
FAIL: gdb.tui/scroll.exp: check cmd window in flip layout
...

The "p 19" command is handled by Term::command, which sends the command and then
does Term::wait_for "^$gdb_prompt [string_to_regexp $cmd]", which:
- matches the line with "(gdb) p 19", and
- tries to match the following prompt "(gdb) "

The problem is that scrolling results in reissuing output before the "(gdb) p
19", and the second matching triggers on that.  Consequently, wait_for no
longer translates gdb output into screen actions, and the screen does not
reflect the result of "p 19".

Fix this by using a new proc wait_for_region_contents, which in contrast to
wait_for can handle a multi-line regexp.

Tested on x86_64-linux with make targets check and check-read1.

Any comments?

Thanks,
- Tom

[gdb/testsuite] Fix gdb.tui/scroll.exp with read1

---
 gdb/testsuite/gdb.tui/scroll.exp |  8 +++-
 gdb/testsuite/lib/tuiterm.exp    | 99 +++++++++++++++++++++++++++-------------
 2 files changed, 74 insertions(+), 33 deletions(-)

diff --git a/gdb/testsuite/gdb.tui/scroll.exp b/gdb/testsuite/gdb.tui/scroll.exp
index c23cd2b9abf..f34f8fddc68 100644
--- a/gdb/testsuite/gdb.tui/scroll.exp
+++ b/gdb/testsuite/gdb.tui/scroll.exp
@@ -60,7 +60,13 @@ Term::command "winheight cmd 8"
 Term::check_box "src window after resize" 0 8 80 16
 
 for {set i 10} {$i < 20} {incr i 1} {
-    Term::command "p $i"
+    set cmd "p $i"
+    send_gdb "$cmd\n"
+    Term::wait_for_region_contents 0 0 80 8 \
+	[multi_line \
+	     "$gdb_prompt [string_to_regexp $cmd]\\s+" \
+	     "\\\$\\d+ = $i\\s+" \
+	     "$gdb_prompt "]
 }
 
 # Now check that the contents of the command window are as expected.
diff --git a/gdb/testsuite/lib/tuiterm.exp b/gdb/testsuite/lib/tuiterm.exp
index e660840eed9..bf094131eac 100644
--- a/gdb/testsuite/lib/tuiterm.exp
+++ b/gdb/testsuite/lib/tuiterm.exp
@@ -663,11 +663,47 @@ namespace eval Term {
 	_clear_lines 0 $_rows
     }
 
+    # Accept some output from gdb and update the screen.
+    # Return 1 if successful, or 0 if a timeout occurred.
+    proc accept_gdb_output { } {
+	global expect_out
+	gdb_expect {
+	    -re "^\[\x07\x08\x0a\x0d\]" {
+		scan $expect_out(0,string) %c val
+		set hexval [format "%02x" $val]
+		_log "wait_for: _ctl_0x${hexval}"
+		_ctl_0x${hexval}
+	    }
+	    -re "^\x1b(\[0-9a-zA-Z\])" {
+		_log "wait_for: unsupported escape"
+		error "unsupported escape"
+	    }
+	    -re "^\x1b\\\[(\[0-9;\]*)(\[a-zA-Z@\])" {
+		set cmd $expect_out(2,string)
+		set params [split $expect_out(1,string) ";"]
+		_log "wait_for: _csi_$cmd <<<$expect_out(1,string)>>>"
+		eval _csi_$cmd $params
+	    }
+	    -re "^\[^\x07\x08\x0a\x0d\x1b\]+" {
+		_insert $expect_out(0,string)
+		variable _last_char
+		set _last_char [string index $expect_out(0,string) end]
+	    }
+
+	    timeout {
+		# Assume a timeout means we somehow missed the
+		# expected result, and carry on.
+		return 0
+	    }
+	}
+
+	return 1
+    }
+
     # Accept some output from gdb and update the screen.  WAIT_FOR is
     # a regexp matching the line to wait for.  Return 0 on timeout, 1
     # on success.
     proc wait_for {wait_for} {
-	global expect_out
 	global gdb_prompt
 	variable _cur_col
 	variable _cur_row
@@ -675,34 +711,8 @@ namespace eval Term {
 	set prompt_wait_for "$gdb_prompt \$"
 
 	while 1 {
-	    gdb_expect {
-		-re "^\[\x07\x08\x0a\x0d\]" {
-		    scan $expect_out(0,string) %c val
-		    set hexval [format "%02x" $val]
-		    _log "wait_for: _ctl_0x${hexval}"
-		    _ctl_0x${hexval}
-		}
-		-re "^\x1b(\[0-9a-zA-Z\])" {
-		    _log "wait_for: unsupported escape"
-		    error "unsupported escape"
-		}
-		-re "^\x1b\\\[(\[0-9;\]*)(\[a-zA-Z@\])" {
-		    set cmd $expect_out(2,string)
-		    set params [split $expect_out(1,string) ";"]
-		    _log "wait_for: _csi_$cmd <<<$expect_out(1,string)>>>"
-		    eval _csi_$cmd $params
-		}
-		-re "^\[^\x07\x08\x0a\x0d\x1b\]+" {
-		    _insert $expect_out(0,string)
-		    variable _last_char
-		    set _last_char [string index $expect_out(0,string) end]
-		}
-
-		timeout {
-		    # Assume a timeout means we somehow missed the
-		    # expected result, and carry on.
-		    return 0
-		}
+	    if { [accept_gdb_output] == 0 } {
+		return 0
 	    }
 
 	    # If the cursor appears just after the prompt, return.  It
@@ -724,6 +734,23 @@ namespace eval Term {
 	return 1
     }
 
+    # Accept some output from gdb and update the screen.  Wait for the screen
+    # region X/Y/WIDTH/HEIGTH to matches REGEXP.  Return 0 on timeout, 1 on
+    # success.
+    proc wait_for_region_contents {x y width height regexp} {
+	while 1 {
+	    if { [accept_gdb_output] == 0 } {
+		return 0
+	    }
+
+	    if { [check_region_contents_p $x $y $width $height $regexp] } {
+		break
+	    }
+	}
+
+	return 1
+    }
+
     # Like ::clean_restart, but ensures that gdb starts in an
     # environment where the TUI can work.  ROWS and COLS are the size
     # of the terminal.  EXECUTABLE, if given, is passed to
@@ -940,15 +967,23 @@ namespace eval Term {
     # and HEIGHT match REGEXP.  This is like check_contents except
     # only part of the screen is checked.  This can be used to check
     # the contents within a box (though check_box_contents is a better
-    # choice for boxes with a border).
-    proc check_region_contents { test_name x y width height regexp } {
+    # choice for boxes with a border).  Return 1 if check succeeded.
+    proc check_region_contents_p { x y width height regexp } {
 	variable _chars
 	dump_box $x $y $width $height
 
 	# Now grab the contents of the box, join each line together
 	# with a '\r\n' sequence and match against REGEXP.
 	set result [get_region $x $y $width $height "\r\n"]
-	gdb_assert {[regexp -- $regexp $result]} $test_name
+	return [regexp -- $regexp $result]
+    }
+
+    # Check that the region of the screen described by X, Y, WIDTH,
+    # and HEIGHT match REGEXP.  As check_region_contents_p, but produce
+    # a pass/fail message.
+    proc check_region_contents { test_name x y width height regexp } {
+	set ok [check_region_contents_p $x $y $width $height $regexp]
+	gdb_assert {$ok} $test_name
     }
 
     # Check the contents of a box on the screen.  This is a little

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PING][PATCH][gdb/testsuite] Fix gdb.tui/scroll.exp with read1
  2022-04-12 14:15 [PATCH][gdb/testsuite] Fix gdb.tui/scroll.exp with read1 Tom de Vries
@ 2022-04-30 11:42 ` Tom de Vries
  2022-05-08 17:48   ` [committed][gdb/testsuite] " Tom de Vries
  0 siblings, 1 reply; 3+ messages in thread
From: Tom de Vries @ 2022-04-30 11:42 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

On 4/12/22 16:15, Tom de Vries wrote:
> Hi,
> 
> When running test-case gdb.tui/scroll.exp, I get:
> ...
> Box Dump (80 x 8) @ (0, 0):
>      0 $17 = 16
>      1 (gdb) p 17
>      2 $18 = 17
>      3 (gdb) p 18
>      4 $19 = 18
>      5 (gdb) p 19
>      6 $20 = 19
>      7 (gdb)
> PASS: gdb.tui/scroll.exp: check cmd window in flip layout
> ...
> but with check-read1 I get instead:
> ...
> Box Dump (80 x 8) @ (0, 0):
>      0 (gdb) 15
>      1 (gdb) p 16
>      2 $17 = 16
>      3 (gdb) p 17
>      4 $18 = 17
>      5 (gdb) p 18
>      6 $19 = 18
>      7 (gdb) p 19
> FAIL: gdb.tui/scroll.exp: check cmd window in flip layout
> ...
> 
> The "p 19" command is handled by Term::command, which sends the command and then
> does Term::wait_for "^$gdb_prompt [string_to_regexp $cmd]", which:
> - matches the line with "(gdb) p 19", and
> - tries to match the following prompt "(gdb) "
> 
> The problem is that scrolling results in reissuing output before the "(gdb) p
> 19", and the second matching triggers on that.  Consequently, wait_for no
> longer translates gdb output into screen actions, and the screen does not
> reflect the result of "p 19".
> 
> Fix this by using a new proc wait_for_region_contents, which in contrast to
> wait_for can handle a multi-line regexp.
> 
> Tested on x86_64-linux with make targets check and check-read1.
> 
> Any comments?
> 

Ping.

Thanks,
- Tom

> [gdb/testsuite] Fix gdb.tui/scroll.exp with read1
> 
> ---
>   gdb/testsuite/gdb.tui/scroll.exp |  8 +++-
>   gdb/testsuite/lib/tuiterm.exp    | 99 +++++++++++++++++++++++++++-------------
>   2 files changed, 74 insertions(+), 33 deletions(-)
> 
> diff --git a/gdb/testsuite/gdb.tui/scroll.exp b/gdb/testsuite/gdb.tui/scroll.exp
> index c23cd2b9abf..f34f8fddc68 100644
> --- a/gdb/testsuite/gdb.tui/scroll.exp
> +++ b/gdb/testsuite/gdb.tui/scroll.exp
> @@ -60,7 +60,13 @@ Term::command "winheight cmd 8"
>   Term::check_box "src window after resize" 0 8 80 16
>   
>   for {set i 10} {$i < 20} {incr i 1} {
> -    Term::command "p $i"
> +    set cmd "p $i"
> +    send_gdb "$cmd\n"
> +    Term::wait_for_region_contents 0 0 80 8 \
> +	[multi_line \
> +	     "$gdb_prompt [string_to_regexp $cmd]\\s+" \
> +	     "\\\$\\d+ = $i\\s+" \
> +	     "$gdb_prompt "]
>   }
>   
>   # Now check that the contents of the command window are as expected.
> diff --git a/gdb/testsuite/lib/tuiterm.exp b/gdb/testsuite/lib/tuiterm.exp
> index e660840eed9..bf094131eac 100644
> --- a/gdb/testsuite/lib/tuiterm.exp
> +++ b/gdb/testsuite/lib/tuiterm.exp
> @@ -663,11 +663,47 @@ namespace eval Term {
>   	_clear_lines 0 $_rows
>       }
>   
> +    # Accept some output from gdb and update the screen.
> +    # Return 1 if successful, or 0 if a timeout occurred.
> +    proc accept_gdb_output { } {
> +	global expect_out
> +	gdb_expect {
> +	    -re "^\[\x07\x08\x0a\x0d\]" {
> +		scan $expect_out(0,string) %c val
> +		set hexval [format "%02x" $val]
> +		_log "wait_for: _ctl_0x${hexval}"
> +		_ctl_0x${hexval}
> +	    }
> +	    -re "^\x1b(\[0-9a-zA-Z\])" {
> +		_log "wait_for: unsupported escape"
> +		error "unsupported escape"
> +	    }
> +	    -re "^\x1b\\\[(\[0-9;\]*)(\[a-zA-Z@\])" {
> +		set cmd $expect_out(2,string)
> +		set params [split $expect_out(1,string) ";"]
> +		_log "wait_for: _csi_$cmd <<<$expect_out(1,string)>>>"
> +		eval _csi_$cmd $params
> +	    }
> +	    -re "^\[^\x07\x08\x0a\x0d\x1b\]+" {
> +		_insert $expect_out(0,string)
> +		variable _last_char
> +		set _last_char [string index $expect_out(0,string) end]
> +	    }
> +
> +	    timeout {
> +		# Assume a timeout means we somehow missed the
> +		# expected result, and carry on.
> +		return 0
> +	    }
> +	}
> +
> +	return 1
> +    }
> +
>       # Accept some output from gdb and update the screen.  WAIT_FOR is
>       # a regexp matching the line to wait for.  Return 0 on timeout, 1
>       # on success.
>       proc wait_for {wait_for} {
> -	global expect_out
>   	global gdb_prompt
>   	variable _cur_col
>   	variable _cur_row
> @@ -675,34 +711,8 @@ namespace eval Term {
>   	set prompt_wait_for "$gdb_prompt \$"
>   
>   	while 1 {
> -	    gdb_expect {
> -		-re "^\[\x07\x08\x0a\x0d\]" {
> -		    scan $expect_out(0,string) %c val
> -		    set hexval [format "%02x" $val]
> -		    _log "wait_for: _ctl_0x${hexval}"
> -		    _ctl_0x${hexval}
> -		}
> -		-re "^\x1b(\[0-9a-zA-Z\])" {
> -		    _log "wait_for: unsupported escape"
> -		    error "unsupported escape"
> -		}
> -		-re "^\x1b\\\[(\[0-9;\]*)(\[a-zA-Z@\])" {
> -		    set cmd $expect_out(2,string)
> -		    set params [split $expect_out(1,string) ";"]
> -		    _log "wait_for: _csi_$cmd <<<$expect_out(1,string)>>>"
> -		    eval _csi_$cmd $params
> -		}
> -		-re "^\[^\x07\x08\x0a\x0d\x1b\]+" {
> -		    _insert $expect_out(0,string)
> -		    variable _last_char
> -		    set _last_char [string index $expect_out(0,string) end]
> -		}
> -
> -		timeout {
> -		    # Assume a timeout means we somehow missed the
> -		    # expected result, and carry on.
> -		    return 0
> -		}
> +	    if { [accept_gdb_output] == 0 } {
> +		return 0
>   	    }
>   
>   	    # If the cursor appears just after the prompt, return.  It
> @@ -724,6 +734,23 @@ namespace eval Term {
>   	return 1
>       }
>   
> +    # Accept some output from gdb and update the screen.  Wait for the screen
> +    # region X/Y/WIDTH/HEIGTH to matches REGEXP.  Return 0 on timeout, 1 on
> +    # success.
> +    proc wait_for_region_contents {x y width height regexp} {
> +	while 1 {
> +	    if { [accept_gdb_output] == 0 } {
> +		return 0
> +	    }
> +
> +	    if { [check_region_contents_p $x $y $width $height $regexp] } {
> +		break
> +	    }
> +	}
> +
> +	return 1
> +    }
> +
>       # Like ::clean_restart, but ensures that gdb starts in an
>       # environment where the TUI can work.  ROWS and COLS are the size
>       # of the terminal.  EXECUTABLE, if given, is passed to
> @@ -940,15 +967,23 @@ namespace eval Term {
>       # and HEIGHT match REGEXP.  This is like check_contents except
>       # only part of the screen is checked.  This can be used to check
>       # the contents within a box (though check_box_contents is a better
> -    # choice for boxes with a border).
> -    proc check_region_contents { test_name x y width height regexp } {
> +    # choice for boxes with a border).  Return 1 if check succeeded.
> +    proc check_region_contents_p { x y width height regexp } {
>   	variable _chars
>   	dump_box $x $y $width $height
>   
>   	# Now grab the contents of the box, join each line together
>   	# with a '\r\n' sequence and match against REGEXP.
>   	set result [get_region $x $y $width $height "\r\n"]
> -	gdb_assert {[regexp -- $regexp $result]} $test_name
> +	return [regexp -- $regexp $result]
> +    }
> +
> +    # Check that the region of the screen described by X, Y, WIDTH,
> +    # and HEIGHT match REGEXP.  As check_region_contents_p, but produce
> +    # a pass/fail message.
> +    proc check_region_contents { test_name x y width height regexp } {
> +	set ok [check_region_contents_p $x $y $width $height $regexp]
> +	gdb_assert {$ok} $test_name
>       }
>   
>       # Check the contents of a box on the screen.  This is a little

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [committed][gdb/testsuite] Fix gdb.tui/scroll.exp with read1
  2022-04-30 11:42 ` [PING][PATCH][gdb/testsuite] " Tom de Vries
@ 2022-05-08 17:48   ` Tom de Vries
  0 siblings, 0 replies; 3+ messages in thread
From: Tom de Vries @ 2022-05-08 17:48 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

On 4/30/22 13:42, Tom de Vries wrote:
> On 4/12/22 16:15, Tom de Vries wrote:
>> Hi,
>>
>> When running test-case gdb.tui/scroll.exp, I get:
>> ...
>> Box Dump (80 x 8) @ (0, 0):
>>      0 $17 = 16
>>      1 (gdb) p 17
>>      2 $18 = 17
>>      3 (gdb) p 18
>>      4 $19 = 18
>>      5 (gdb) p 19
>>      6 $20 = 19
>>      7 (gdb)
>> PASS: gdb.tui/scroll.exp: check cmd window in flip layout
>> ...
>> but with check-read1 I get instead:
>> ...
>> Box Dump (80 x 8) @ (0, 0):
>>      0 (gdb) 15
>>      1 (gdb) p 16
>>      2 $17 = 16
>>      3 (gdb) p 17
>>      4 $18 = 17
>>      5 (gdb) p 18
>>      6 $19 = 18
>>      7 (gdb) p 19
>> FAIL: gdb.tui/scroll.exp: check cmd window in flip layout
>> ...
>>
>> The "p 19" command is handled by Term::command, which sends the 
>> command and then
>> does Term::wait_for "^$gdb_prompt [string_to_regexp $cmd]", which:
>> - matches the line with "(gdb) p 19", and
>> - tries to match the following prompt "(gdb) "
>>
>> The problem is that scrolling results in reissuing output before the 
>> "(gdb) p
>> 19", and the second matching triggers on that.  Consequently, wait_for no
>> longer translates gdb output into screen actions, and the screen does not
>> reflect the result of "p 19".
>>
>> Fix this by using a new proc wait_for_region_contents, which in 
>> contrast to
>> wait_for can handle a multi-line regexp.
>>
>> Tested on x86_64-linux with make targets check and check-read1.
>>
>> Any comments?
>>
> 
> Ping.
> 

Committed.

Thanks,
- Tom

>> [gdb/testsuite] Fix gdb.tui/scroll.exp with read1
>>
>> ---
>>   gdb/testsuite/gdb.tui/scroll.exp |  8 +++-
>>   gdb/testsuite/lib/tuiterm.exp    | 99 
>> +++++++++++++++++++++++++++-------------
>>   2 files changed, 74 insertions(+), 33 deletions(-)
>>
>> diff --git a/gdb/testsuite/gdb.tui/scroll.exp 
>> b/gdb/testsuite/gdb.tui/scroll.exp
>> index c23cd2b9abf..f34f8fddc68 100644
>> --- a/gdb/testsuite/gdb.tui/scroll.exp
>> +++ b/gdb/testsuite/gdb.tui/scroll.exp
>> @@ -60,7 +60,13 @@ Term::command "winheight cmd 8"
>>   Term::check_box "src window after resize" 0 8 80 16
>>   for {set i 10} {$i < 20} {incr i 1} {
>> -    Term::command "p $i"
>> +    set cmd "p $i"
>> +    send_gdb "$cmd\n"
>> +    Term::wait_for_region_contents 0 0 80 8 \
>> +    [multi_line \
>> +         "$gdb_prompt [string_to_regexp $cmd]\\s+" \
>> +         "\\\$\\d+ = $i\\s+" \
>> +         "$gdb_prompt "]
>>   }
>>   # Now check that the contents of the command window are as expected.
>> diff --git a/gdb/testsuite/lib/tuiterm.exp 
>> b/gdb/testsuite/lib/tuiterm.exp
>> index e660840eed9..bf094131eac 100644
>> --- a/gdb/testsuite/lib/tuiterm.exp
>> +++ b/gdb/testsuite/lib/tuiterm.exp
>> @@ -663,11 +663,47 @@ namespace eval Term {
>>       _clear_lines 0 $_rows
>>       }
>> +    # Accept some output from gdb and update the screen.
>> +    # Return 1 if successful, or 0 if a timeout occurred.
>> +    proc accept_gdb_output { } {
>> +    global expect_out
>> +    gdb_expect {
>> +        -re "^\[\x07\x08\x0a\x0d\]" {
>> +        scan $expect_out(0,string) %c val
>> +        set hexval [format "%02x" $val]
>> +        _log "wait_for: _ctl_0x${hexval}"
>> +        _ctl_0x${hexval}
>> +        }
>> +        -re "^\x1b(\[0-9a-zA-Z\])" {
>> +        _log "wait_for: unsupported escape"
>> +        error "unsupported escape"
>> +        }
>> +        -re "^\x1b\\\[(\[0-9;\]*)(\[a-zA-Z@\])" {
>> +        set cmd $expect_out(2,string)
>> +        set params [split $expect_out(1,string) ";"]
>> +        _log "wait_for: _csi_$cmd <<<$expect_out(1,string)>>>"
>> +        eval _csi_$cmd $params
>> +        }
>> +        -re "^\[^\x07\x08\x0a\x0d\x1b\]+" {
>> +        _insert $expect_out(0,string)
>> +        variable _last_char
>> +        set _last_char [string index $expect_out(0,string) end]
>> +        }
>> +
>> +        timeout {
>> +        # Assume a timeout means we somehow missed the
>> +        # expected result, and carry on.
>> +        return 0
>> +        }
>> +    }
>> +
>> +    return 1
>> +    }
>> +
>>       # Accept some output from gdb and update the screen.  WAIT_FOR is
>>       # a regexp matching the line to wait for.  Return 0 on timeout, 1
>>       # on success.
>>       proc wait_for {wait_for} {
>> -    global expect_out
>>       global gdb_prompt
>>       variable _cur_col
>>       variable _cur_row
>> @@ -675,34 +711,8 @@ namespace eval Term {
>>       set prompt_wait_for "$gdb_prompt \$"
>>       while 1 {
>> -        gdb_expect {
>> -        -re "^\[\x07\x08\x0a\x0d\]" {
>> -            scan $expect_out(0,string) %c val
>> -            set hexval [format "%02x" $val]
>> -            _log "wait_for: _ctl_0x${hexval}"
>> -            _ctl_0x${hexval}
>> -        }
>> -        -re "^\x1b(\[0-9a-zA-Z\])" {
>> -            _log "wait_for: unsupported escape"
>> -            error "unsupported escape"
>> -        }
>> -        -re "^\x1b\\\[(\[0-9;\]*)(\[a-zA-Z@\])" {
>> -            set cmd $expect_out(2,string)
>> -            set params [split $expect_out(1,string) ";"]
>> -            _log "wait_for: _csi_$cmd <<<$expect_out(1,string)>>>"
>> -            eval _csi_$cmd $params
>> -        }
>> -        -re "^\[^\x07\x08\x0a\x0d\x1b\]+" {
>> -            _insert $expect_out(0,string)
>> -            variable _last_char
>> -            set _last_char [string index $expect_out(0,string) end]
>> -        }
>> -
>> -        timeout {
>> -            # Assume a timeout means we somehow missed the
>> -            # expected result, and carry on.
>> -            return 0
>> -        }
>> +        if { [accept_gdb_output] == 0 } {
>> +        return 0
>>           }
>>           # If the cursor appears just after the prompt, return.  It
>> @@ -724,6 +734,23 @@ namespace eval Term {
>>       return 1
>>       }
>> +    # Accept some output from gdb and update the screen.  Wait for 
>> the screen
>> +    # region X/Y/WIDTH/HEIGTH to matches REGEXP.  Return 0 on 
>> timeout, 1 on
>> +    # success.
>> +    proc wait_for_region_contents {x y width height regexp} {
>> +    while 1 {
>> +        if { [accept_gdb_output] == 0 } {
>> +        return 0
>> +        }
>> +
>> +        if { [check_region_contents_p $x $y $width $height $regexp] } {
>> +        break
>> +        }
>> +    }
>> +
>> +    return 1
>> +    }
>> +
>>       # Like ::clean_restart, but ensures that gdb starts in an
>>       # environment where the TUI can work.  ROWS and COLS are the size
>>       # of the terminal.  EXECUTABLE, if given, is passed to
>> @@ -940,15 +967,23 @@ namespace eval Term {
>>       # and HEIGHT match REGEXP.  This is like check_contents except
>>       # only part of the screen is checked.  This can be used to check
>>       # the contents within a box (though check_box_contents is a better
>> -    # choice for boxes with a border).
>> -    proc check_region_contents { test_name x y width height regexp } {
>> +    # choice for boxes with a border).  Return 1 if check succeeded.
>> +    proc check_region_contents_p { x y width height regexp } {
>>       variable _chars
>>       dump_box $x $y $width $height
>>       # Now grab the contents of the box, join each line together
>>       # with a '\r\n' sequence and match against REGEXP.
>>       set result [get_region $x $y $width $height "\r\n"]
>> -    gdb_assert {[regexp -- $regexp $result]} $test_name
>> +    return [regexp -- $regexp $result]
>> +    }
>> +
>> +    # Check that the region of the screen described by X, Y, WIDTH,
>> +    # and HEIGHT match REGEXP.  As check_region_contents_p, but produce
>> +    # a pass/fail message.
>> +    proc check_region_contents { test_name x y width height regexp } {
>> +    set ok [check_region_contents_p $x $y $width $height $regexp]
>> +    gdb_assert {$ok} $test_name
>>       }
>>       # Check the contents of a box on the screen.  This is a little

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2022-05-08 17:48 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-12 14:15 [PATCH][gdb/testsuite] Fix gdb.tui/scroll.exp with read1 Tom de Vries
2022-04-30 11:42 ` [PING][PATCH][gdb/testsuite] " Tom de Vries
2022-05-08 17:48   ` [committed][gdb/testsuite] " Tom de Vries

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).