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