Move exit test to pexpect

This needs some subprocess magic, but otherwise it's nicely straightforward.
This commit is contained in:
Fabian Homborg 2020-06-08 17:31:18 +02:00
parent 9d523c7589
commit 3c6055c3e0
4 changed files with 46 additions and 48 deletions

@ -1,48 +0,0 @@
# vim: set filetype=expect:
#
# Test handling of the `exit` command.
set pid [spawn $fish]
expect_prompt
# Verify that if we attempt to exit with a job in the background we get warned
# about that job and are told to type `exit` a second time.
send "sleep 111 &\r"
expect_prompt
send "exit\r"
expect -re "There are still jobs active:\r
\r
PID Command\r
*\\d+ sleep 111 &\r
\r
A second attempt to exit will terminate them.\r
Use 'disown PID' to remove jobs from the list without terminating them.\r"
expect_prompt
# Running anything other than `exit` should result in the same warning with
# the shell still running.
send "sleep 113 &\r"
expect_prompt
send "exit\r"
expect -re "There are still jobs active:\r
\r
PID Command\r
*\\d+ sleep 113 &\r
*\\d+ sleep 111 &\r
\r
A second attempt to exit will terminate them.\r
Use 'disown PID' to remove jobs from the list without terminating them.\r"
expect_prompt
# Verify that asking to exit a second time does so.
send "exit\r"
catch {expect default exp_continue} output
wait
# Verify all child processes have been killed. We don't use `-p $fish_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 11"} output]
if {$status == 0} {
puts stderr "Commands spawned by the shell still running after `exit`"
puts stderr $output
}

46
tests/pexpects/exit.py Normal file

@ -0,0 +1,46 @@
#!/usr/bin/env python3
from pexpect_helper import SpawnedProc
import subprocess
import sys
sp = SpawnedProc()
send, sendline, sleep, expect_prompt, expect_re = sp.send, sp.sendline, sp.sleep, sp.expect_prompt, sp.expect_re
expect_prompt()
# Verify that if we attempt to exit with a job in the background we get warned
# about that job and are told to type `exit` a second time.
send("sleep 111 &\r")
expect_prompt()
send("exit\r")
expect_re("""There are still jobs active:\r
\r
PID Command\r
*\\d+ sleep 111 &\r
\r
A second attempt to exit will terminate them.\r
Use 'disown PID' to remove jobs from the list without terminating them.\r""")
expect_prompt()
# Running anything other than `exit` should result in the same warning with
# the shell still running.
send("sleep 113 &\r")
expect_prompt()
send("exit\r")
expect_re("""There are still jobs active:\r
\r
PID Command\r
*\\d+ sleep 113 &\r
*\\d+ sleep 111 &\r
\r
A second attempt to exit will terminate them.\r
Use 'disown PID' to remove jobs from the list without terminating them.\r""")
expect_prompt()
# Verify that asking to exit a second time does so.
send("exit\r")
proc = subprocess.run(["pgrep", "-l", "-f", "sleep 11"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if proc.returncode == 0:
print("Commands still running")
print(proc.stdout)
sys.exit(1)