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
|