| 1 | # Copyright 2016 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" "^print 999\r\n\\\$$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 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 | untested "could not run to main" |
| 86 | return -1 |
| 87 | } |
| 88 | |
| 89 | gdb_test "new-ui" \ |
| 90 | "usage: new-ui <interpreter> <tty>" \ |
| 91 | "new-ui without arguments" |
| 92 | |
| 93 | set test "new-ui does not repeat" |
| 94 | send_gdb "\n" |
| 95 | gdb_test_multiple "" $test { |
| 96 | -re "^\r\n$gdb_prompt $" { |
| 97 | pass $test |
| 98 | } |
| 99 | } |
| 100 | |
| 101 | # Save the main UI's spawn ID. |
| 102 | set gdb_main_spawn_id $gdb_spawn_id |
| 103 | |
| 104 | # Create the new PTY for the secondary console UI. |
| 105 | spawn -pty |
| 106 | set extra_spawn_id $spawn_id |
| 107 | set extra_tty_name $spawn_out(slave,name) |
| 108 | gdb_test_multiple "new-ui console $extra_tty_name" "new-ui" { |
| 109 | -re "New UI allocated\r\n$gdb_prompt $" { |
| 110 | } |
| 111 | } |
| 112 | |
| 113 | with_spawn_id $extra_spawn_id { |
| 114 | set test "initial prompt on extra console" |
| 115 | gdb_test_multiple "" $test { |
| 116 | -re "$gdb_prompt $" { |
| 117 | pass $test |
| 118 | } |
| 119 | } |
| 120 | } |
| 121 | |
| 122 | # Ensure non-execution commands in one console don't cause output |
| 123 | # in the other consoles. |
| 124 | with_spawn_id $gdb_main_spawn_id { |
| 125 | gdb_test "print 1" "^print 1\r\n\\\$1 = 1" "print on main console" |
| 126 | } |
| 127 | with_spawn_id $extra_spawn_id { |
| 128 | gdb_test "print 2" "^print 2\r\n\\\$2 = 2" "print on extra console" |
| 129 | } |
| 130 | |
| 131 | # Run a few execution tests with the main console as the driver |
| 132 | # console. |
| 133 | with_test_prefix "main console" { |
| 134 | do_execution_tests \ |
| 135 | $gdb_main_spawn_id "main console" \ |
| 136 | $extra_spawn_id "extra console" |
| 137 | } |
| 138 | # Same, but with the extra console as driver. |
| 139 | with_test_prefix "extra console" { |
| 140 | do_execution_tests \ |
| 141 | $extra_spawn_id "extra console" \ |
| 142 | $gdb_main_spawn_id "main console" |
| 143 | } |
| 144 | } |
| 145 | |
| 146 | # Test missing / invalid arguments. |
| 147 | |
| 148 | proc do_test_invalid_args {} { |
| 149 | global testfile |
| 150 | |
| 151 | clean_restart $testfile |
| 152 | |
| 153 | spawn -pty |
| 154 | set extra_tty_name $spawn_out(slave,name) |
| 155 | |
| 156 | # Test bad terminal path. |
| 157 | gdb_test "new-ui console /non/existent/path" \ |
| 158 | "opening terminal failed: No such file or directory\." \ |
| 159 | "new-ui with bad terminal path" |
| 160 | |
| 161 | # Test bad interpreter name. |
| 162 | gdb_test "new-ui bloop $extra_tty_name" \ |
| 163 | "Interpreter `bloop' unrecognized" \ |
| 164 | "new-ui with bad interpreter name" |
| 165 | |
| 166 | # Test that we can continue working normally. |
| 167 | if ![runto_main] { |
| 168 | fail "could not run to main" |
| 169 | } |
| 170 | } |
| 171 | |
| 172 | with_test_prefix "do_test" do_test |
| 173 | with_test_prefix "do_test_invalid_args" do_test_invalid_args |