Files
binutils-gdb/gdb/testsuite/gdb.base/readline.exp
Tom Tromey d01e823438 Update copyright dates to include 2025
This updates the copyright headers to include 2025.  I did this by
running gdb/copyright.py and then manually modifying a few files as
noted by the script.

Approved-By: Eli Zaretskii <eliz@gnu.org>
2025-04-08 10:54:39 -06:00

305 lines
7.4 KiB
Plaintext

# Copyright 2002-2025 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/>.
# This file was written by Tom Tromey <tromey@redhat.com>
# This file is part of the gdb testsuite.
#
# Tests for readline operations.
#
# This function is used to test operate-and-get-next.
# NAME is the name of the test.
# ARGS is a list of alternating commands and expected results.
proc operate_and_get_next {name args} {
global gdb_prompt
set my_gdb_prompt "($gdb_prompt| >)"
set reverse {}
foreach {item result} $args {
verbose "sending $item"
sleep 1
# We can't use gdb_test here because we might see a " >" prompt.
set status 0
send_gdb "$item\n"
gdb_expect {
-re "$item" {
# Ok
}
timeout {
set status 1
}
}
if {! $status} {
gdb_expect {
-re "$result" {
# Ok.
}
timeout {
set status 1
}
}
}
if {$status} {
fail "$name - send $item"
return 0
}
pass "$name - send $item"
set reverse [linsert $reverse 0 $item $result]
}
# Now use C-p to go back to the start.
foreach {item result} $reverse {
# Actually send C-p followed by C-l. This lets us recognize the
# command when gdb prints it again.
send_gdb "\x10\x0c"
set status 0
gdb_expect {
-re "$item" {
# Ok
}
timeout {
set status 1
}
}
if {$status} {
fail "$name - C-p to $item"
return 0
}
pass "$name - C-p to $item"
}
# Now C-o through the list. Don't send the command, since it is
# already there. Strip off the first command from the list so we
# can see the next command inside the loop.
set count 0
foreach {item result} $args {
set status 0
# If this isn't the first item, make sure we see the command at
# the prompt.
if {$count > 0} {
gdb_expect {
-re ".*$item" {
# Ok
}
timeout {
set status 1
}
}
}
if {! $status} {
# For the last item, send a simple \n instead of C-o.
if {$count == [llength $args] - 2} {
send_gdb "\n"
} else {
# 15 is C-o.
send_gdb [format %c 15]
}
set status 0
gdb_expect {
-re "$result" {
# Ok
}
timeout {
set status 1
}
}
}
if {$status} {
fail "$name - C-o for $item"
return 0
}
pass "$name - C-o for $item"
set count [expr {$count + 2}]
}
# Match the prompt so the next test starts at the right place.
gdb_test "" ".*" "$name - final prompt"
return 1
}
save_vars { env(TERM) } {
# The arrow key test relies on the standard VT100 bindings, so
# make sure that an appropriate terminal is selected. The same
# bug doesn't show up if we use ^P / ^N instead.
setenv TERM vt100
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
if { ![readline_is_used] } {
unsupported "readline isn't used."
return -1
}
save_vars { timeout env(GDBHISTSIZE) env(GDBHISTFILE) } {
set timeout 30
# A simple test of operate-and-get-next.
operate_and_get_next "Simple operate-and-get-next" \
"p 1" ".* = 1" \
"p 2" ".* = 2" \
"p 3" ".* = 3"
# Test operate-and-get-next with a secondary prompt.
operate_and_get_next "operate-and-get-next with secondary prompt" \
"if 1 > 0" "" \
"p 5" "" \
"end" ".* = 5"
# Verify that arrow keys work in secondary prompts. The control
# sequence is a hard-coded VT100 up arrow.
gdb_test "print 42" "\\\$\[0-9\]* = 42"
set msg "arrow keys with secondary prompt"
gdb_test_multiple "if 1 > 0\n\033\[A\033\[A\nend" $msg {
-re ".*\\\$\[0-9\]* = 42\r\n$gdb_prompt $" {
pass $msg
}
-re ".*Undefined command:.*$gdb_prompt $" {
fail $msg
}
}
# Use the up arrow to select a previous command. Check that
# no unexpected output is added between the previously
# selected command, and the output of that command.
gdb_test "print 123" "\\\$\[0-9\]* = 123"
gdb_test_multiple "\033\[A" "use up arrow" {
-re -wrap "print 123\r\n\\\$\[0-9\]* = 123" {
pass $gdb_test_name
}
}
# Now repeat the first test with a history file that fills the entire
# history list.
set env(GDBHISTFILE) "${srcdir}/${subdir}/gdb_history"
set env(GDBHISTSIZE) "10"
clean_restart
operate_and_get_next "Simple operate-and-get-next, two" \
"p 7" ".* = 7" \
"p 8" ".* = 8" \
"p 9" ".* = 9"
# Test sending a long command to GDB, a command that requires
# multiple terminal lines. Long ago there was a readline bug
# that would cause GDB to crash in this situation. We force
# the bug by setting up a narrow terminal width, and then
# sending a long command.
clean_restart
# The number of characters to send in the command. We
# actually send a few more than this; this total is really the
# extra characters we add on after sending the command name.
set char_total 4500
set char_sent 0
# Adjust the terminal width. Detect horizontal scrolling, which
# happens with stub-termcap.c.
set horizontal_scrolling 0
set cmd "set width 7"
gdb_test_multiple $cmd "" {
-re "^$cmd\r\n$gdb_prompt $" {
pass $gdb_test_name
}
-re "^$cmd\r\n<b\\) $" {
set horizontal_scrolling 1
pass $gdb_test_name
}
}
if { !$horizontal_scrolling } {
# Send the command prefix, then lots of additional characters
# that create a really long command that wraps over multiple
# lines.
send_gdb "help X"
gdb_test_multiple "" "send long command to GDB" {
-re "X" {
incr char_sent
if {$char_sent <= $char_total} {
send_gdb "X"
exp_continue
}
}
-re "\[ \b\r\n\]" {
exp_continue
}
}
# Send the final newline so that GDB will process the command.
# Check GDB returns a suitable error.
send_gdb "\n"
gdb_test "" \
"Undefined command: \"X+\"\\. Try \"help\"\\." \
"All the characters transferred"
}
}
}
# Test operate_and_get_next when selecting the last command.
with_test_prefix "operate_and_get_next last command" {
clean_restart
# Expected output from echo 1\n.
set re1 \
[multi_line \
"" \
"1"]
# Expected output from echo 2\n.
set re2 \
[multi_line \
"" \
"2"]
# Enter command into history.
gdb_test {echo 1\n} $re1 \
"enter command"
# Recall command from history (Ctrl-r, 022), and do operate-and-get-next
# (Ctrl-o, 017). There shouldn't be a prefill, but if there is one,
# prevent a possible timeout using -no-prompt-anchor.
send_gdb "\022echo 1\017"
gdb_test -no-prompt-anchor "" $re1 \
"recall command"
# Regression test for PR32485: Since we recalled the last command, there
# shouldn't be a prefil, so check that here.
# If there is no prefil, we simple have:
# (gdb) echo 2\n^M
# 2^M
# (gdb)
# If there is a prefil, we have:
# (gdb) echo 1\necho 2\n^M
# 1^M
# echo 2^M
# (gdb)
gdb_test {echo 2\n} $re2 \
"no prefill"
}