1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
|
# Copyright 2016-2021 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/>.
standard_testfile
set compile_options "debug"
if {[build_executable $testfile.exp $testfile ${srcfile} ${compile_options}] == -1} {
untested "failed to compile"
return -1
}
# Ensure no output has been sent. Use MESSAGE as test message.
proc ensure_no_output {message} {
global decimal
# Run a command and use an anchor to make sure no output appears
# before the command's expected output.
gdb_test "print 999" "^print 999\r\n\\\$$decimal = 999" $message
}
# Run a few execution-related commands on CON1, and ensure the proper
# output, or none, if appropriate, is sent to CON2. CON1_NAME and
# CON2_NAME are the names of the consoles.
proc do_execution_tests {con1 con1_name con2 con2_name} {
global srcfile
global decimal
set bp_lineno [gdb_get_line_number "set break $con1_name here"]
with_spawn_id $con1 {
gdb_test "next" "global = 1;"
}
with_spawn_id $con2 {
ensure_no_output "next causes no spurious output on other console"
}
with_spawn_id $con1 {
gdb_test "break $srcfile:$bp_lineno" \
"Breakpoint $decimal .*$srcfile, line $bp_lineno\\." \
"set breakpoint"
}
with_spawn_id $con2 {
ensure_no_output "break causes no spurious output on other console"
}
with_spawn_id $con1 {
gdb_test "continue" "set break $con1_name here .*" "continue to breakpoint"
}
with_spawn_id $con2 {
set test "breakpoint hit reported on other console"
gdb_test_multiple "" $test {
-re "Breakpoint $decimal, .* set break $con1_name here " {
pass $test
}
}
}
}
# The test proper.
proc_with_prefix do_test {} {
global srcfile testfile
global gdb_prompt
global gdb_spawn_id
global gdb_main_spawn_id extra_spawn_id
clean_restart $testfile
if ![runto_main] {
untested "could not run to main"
return -1
}
gdb_test "new-ui" \
"Usage: new-ui INTERPRETER TTY" \
"new-ui without arguments"
set test "new-ui does not repeat"
send_gdb "\n"
gdb_test_multiple "" $test {
-re "^\r\n$gdb_prompt $" {
pass $test
}
}
# Save the main UI's spawn ID.
set gdb_main_spawn_id $gdb_spawn_id
# Create the new PTY for the secondary console UI.
spawn -pty
set extra_spawn_id $spawn_id
set extra_tty_name $spawn_out(slave,name)
gdb_test_multiple "new-ui console $extra_tty_name" "new-ui" {
-re "New UI allocated\r\n$gdb_prompt $" {
}
}
with_spawn_id $extra_spawn_id {
set test "initial prompt on extra console"
gdb_test_multiple "" $test {
-re "$gdb_prompt $" {
pass $test
}
}
}
# Ensure non-execution commands in one console don't cause output
# in the other consoles.
with_spawn_id $gdb_main_spawn_id {
gdb_test "print 1" "^print 1\r\n\\\$1 = 1" "print on main console"
}
with_spawn_id $extra_spawn_id {
gdb_test "print 2" "^print 2\r\n\\\$2 = 2" "print on extra console"
}
# Verify that we get proper queries on the main UI, but that they are
# auto-answered on secondary UIs.
with_spawn_id $gdb_main_spawn_id {
gdb_test "delete" "" "delete all breakpoint on main console" \
"Delete all breakpoints. .y or n. $" "n"
}
with_spawn_id $extra_spawn_id {
# Check output in two stages in order to override
# gdb_test_multiple's internal "got interactive prompt" fail
# that would otherwise match if the expect buffer happens to
# fill with partial output that ends in "(y or n) ".
set test "delete all breakpoints on extra console"
gdb_test_multiple "delete" $test {
-re "Delete all breakpoints. .y or n. " {
gdb_test "" \
".answered Y; input not from terminal." \
$test
}
}
}
# Run a few execution tests with the main console as the driver
# console.
with_test_prefix "main console" {
do_execution_tests \
$gdb_main_spawn_id "main console" \
$extra_spawn_id "extra console"
}
# Same, but with the extra console as driver.
with_test_prefix "extra console" {
do_execution_tests \
$extra_spawn_id "extra console" \
$gdb_main_spawn_id "main console"
}
}
# Test missing / invalid arguments.
proc_with_prefix do_test_invalid_args {} {
global testfile
clean_restart $testfile
spawn -pty
set extra_tty_name $spawn_out(slave,name)
# Test bad terminal path.
gdb_test "new-ui console /non/existent/path" \
"opening terminal failed: No such file or directory\." \
"new-ui with bad terminal path"
# Test bad interpreter name.
gdb_test "new-ui bloop $extra_tty_name" \
"Interpreter `bloop' unrecognized" \
"new-ui with bad interpreter name"
# Test that we can continue working normally.
if ![runto_main] {
fail "could not run to main"
}
}
do_test
do_test_invalid_args
|