[gdb/testsuite] Fix and add prompt anchoring in tuiterm

There is a test-case that contains a unit test for tuiterm:
gdb.tui/tuiterm.exp.

However, this only excercises the tuiterm itself, and not the functions that
interact with it, like Term::command.

Add a new test-case gdb.tui/tuiterm-2.exp that:
- overrides proc accept_gdb_output (to be able simulate incorrect responses
  while avoiding the timeout),
- overrides proc send_gdb (to be able to call Term::command without a gdb
  instance, such that all tuiterm input is generated by the test-case).
- issues Term::command calls, and
- checks whether they behave correctly.

This exposes a problem in Term::command.  The "prompt before command" regexp
starts with a bit that is supposed to anchor the prompt to the border:
...
	set str "(^|\|)$gdb_prompt $str"
...
but that doesn't work due to insufficient escaping.  Fix this by adding the
missing escape:
...
	set str "(^|\\|)$gdb_prompt $str"
...

Futhermore, the "prompt after command" regexp in Term::wait_for has no
anchoring at all:
...
	set prompt_wait_for "$gdb_prompt \$"
...
so add that as well.

Tested on x86_64-linux.
This commit is contained in:
Tom de Vries 2023-06-13 12:24:17 +02:00
parent cc313a1d84
commit 3e543c18b1
2 changed files with 100 additions and 2 deletions

View file

@ -0,0 +1,98 @@
# Copyright 2023 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/>.
# Check tuiterm procs that interact with gdb as well as tuiterm.
tuiterm_env
proc test_accept_gdb_output { } {
if { $::action_cnt == [llength $::actions] } {
return 0
}
set action [lindex $::actions $::action_cnt]
incr ::action_cnt
uplevel $action
return 1
}
proc test_send_gdb { string } {
set expected [lindex $::expect_send $::send_cnt]
gdb_assert { [string equal $string $expected] }
incr ::send_cnt
}
with_override Term::accept_gdb_output test_accept_gdb_output {
with_override send_gdb test_send_gdb {
foreach_with_prefix border { "" "|" } {
with_test_prefix "Term::command match" {
Term::_setup 4 20
set send_cnt 0
set expect_send { foo\n }
set action_cnt 0
set actions {
{
Term::_insert "${::border}(gdb) foo"
}
{
Term::_ctl_0x0d
Term::_ctl_0x0a
Term::_insert "${::border}(gdb) "
}
}
gdb_assert { [Term::command "foo"] }
}
with_test_prefix "Term::command mismatch" {
Term::_setup 4 20
set send_cnt 0
set expect_send { foo\n }
set action_cnt 0
set actions {
{
Term::_insert "$::border (gdb) foo"
}
{
Term::_ctl_0x0d
Term::_ctl_0x0a
Term::_insert "${::border}(gdb) "
}
}
gdb_assert { ![Term::command "foo"] }
}
with_test_prefix "Term::command mismatch 2" {
Term::_setup 4 20
set send_cnt 0
set expect_send { foo\n }
set action_cnt 0
set actions {
{
Term::_insert "${::border}(gdb) foo"
}
{
Term::_ctl_0x0d
Term::_ctl_0x0a
Term::_insert "${::border} (gdb) "
}
}
gdb_assert { ![Term::command "foo"] }
}
}
}
}

View file

@ -788,7 +788,7 @@ namespace eval Term {
set fn "wait_for"
set prompt_wait_for "$gdb_prompt \$"
set prompt_wait_for "(^|\\|)$gdb_prompt \$"
debug_tui_matching "$fn: regexp: '$wait_for'"
while 1 {
@ -909,7 +909,7 @@ namespace eval Term {
global gdb_prompt
send_gdb "$cmd\n"
set str [string_to_regexp $cmd]
set str "(^|\|)$gdb_prompt $str"
set str "(^|\\|)$gdb_prompt $str"
wait_for $str
}