Test that terminal settings are restored after quitting via SIGTERM
authorPatrick Palka <patrick@parcs.ath.cx>
Wed, 29 Jul 2015 15:59:25 +0000 (11:59 -0400)
committerPatrick Palka <patrick@parcs.ath.cx>
Wed, 29 Jul 2015 16:47:24 +0000 (12:47 -0400)
Tested on x86_64 Debian Stretch, native, gdbserver and
extended-gdbserver.  Also tested that the various error paths, like if
$PPID is empty or if SIGTERM did not not kill GDB, function correctly.

gdb/testsuite/ChangeLog:

* gdb.base/batch-preserve-term-settings.exp (send_quit_command):
New proc.
(test_terminal_settings_preserved_after_sigterm): New test.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/batch-preserve-term-settings.exp

index 44725b4fe864bf8a30e0b690218d631cc3197ca6..3722e287f160df6f71e8f4d6089054fb7acbfb55 100644 (file)
        * gdb.python/py-objfile.exp: Fix typo that snuck in from my last
        commit.
 
+2015-07-29  Patrick Palka  <patrick@parcs.ath.cx>
+
+       * gdb.base/batch-preserve-term-settings.exp (send_quit_command):
+       New proc.
+       (test_terminal_settings_preserved_after_sigterm): New test.
+
 2015-07-29  Patrick Palka  <patrick@parcs.ath.cx>
 
        * gdb.base/batch-preserve-term-settings.exp
index ca6f1735558998017ef768b5a690cc0fd4b959e0..a4c87967626a4302ac094f0f3b5c421c7d5a1216 100644 (file)
@@ -176,6 +176,33 @@ proc test_terminal_settings_preserved {} {
     exit_shell
 }
 
+# Send the quit command to GDB and make sure it exits.
+
+proc send_quit_command { test_name } {
+    global shell_prompt_re
+
+    set test $test_name
+    send_gdb "quit\n"
+    gdb_expect {
+       -re "(y or n)" {
+           send_gdb "y\n"
+           exp_continue
+       }
+       -re ".*$shell_prompt_re$" {
+           pass $test
+           return
+       }
+       timeout {
+           fail "$test (timeout)"
+           return 0
+       }
+       eof {
+           fail "$test (eof)"
+           return 0
+       }
+    }
+}
+
 # Check that quitting from the CLI via the "quit" command does not leave the
 # terminal in the wrong state.  The GDB commands CMDS are executed before
 # quitting.
@@ -254,6 +281,91 @@ proc test_terminal_settings_preserved_after_cli_exit { cmds } {
     exit_shell
 }
 
+# Check that sending SIGTERM kills GDB and does not leave the terminal in the
+# wrong state.
+
+proc test_terminal_settings_preserved_after_sigterm { } {
+    global file_arg
+    global GDB INTERNAL_GDBFLAGS GDBFLAGS
+    global gdb_prompt
+    global shell_prompt_re
+
+    if ![spawn_shell] {
+       return
+    }
+
+    set saved_gdbflags $GDBFLAGS
+
+    set stty_supported [run_stty "stty before" stty_before]
+
+    set test "start gdb"
+    send_gdb "$GDB $INTERNAL_GDBFLAGS $GDBFLAGS [host_info gdb_opts]\n"
+    gdb_expect {
+       -re "$gdb_prompt $" {
+           pass $test
+       }
+       timeout {
+           fail "$test (timeout)"
+       }
+       eof {
+           fail "$test (eof)"
+       }
+    }
+
+    # Retrieve the pid of gdb with the gdb command "shell echo $PPID"
+    set gdb_pid -1
+    set test "run shell echo \$PPID"
+    send_gdb "shell echo \$PPID\n"
+    gdb_expect {
+       -re ".*\r\n(\\d+)\r\n$gdb_prompt $" {
+           set gdb_pid $expect_out(1,string)
+           pass $test
+       }
+       -re ".*\r\n\r\n$gdb_prompt $" {
+           fail "$test (no \$PPID)"
+       }
+       timeout {
+           fail "$test (timeout)"
+       }
+       eof {
+           fail "$test (eof)"
+       }
+    }
+
+    set test "kill gdb with SIGTERM"
+    if { $gdb_pid == -1 } {
+       fail "$test (no pid)"
+       send_quit_command "quit gdb"
+    } else {
+       remote_exec host "kill -TERM $gdb_pid"
+       set gdb_killed 0
+       gdb_expect {
+           -re ".*$shell_prompt_re$" {
+               pass $test
+               set gdb_killed 1
+           }
+           default {
+               fail "$test (did not quit)"
+           }
+       }
+
+       if !$gdb_killed {
+           send_quit_command "quit gdb"
+       }
+    }
+
+    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
+}
+
 with_test_prefix "batch run" {
     test_terminal_settings_preserved
 }
@@ -269,3 +381,7 @@ with_test_prefix "cli exit after start cmd" {
 with_test_prefix "cli exit after run cmd" {
     test_terminal_settings_preserved_after_cli_exit { "run" }
 }
+
+with_test_prefix "cli exit after SIGTERM" {
+    test_terminal_settings_preserved_after_sigterm
+}