Test that terminal settings are restored after quitting via SIGTERM

Message ID 1438186203-13183-1-git-send-email-patrick@parcs.ath.cx
State New, archived
Headers

Commit Message

Patrick Palka July 29, 2015, 4:10 p.m. UTC
  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.base/batch-preserve-term-settings.exp      | 116 +++++++++++++++++++++
 1 file changed, 116 insertions(+)
  

Comments

Pedro Alves July 29, 2015, 4:18 p.m. UTC | #1
On 07/29/2015 05:10 PM, Patrick Palka wrote:
> 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.
> 

Excellent!  This is OK.

Thanks,
Pedro Alves
  

Patch

diff --git a/gdb/testsuite/gdb.base/batch-preserve-term-settings.exp b/gdb/testsuite/gdb.base/batch-preserve-term-settings.exp
index ca6f173..a4c8796 100644
--- a/gdb/testsuite/gdb.base/batch-preserve-term-settings.exp
+++ b/gdb/testsuite/gdb.base/batch-preserve-term-settings.exp
@@ -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
+}