Commit | Line | Data |
---|---|---|
618f726f | 1 | # Copyright (C) 2015-2016 Free Software Foundation, Inc. |
6c400b59 PA |
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 | # Check that "gdb -batch -ex run" does not leave the terminal in the | |
17 | # wrong state. | |
18 | ||
19 | standard_testfile | |
20 | ||
21 | if {[build_executable "failed to prepare" $testfile $srcfile debug] == -1} { | |
22 | return -1 | |
23 | } | |
24 | ||
25 | set file_arg $binfile | |
26 | if [is_remote host] { | |
27 | set file_arg [remote_download host $file_arg] | |
28 | } | |
29 | ||
6c400b59 | 30 | # The shell's prompt. |
155b7f57 | 31 | set shell_prompt_re "\[$#\] " |
6c400b59 PA |
32 | |
33 | # Spawn shell. Returns true on success, false otherwise. | |
34 | ||
35 | proc spawn_shell {} { | |
36 | global shell_prompt_re | |
37 | ||
38 | set res [remote_spawn host "/bin/sh"] | |
39 | if { $res < 0 || $res == "" } { | |
bc6c7af4 | 40 | unsupported "spawning shell failed." |
6c400b59 PA |
41 | return 0 |
42 | } | |
43 | ||
44 | set gotit 0 | |
45 | set test "spawn shell" | |
46 | gdb_expect { | |
47 | -re "$shell_prompt_re$" { | |
48 | pass $test | |
49 | set gotit 1 | |
50 | } | |
51 | timeout { | |
52 | fail "$test (timeout)" | |
53 | } | |
54 | eof { | |
55 | fail "$test (eof)" | |
56 | } | |
57 | } | |
58 | ||
59 | return $gotit | |
60 | } | |
61 | ||
62 | # Exit the shell. | |
63 | ||
64 | proc exit_shell {} { | |
65 | global shell_prompt_re | |
66 | ||
67 | set test "exit shell" | |
68 | send_gdb "exit\n" | |
69 | gdb_expect { | |
70 | timeout { | |
71 | fail "$test (timeout)" | |
72 | return 0 | |
73 | } | |
74 | eof { | |
75 | pass "$test" | |
76 | } | |
77 | } | |
78 | if ![is_remote host] { | |
79 | remote_close host | |
80 | } | |
81 | } | |
82 | ||
83 | # Run "stty" and store the output in $result. Returns true on | |
84 | # success, false otherwise. | |
85 | ||
86 | proc run_stty {message result} { | |
87 | global shell_prompt_re | |
88 | ||
89 | upvar $result output | |
90 | ||
91 | send_gdb "stty || echo \"not found\"\n" | |
92 | set gotit 0 | |
93 | gdb_expect { | |
94 | -re "not found.*not found.*$shell_prompt_re$" { | |
95 | pass "$message (not found)" | |
96 | } | |
97 | -re "(.*)$shell_prompt_re$" { | |
98 | set output $expect_out(1,string) | |
99 | set gotit 1 | |
100 | pass $message | |
101 | } | |
102 | timeout { | |
103 | fail "$message (timeout)" | |
104 | } | |
105 | eof { | |
106 | fail "$message (eof)" | |
107 | } | |
108 | } | |
109 | return $gotit | |
110 | } | |
111 | ||
112 | # Check that "gdb -batch -ex run" does not leave the terminal in the | |
113 | # wrong state. | |
114 | ||
115 | proc test_terminal_settings_preserved {} { | |
116 | global file_arg | |
117 | global GDB INTERNAL_GDBFLAGS GDBFLAGS | |
90074d11 | 118 | global gdb_prompt |
6c400b59 PA |
119 | global shell_prompt_re |
120 | ||
121 | if ![spawn_shell] { | |
122 | return | |
123 | } | |
124 | ||
125 | set stty_supported [run_stty "stty before" stty_before] | |
126 | ||
127 | set test "gdb -batch -ex run" | |
90074d11 PP |
128 | append EXTRA_GDBFLAGS "-batch" |
129 | append EXTRA_GDBFLAGS " -ex \"set height unlimited\"" | |
130 | append EXTRA_GDBFLAGS " -ex \"start\"" | |
131 | append EXTRA_GDBFLAGS " --args \"$file_arg\"" | |
132 | send_gdb "$GDB $INTERNAL_GDBFLAGS $GDBFLAGS $EXTRA_GDBFLAGS [host_info gdb_opts]\n" | |
6c400b59 PA |
133 | gdb_expect { |
134 | -re "Don't know how to run.*$shell_prompt_re$" { | |
135 | unsupported $test | |
136 | } | |
137 | -re "$gdb_prompt $" { | |
138 | # -batch implies no GDB prompt. | |
139 | fail $test | |
140 | } | |
141 | -re "Temporary breakpoint .*$shell_prompt_re$" { | |
142 | pass $test | |
143 | } | |
144 | timeout { | |
145 | fail "$test (timeout)" | |
146 | } | |
147 | eof { | |
148 | fail "$test (eof)" | |
149 | } | |
150 | } | |
151 | ||
152 | set test "echo test_echo" | |
153 | send_gdb "echo test_echo\n" | |
154 | gdb_expect { | |
155 | -re "^echo test_echo\r\ntest_echo\r\n.*$shell_prompt_re$" { | |
156 | pass $test | |
157 | } | |
158 | timeout { | |
159 | fail "$test (timeout)" | |
160 | } | |
161 | eof { | |
162 | fail "$test (eof)" | |
163 | } | |
164 | } | |
165 | ||
166 | set test "terminal settings preserved" | |
167 | if $stty_supported { | |
168 | run_stty "stty after" stty_after | |
169 | ||
170 | gdb_assert [string equal $stty_before $stty_after] $test | |
171 | } else { | |
172 | unsupported "$test (no stty)" | |
173 | } | |
174 | ||
175 | exit_shell | |
176 | } | |
177 | ||
06265e53 PP |
178 | # Send the quit command to GDB and make sure it exits. |
179 | ||
180 | proc send_quit_command { test_name } { | |
181 | global shell_prompt_re | |
182 | ||
183 | set test $test_name | |
184 | send_gdb "quit\n" | |
185 | gdb_expect { | |
186 | -re "(y or n)" { | |
187 | send_gdb "y\n" | |
188 | exp_continue | |
189 | } | |
190 | -re ".*$shell_prompt_re$" { | |
191 | pass $test | |
192 | return | |
193 | } | |
194 | timeout { | |
195 | fail "$test (timeout)" | |
196 | return 0 | |
197 | } | |
198 | eof { | |
199 | fail "$test (eof)" | |
200 | return 0 | |
201 | } | |
202 | } | |
203 | } | |
204 | ||
18206ca3 PP |
205 | # Check that quitting from the CLI via the "quit" command does not leave the |
206 | # terminal in the wrong state. The GDB commands CMDS are executed before | |
207 | # quitting. | |
208 | ||
209 | proc test_terminal_settings_preserved_after_cli_exit { cmds } { | |
210 | global file_arg | |
211 | global GDB INTERNAL_GDBFLAGS GDBFLAGS | |
212 | global gdb_prompt | |
213 | global shell_prompt_re | |
214 | ||
215 | if ![spawn_shell] { | |
216 | return | |
217 | } | |
218 | ||
219 | set saved_gdbflags $GDBFLAGS | |
220 | ||
221 | set stty_supported [run_stty "stty before" stty_before] | |
222 | ||
223 | set test "start gdb" | |
224 | send_gdb "$GDB $INTERNAL_GDBFLAGS $GDBFLAGS [host_info gdb_opts] --args \"$file_arg\"\n" | |
225 | gdb_expect { | |
226 | -re "$gdb_prompt $" { | |
227 | pass $test | |
228 | } | |
229 | timeout { | |
230 | fail "$test (timeout)" | |
231 | } | |
232 | eof { | |
233 | fail "$test (eof)" | |
234 | } | |
235 | } | |
236 | ||
237 | foreach cmd $cmds { | |
238 | set test "run command $cmd" | |
239 | send_gdb "$cmd\n" | |
240 | gdb_expect { | |
241 | -re "$gdb_prompt $" { | |
242 | pass $test | |
243 | } | |
244 | timeout { | |
245 | fail "$test (timeout)" | |
246 | } | |
247 | eof { | |
248 | fail "$test (eof)" | |
249 | } | |
250 | } | |
251 | } | |
252 | ||
d618e4c5 | 253 | send_quit_command "quit gdb" |
18206ca3 PP |
254 | |
255 | set test "terminal settings preserved" | |
256 | if $stty_supported { | |
257 | run_stty "stty after" stty_after | |
258 | ||
259 | gdb_assert [string equal $stty_before $stty_after] $test | |
260 | } else { | |
261 | unsupported "$test (no stty)" | |
262 | } | |
263 | ||
264 | exit_shell | |
265 | } | |
266 | ||
06265e53 PP |
267 | # Check that sending SIGTERM kills GDB and does not leave the terminal in the |
268 | # wrong state. | |
269 | ||
270 | proc test_terminal_settings_preserved_after_sigterm { } { | |
271 | global file_arg | |
272 | global GDB INTERNAL_GDBFLAGS GDBFLAGS | |
273 | global gdb_prompt | |
274 | global shell_prompt_re | |
275 | ||
276 | if ![spawn_shell] { | |
277 | return | |
278 | } | |
279 | ||
280 | set saved_gdbflags $GDBFLAGS | |
281 | ||
282 | set stty_supported [run_stty "stty before" stty_before] | |
283 | ||
284 | set test "start gdb" | |
285 | send_gdb "$GDB $INTERNAL_GDBFLAGS $GDBFLAGS [host_info gdb_opts]\n" | |
286 | gdb_expect { | |
287 | -re "$gdb_prompt $" { | |
288 | pass $test | |
289 | } | |
290 | timeout { | |
291 | fail "$test (timeout)" | |
292 | } | |
293 | eof { | |
294 | fail "$test (eof)" | |
295 | } | |
296 | } | |
297 | ||
298 | # Retrieve the pid of gdb with the gdb command "shell echo $PPID" | |
299 | set gdb_pid -1 | |
300 | set test "run shell echo \$PPID" | |
301 | send_gdb "shell echo \$PPID\n" | |
302 | gdb_expect { | |
303 | -re ".*\r\n(\\d+)\r\n$gdb_prompt $" { | |
304 | set gdb_pid $expect_out(1,string) | |
305 | pass $test | |
306 | } | |
307 | -re ".*\r\n\r\n$gdb_prompt $" { | |
308 | fail "$test (no \$PPID)" | |
309 | } | |
310 | timeout { | |
311 | fail "$test (timeout)" | |
312 | } | |
313 | eof { | |
314 | fail "$test (eof)" | |
315 | } | |
316 | } | |
317 | ||
318 | set test "kill gdb with SIGTERM" | |
319 | if { $gdb_pid == -1 } { | |
320 | fail "$test (no pid)" | |
321 | send_quit_command "quit gdb" | |
322 | } else { | |
323 | remote_exec host "kill -TERM $gdb_pid" | |
324 | set gdb_killed 0 | |
325 | gdb_expect { | |
326 | -re ".*$shell_prompt_re$" { | |
327 | pass $test | |
328 | set gdb_killed 1 | |
329 | } | |
330 | default { | |
331 | fail "$test (did not quit)" | |
332 | } | |
333 | } | |
334 | ||
335 | if !$gdb_killed { | |
336 | send_quit_command "quit gdb" | |
337 | } | |
338 | } | |
339 | ||
340 | set test "terminal settings preserved" | |
341 | if $stty_supported { | |
342 | run_stty "stty after" stty_after | |
343 | ||
344 | gdb_assert [string equal $stty_before $stty_after] $test | |
345 | } else { | |
346 | unsupported "$test (no stty)" | |
347 | } | |
348 | ||
349 | exit_shell | |
350 | } | |
351 | ||
18206ca3 PP |
352 | with_test_prefix "batch run" { |
353 | test_terminal_settings_preserved | |
354 | } | |
355 | ||
356 | with_test_prefix "cli exit" { | |
357 | test_terminal_settings_preserved_after_cli_exit { } | |
358 | } | |
359 | ||
360 | with_test_prefix "cli exit after start cmd" { | |
361 | test_terminal_settings_preserved_after_cli_exit { "start" } | |
362 | } | |
363 | ||
364 | with_test_prefix "cli exit after run cmd" { | |
365 | test_terminal_settings_preserved_after_cli_exit { "run" } | |
366 | } | |
06265e53 PP |
367 | |
368 | with_test_prefix "cli exit after SIGTERM" { | |
369 | test_terminal_settings_preserved_after_sigterm | |
370 | } |