# Copyright (C) 2015 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 . # Check that "gdb -batch -ex run" does not leave the terminal in the # wrong state. standard_testfile if {[build_executable "failed to prepare" $testfile $srcfile debug] == -1} { return -1 } set file_arg $binfile if [is_remote host] { set file_arg [remote_download host $file_arg] } global GDBFLAGS set saved_gdbflags $GDBFLAGS # The shell's prompt. set shell_prompt "$ " set shell_prompt_re [string_to_regexp $shell_prompt] # Spawn shell. Returns true on success, false otherwise. proc spawn_shell {} { global shell_prompt_re set res [remote_spawn host "/bin/sh"] if { $res < 0 || $res == "" } { unsupported "Spawning shell failed." return 0 } set gotit 0 set test "spawn shell" gdb_expect { -re "$shell_prompt_re$" { pass $test set gotit 1 } timeout { fail "$test (timeout)" } eof { fail "$test (eof)" } } return $gotit } # Exit the shell. proc exit_shell {} { global shell_prompt_re set test "exit shell" send_gdb "exit\n" gdb_expect { timeout { fail "$test (timeout)" return 0 } eof { pass "$test" } } if ![is_remote host] { remote_close host } } # Run "stty" and store the output in $result. Returns true on # success, false otherwise. proc run_stty {message result} { global shell_prompt_re upvar $result output send_gdb "stty || echo \"not found\"\n" set gotit 0 gdb_expect { -re "not found.*not found.*$shell_prompt_re$" { pass "$message (not found)" } -re "(.*)$shell_prompt_re$" { set output $expect_out(1,string) set gotit 1 pass $message } timeout { fail "$message (timeout)" } eof { fail "$message (eof)" } } return $gotit } # Check that "gdb -batch -ex run" does not leave the terminal in the # wrong state. proc test_terminal_settings_preserved {} { global file_arg global GDB INTERNAL_GDBFLAGS GDBFLAGS global gdb_prompt pagination_prompt global saved_gdbflags global shell_prompt_re if ![spawn_shell] { return } set stty_supported [run_stty "stty before" stty_before] set test "gdb -batch -ex run" set GDBFLAGS $saved_gdbflags append GDBFLAGS " -batch" append GDBFLAGS " -ex \"set height unlimited\"" append GDBFLAGS " -ex \"start\"" append GDBFLAGS " --args \"$file_arg\"" send_gdb "$GDB $INTERNAL_GDBFLAGS $GDBFLAGS [host_info gdb_opts]\n" gdb_expect { -re "Don't know how to run.*$shell_prompt_re$" { unsupported $test } -re "$gdb_prompt $" { # -batch implies no GDB prompt. fail $test } -re "Temporary breakpoint .*$shell_prompt_re$" { pass $test } timeout { fail "$test (timeout)" } eof { fail "$test (eof)" } } set test "echo test_echo" send_gdb "echo test_echo\n" gdb_expect { -re "^echo test_echo\r\ntest_echo\r\n.*$shell_prompt_re$" { pass $test } timeout { fail "$test (timeout)" } eof { fail "$test (eof)" } } set test "terminal settings preserved" if $stty_supported { run_stty "stty after" stty_after gdb_assert [string equal $stty_before $stty_after] $test } else { unsupported "$test (no stty)" } exit_shell } test_terminal_settings_preserved set GDBFLAGS $saved_gdbflags