1# Copyright 2016-2020 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# Test 'gdb "-ex new-ui TTY" -ex "start"' (or any other synchronous 17# execution command), when TTY already has input pending. GDB used to 18# internal error in this situation. 19 20standard_testfile 21 22set compile_options "debug" 23if {[build_executable $testfile.exp $testfile ${srcfile} ${compile_options}] == -1} { 24 untested "failed to compile" 25 return -1 26} 27 28# See intro. 29 30proc test_command_line_new_ui_pending_input {} { 31 global gdb_prompt 32 global binfile 33 34 # This test requires running a synchronous execution command from 35 # the command line. 36 if {[use_gdb_stub] || [target_info gdb_protocol] == "extended-remote" } { 37 unsupported "can't run from the command line" 38 return 0 39 } 40 41 spawn -pty 42 set extra_spawn_id $spawn_id 43 set extra_tty_name $spawn_out(slave,name) 44 45 # An arbitrary number of prints. 46 set nprints 3 47 48 # Queue a few commands before GDB is started. 49 with_spawn_id $extra_spawn_id { 50 for {set i 1} {$i <= $nprints} {incr i} { 51 send_gdb "print $i\n" 52 } 53 } 54 pass "commands pending" 55 56 # Now spawn GDB, creating a new-ui and at the same time running a 57 # synchronous command. 58 set test "spawn gdb" 59 60 set bpline [gdb_get_line_number "set breakpoint here"] 61 62 set options "" 63 append options " -iex \"set height 0\"" 64 append options " -iex \"set width 0\"" 65 append options " -iex \"new-ui console $extra_tty_name\"" 66 append options " -ex \"b $bpline\"" 67 append options " -ex \"run\"" 68 69 if {[gdb_spawn_with_cmdline_opts "$options $binfile"] != 0} { 70 fail $test 71 return 72 } else { 73 pass $test 74 } 75 76 # Consume the initial prompt on the extra console. 77 with_spawn_id $extra_spawn_id { 78 set test "initial prompt on extra console" 79 gdb_test_multiple "" $test { 80 -re "$gdb_prompt $" { 81 pass $test 82 } 83 } 84 } 85 86 # Check that we see the result of the print commands in the extra 87 # UI. 88 with_spawn_id $extra_spawn_id { 89 for {set i 1} {$i <= $nprints} {incr i} { 90 set test "print $i on extra console" 91 gdb_test_multiple "" $test { 92 -re " = $i\r\n$gdb_prompt " { 93 pass "$test" 94 } 95 } 96 } 97 } 98 99 # Now check that we reach the breakpoint successfully. 100 set test "run to breakpoint on main console" 101 gdb_test_multiple "" $test { 102 -re "Breakpoint .* main .*set breakpoint here.*$gdb_prompt $" { 103 pass $test 104 } 105 } 106 107 # And likewise on the extra console. No prompt is expected. 108 with_spawn_id $extra_spawn_id { 109 set test "run to breakpoint on extra console" 110 gdb_test_multiple "" $test { 111 -re "Breakpoint .* main .*set breakpoint here" { 112 pass $test 113 } 114 } 115 } 116} 117 118# The driver. Calls all tests. 119proc testcase_driver {} { 120 test_command_line_new_ui_pending_input 121} 122 123testcase_driver 124