def test_shell_background_support_setsid(): """In setsid mode, dumb-init should suspend itself and its children when it receives SIGTSTP, SIGTTOU, or SIGTTIN. """ with print_signals() as (proc, pid): for signum in SUSPEND_SIGNALS: # both dumb-init and print_signals should be running or sleeping assert process_state(pid) in ['running', 'sleeping'] assert process_state(proc.pid) in ['running', 'sleeping'] # both should now suspend proc.send_signal(signum) def assert_both_stopped(): assert process_state( proc.pid) == process_state(pid) == 'stopped' sleep_until(assert_both_stopped) # and then both wake up again proc.send_signal(SIGCONT) assert (proc.stdout.readline() == '{}\n'.format(SIGCONT).encode( 'ascii')) assert process_state(pid) in ['running', 'sleeping'] assert process_state(proc.pid) in ['running', 'sleeping']
def test_proxies_signals(): """Ensure dumb-init proxies regular signals to its child.""" with print_signals() as (proc, _): for signum in NORMAL_SIGNALS: proc.send_signal(signum) assert proc.stdout.readline() == '{}\n'.format(signum).encode( 'ascii')
def test_proxies_signals_with_rewrite(rewrite_map, sequence, expected): """Ensure dumb-init can rewrite signals.""" with print_signals(_rewrite_map_to_args(rewrite_map)) as (proc, _): for send, expect_receive in zip(sequence, expected): proc.send_signal(send) assert proc.stdout.readline() == '{}\n'.format( expect_receive).encode('ascii')
def test_shell_background_support_setsid(): """In setsid mode, dumb-init should suspend itself and its children when it receives SIGTSTP, SIGTTOU, or SIGTTIN. """ with print_signals() as (proc, pid): for signum in SUSPEND_SIGNALS: # both dumb-init and print_signals should be running or sleeping assert process_state(pid) in ['running', 'sleeping'] assert process_state(proc.pid) in ['running', 'sleeping'] # both should now suspend proc.send_signal(signum) for _ in range(1000): time.sleep(0.001) try: assert process_state(proc.pid) == 'stopped' assert process_state(pid) == 'stopped' except AssertionError: pass else: break else: raise RuntimeError('Timed out waiting for processes to stop.') # and then both wake up again proc.send_signal(SIGCONT) assert ( proc.stdout.readline() == '{0}\n'.format(SIGCONT).encode('ascii') ) assert process_state(pid) in ['running', 'sleeping'] assert process_state(proc.pid) in ['running', 'sleeping']
def test_shell_background_support_setsid(): """In setsid mode, dumb-init should suspend itself and its children when it receives SIGTSTP, SIGTTOU, or SIGTTIN. """ with print_signals() as (proc, pid): for signum in SUSPEND_SIGNALS: # both dumb-init and print_signals should be running or sleeping assert process_state(pid) in ['running', 'sleeping'] assert process_state(proc.pid) in ['running', 'sleeping'] # both should now suspend proc.send_signal(signum) def assert_both_stopped(): assert process_state(proc.pid) == process_state(pid) == 'stopped' sleep_until(assert_both_stopped) # and then both wake up again proc.send_signal(SIGCONT) assert ( proc.stdout.readline() == '{0}\n'.format(SIGCONT).encode('ascii') ) assert process_state(pid) in ['running', 'sleeping'] assert process_state(proc.pid) in ['running', 'sleeping']
def test_ignored_signals_are_not_proxied(): """Ensure dumb-init can ignore signals.""" rewrite_map = {signal.SIGTERM: signal.SIGQUIT, signal.SIGINT: 0, signal.SIGWINCH: 0} with print_signals(_rewrite_map_to_args(rewrite_map)) as (proc, _): proc.send_signal(signal.SIGTERM) proc.send_signal(signal.SIGINT) assert proc.stdout.readline() == "{0}\n".format(signal.SIGQUIT).encode("ascii") proc.send_signal(signal.SIGWINCH) proc.send_signal(signal.SIGHUP) assert proc.stdout.readline() == "{0}\n".format(signal.SIGHUP).encode("ascii")
def test_ignored_signals_are_not_proxied(): """Ensure dumb-init can ignore signals.""" rewrite_map = { signal.SIGTERM: signal.SIGQUIT, signal.SIGINT: 0, signal.SIGWINCH: 0, } with print_signals(_rewrite_map_to_args(rewrite_map)) as (proc, _): proc.send_signal(signal.SIGTERM) proc.send_signal(signal.SIGINT) assert proc.stdout.readline() == '{0}\n'.format(signal.SIGQUIT).encode('ascii') proc.send_signal(signal.SIGWINCH) proc.send_signal(signal.SIGHUP) assert proc.stdout.readline() == '{0}\n'.format(signal.SIGHUP).encode('ascii')
def test_shell_background_support_without_setsid(): """In non-setsid mode, dumb-init should forward the signals SIGTSTP, SIGTTOU, and SIGTTIN, and then suspend itself. """ with print_signals() as (proc, _): for signum in SUSPEND_SIGNALS: assert process_state(proc.pid) in ['running', 'sleeping'] proc.send_signal(signum) assert proc.stdout.readline() == '{}\n'.format(signum).encode( 'ascii') os.waitpid(proc.pid, os.WUNTRACED) assert process_state(proc.pid) == 'stopped' proc.send_signal(SIGCONT) assert (proc.stdout.readline() == '{}\n'.format(SIGCONT).encode( 'ascii')) assert process_state(proc.pid) in ['running', 'sleeping']
def test_default_rewrites_can_be_overriden_with_setsid_enabled(): """In setsid mode, dumb-init should allow overwriting the default rewrites (but still suspend itself). """ rewrite_map = {signal.SIGTTIN: signal.SIGTERM, signal.SIGTTOU: signal.SIGINT, signal.SIGTSTP: signal.SIGHUP} with print_signals(_rewrite_map_to_args(rewrite_map)) as (proc, _): for send, expect_receive in rewrite_map.items(): assert process_state(proc.pid) in ["running", "sleeping"] proc.send_signal(send) assert proc.stdout.readline() == "{0}\n".format(expect_receive).encode("ascii") os.waitpid(proc.pid, os.WUNTRACED) assert process_state(proc.pid) == "stopped" proc.send_signal(signal.SIGCONT) assert proc.stdout.readline() == "{0}\n".format(signal.SIGCONT).encode("ascii") assert process_state(proc.pid) in ["running", "sleeping"]
def test_shell_background_support_without_setsid(): """In non-setsid mode, dumb-init should forward the signals SIGTSTP, SIGTTOU, and SIGTTIN, and then suspend itself. """ with print_signals() as (proc, _): for signum in SUSPEND_SIGNALS: assert process_state(proc.pid) in ['running', 'sleeping'] proc.send_signal(signum) assert proc.stdout.readline() == '{0}\n'.format(signum).encode('ascii') os.waitpid(proc.pid, os.WUNTRACED) assert process_state(proc.pid) == 'stopped' proc.send_signal(SIGCONT) assert ( proc.stdout.readline() == '{0}\n'.format(SIGCONT).encode('ascii') ) assert process_state(proc.pid) in ['running', 'sleeping']
def test_default_rewrites_can_be_overriden_with_setsid_enabled(): """In setsid mode, dumb-init should allow overwriting the default rewrites (but still suspend itself). """ rewrite_map = { signal.SIGTTIN: signal.SIGTERM, signal.SIGTTOU: signal.SIGINT, signal.SIGTSTP: signal.SIGHUP, } with print_signals(_rewrite_map_to_args(rewrite_map)) as (proc, _): for send, expect_receive in rewrite_map.items(): assert process_state(proc.pid) in ['running', 'sleeping'] proc.send_signal(send) assert proc.stdout.readline() == '{0}\n'.format(expect_receive).encode('ascii') os.waitpid(proc.pid, os.WUNTRACED) assert process_state(proc.pid) == 'stopped' proc.send_signal(signal.SIGCONT) assert proc.stdout.readline() == '{0}\n'.format(signal.SIGCONT).encode('ascii') assert process_state(proc.pid) in ['running', 'sleeping']
def test_proxies_signals_with_rewrite(rewrite_map, sequence, expected): """Ensure dumb-init can rewrite signals.""" with print_signals(_rewrite_map_to_args(rewrite_map)) as (proc, _): for send, expect_receive in zip(sequence, expected): proc.send_signal(send) assert proc.stdout.readline() == "{0}\n".format(expect_receive).encode("ascii")
def test_proxies_signals(): """Ensure dumb-init proxies regular signals to its child.""" with print_signals() as (proc, _): for signum in NORMAL_SIGNALS: proc.send_signal(signum) assert proc.stdout.readline() == "{0}\n".format(signum).encode("ascii")