From: Tom de Vries Date: Tue, 13 Jun 2023 10:24:17 +0000 (+0200) Subject: [gdb/testsuite] Fix and add prompt anchoring in tuiterm X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3e543c18b174a6d68277d27f27a98eb9515d20c5;p=binutils-gdb.git [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. --- diff --git a/gdb/testsuite/gdb.tui/tuiterm-2.exp b/gdb/testsuite/gdb.tui/tuiterm-2.exp new file mode 100644 index 00000000000..e7a0f03e4ba --- /dev/null +++ b/gdb/testsuite/gdb.tui/tuiterm-2.exp @@ -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 . + +# 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"] } + } + } + } +} diff --git a/gdb/testsuite/lib/tuiterm.exp b/gdb/testsuite/lib/tuiterm.exp index 171b242aa80..dc928ae5aff 100644 --- a/gdb/testsuite/lib/tuiterm.exp +++ b/gdb/testsuite/lib/tuiterm.exp @@ -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 }