
When running test-case gdb.tui/resize-2.exp with taskset -c 0, I sometimes run into: ... tui disable^[[40;1H^M(gdb) PASS: $exp: tui disable ^M^[[K(gdb) FAIL: $exp: two prompt redisplays after resize (timeout) ... The test-case does "Term::resize 24 80 0" while having the settings of an earlier "Term::resize 40 90", so both dimensions change. When TUI is enabled, we call Term::resize with wait_for_msg == 1, and the proc: - calls stty to change one dimension, - waits for the message (enabled by "maint set tui-resize-message on") confirming the resize has happened, - calls stty to change the other dimension, and again - waits for the message confirming the resize has happened. Since TUI is disabled, we call Term::resize with wait_for_msg == 0 because the message is not printed, so stty is called twice, and afterwards we check for the results of the two resizes, which is the test that is failing. The problem is that not waiting for a response after each stty call opens up the possibility of the responses being merged. Fix this by calling Term::resize twice, changing one dimension at a time, and waiting for a single prompt redisplay after each one. Tested on x86_64-linux. Reviewed-By: Alexandra Petlanova Hajkova <ahajkova@redhat.com> PR testsuite/31822 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31822
101 lines
2.9 KiB
Text
101 lines
2.9 KiB
Text
# Copyright 2023-2024 Free Software Foundation, Inc.
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
# Test TUI resizing using maint screen info command.
|
|
|
|
require allow_tui_tests
|
|
|
|
tuiterm_env
|
|
|
|
Term::clean_restart 24 80
|
|
set screen_dim { 0 0 80 24 }
|
|
|
|
# Use a layout with just a command window.
|
|
gdb_test "tui new-layout command-layout cmd 1"
|
|
|
|
if {![Term::prepare_for_tui]} {
|
|
unsupported "TUI not supported"
|
|
return 0
|
|
}
|
|
|
|
# Enter TUI.
|
|
Term::command_no_prompt_prefix "layout command-layout"
|
|
|
|
proc check_width { what n } {
|
|
set re "Number of characters $what thinks are in a line is $n"
|
|
Term::check_region_contents "$what width $n" {*}$::screen_dim $re
|
|
}
|
|
|
|
# Check that curses has the correct notion of screen width.
|
|
Term::command "maint info screen"
|
|
check_width curses 80
|
|
check_width gdb 80
|
|
|
|
# Resize with TUI enabled, wait for the resize message.
|
|
Term::resize 40 90
|
|
set screen_dim { 0 0 90 40 }
|
|
|
|
# Check that curses has the correct notion of screen width after resize.
|
|
Term::command "maint info screen"
|
|
check_width curses 90
|
|
check_width gdb 90
|
|
|
|
# Temporarily disable TUI.
|
|
gdb_test_multiple "tui disable" "" {
|
|
-re "$gdb_prompt $" {
|
|
pass $gdb_test_name
|
|
}
|
|
}
|
|
|
|
# Resize with TUI disabled, so don't wait for the resize message. Instead,
|
|
# do it in two steps, and wait for a prompt redisplay for each. If we do
|
|
# this in one step, it's unpredictable how may prompt redisplays we'll get.
|
|
Term::resize 24 90 0
|
|
set screen_dim { 0 0 90 24 }
|
|
|
|
gdb_test_multiple "" "prompt redisplays after first resize" {
|
|
-re "\r.*$gdb_prompt $" {
|
|
pass $gdb_test_name
|
|
}
|
|
}
|
|
|
|
Term::resize 24 80 0
|
|
set screen_dim { 0 0 80 24 }
|
|
|
|
gdb_test_multiple "" "prompt redisplays after second resize" {
|
|
-re "\r.*$gdb_prompt $" {
|
|
pass $gdb_test_name
|
|
}
|
|
}
|
|
|
|
# At this point, curses still thinks the width is 90. This doesn't look
|
|
# harmful because TUI is disabled.
|
|
gdb_test "maint info screen" \
|
|
"\r\nNumber of characters curses thinks are in a line is 90.\\r\n.*" \
|
|
"curses width after resize with TUI disabled"
|
|
|
|
# Re-enable TUI.
|
|
send_gdb "tui enable\n"
|
|
# The "tui enable" command is issued on the CLI screen, on the TUI we have the
|
|
# last command issued there: "tui disable".
|
|
Term::wait_for "tui disable"
|
|
|
|
# Check that curses has the correct notion of screen width after screen resize
|
|
# with TUI disabled.
|
|
Term::command "maint info screen"
|
|
with_test_prefix again {
|
|
check_width curses 80
|
|
check_width gdb 80
|
|
}
|