| # 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] { |
| 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] { |
| return |
| } |
| } |
| |
| do_test |
| do_test_invalid_args |