dumb-init/tests/child_processes_test.py

52 lines
1.2 KiB
Python
Raw Normal View History

2015-09-12 01:57:22 +03:00
import os
import signal
import time
from subprocess import Popen
from tests.lib.testing import is_alive
from tests.lib.testing import pid_tree
def spawn_and_kill_pipeline():
proc = Popen((
'dumb-init',
'sh', '-c',
"yes 'oh, hi' | tail & yes error | tail >&2"
))
time.sleep(0.1)
pids = pid_tree(os.getpid())
assert len(living_pids(pids)) == 6
proc.send_signal(signal.SIGTERM)
proc.wait()
time.sleep(0.1)
return pids
def living_pids(pids):
return {pid for pid in pids if is_alive(pid)}
def test_setsid_signals_entire_group(both_debug_modes):
"""When dumb-init is running in setsid mode, it should only signal the
entire process group rooted at it.
"""
os.environ['DUMB_INIT_SETSID'] = '1'
pids = spawn_and_kill_pipeline()
assert len(living_pids(pids)) == 0
def test_no_setsid_doesnt_signal_entire_group(both_debug_modes):
"""When dumb-init is not running in setsid mode, it should only signal its
immediate child.
"""
os.environ['DUMB_INIT_SETSID'] = '0'
pids = spawn_and_kill_pipeline()
living = living_pids(pids)
assert len(living) == 4
for pid in living:
os.kill(pid, signal.SIGKILL)