test_signals.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import pytest
  2. from flexmock import flexmock
  3. from borgmatic import signals as module
  4. def test_handle_signal_forwards_to_subprocesses():
  5. signal_number = 100
  6. frame = flexmock(f_back=flexmock(f_code=flexmock(co_name='something')))
  7. process_group = flexmock()
  8. flexmock(module.os).should_receive('getpgrp').and_return(process_group)
  9. flexmock(module.os).should_receive('killpg').with_args(process_group, signal_number).once()
  10. module.handle_signal(signal_number, frame)
  11. def test_handle_signal_bails_on_recursion():
  12. signal_number = 100
  13. frame = flexmock(f_back=flexmock(f_code=flexmock(co_name='handle_signal')))
  14. flexmock(module.os).should_receive('getpgrp').never()
  15. flexmock(module.os).should_receive('killpg').never()
  16. module.handle_signal(signal_number, frame)
  17. def test_handle_signal_exits_on_sigterm():
  18. signal_number = module.signal.SIGTERM
  19. frame = flexmock(f_back=flexmock(f_code=flexmock(co_name='something')))
  20. flexmock(module.os).should_receive('getpgrp').and_return(flexmock())
  21. flexmock(module.os).should_receive('killpg')
  22. flexmock(module.sys).should_receive('exit').with_args(
  23. module.EXIT_CODE_FROM_SIGNAL + signal_number
  24. ).once()
  25. module.handle_signal(signal_number, frame)
  26. def test_handle_signal_raises_on_sigint():
  27. signal_number = module.signal.SIGINT
  28. frame = flexmock(f_back=flexmock(f_code=flexmock(co_name='something')))
  29. process_group = flexmock()
  30. flexmock(module.os).should_receive('getpgrp').and_return(process_group)
  31. flexmock(module.os).should_receive('killpg').with_args(process_group, module.signal.SIGINT)
  32. flexmock(module.os).should_receive('killpg').with_args(process_group, module.signal.SIGTERM)
  33. flexmock(module.sys).should_receive('exit').never()
  34. with pytest.raises(KeyboardInterrupt):
  35. module.handle_signal(signal_number, frame)
  36. def test_configure_signals_installs_signal_handlers():
  37. flexmock(module.signal).should_receive('signal').at_least().once()
  38. module.configure_signals()