fish-shell/tests/signals.expect
2020-04-07 22:18:15 +02:00

62 lines
1.7 KiB
Text

# vim: set filetype=expect:
#
# Test signal handling for interactive shells.
set pid [spawn $fish -C "sleep 10&"]
expect_prompt
send "\x03"
sleep 0.010
send_line "jobs"
expect_prompt -re {sleep.10} {} unmatched {
puts stderr "background job missing after SIGINT"
}
send_line "kill %1"
expect_prompt
# Verify that the fish_postexec handler is called after SIGINT.
send_line "function postexec --on-event fish_postexec; echo fish_postexec spotted; end"
expect_prompt
send_line read
expect -re "\\r\\n?read> $"
exec -- kill -INT $pid
expect "fish_postexec spotted"
expect_prompt
# Verify that the fish_kill_signal is set.
send_line "functions -e postexec; function postexec --on-event fish_postexec; echo fish_kill_signal \$fish_kill_signal; end"
expect_prompt
send_line "sleep 5"
sleep 0.100
exec -- pkill -INT sleep -P $pid
expect "fish_kill_signal 2"
expect_prompt
send_line "sleep 5"
sleep 0.100
exec -- pkill -TERM sleep -P $pid
expect "fish_kill_signal 15"
expect_prompt
# Verify that sending SIGHUP to the shell, such as will happen when the tty is
# closed by the terminal, terminates the shell and the foreground command and
# any background commands run from that shell.
send "sleep 130 &\r"
expect_prompt
send "sleep 131 &\r"
expect_prompt
send "sleep 132\r"
exec -- kill -HUP $pid
# Verify the spawned fish shell has exited.
catch {expect default exp_continue} output
wait
# Verify all child processes have been killed. We don't use `-p $pid` because
# if the shell has a bug the child processes might have been reparented to pid
# 1 rather than killed.
set status [catch {exec pgrep -l -f "sleep 13"} output]
if {$status == 0} {
puts stderr "Commands spawned by the shell still running after SIGHUP"
puts stderr $output
}