forked from robotframework/robotframework
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_signalhandler.py
More file actions
128 lines (102 loc) · 4.39 KB
/
test_signalhandler.py
File metadata and controls
128 lines (102 loc) · 4.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import signal
import unittest
from threading import Thread
from robot.output import LOGGER
from robot.output.loggerhelper import AbstractLogger
from robot.utils.asserts import assert_equal
from robot.utils import JYTHON
from robot.running.signalhandler import _StopSignalMonitor
LOGGER.unregister_console_logger()
class LoggerStub(AbstractLogger):
def __init__(self):
AbstractLogger.__init__(self)
self.messages = []
def message(self, msg):
self.messages.append(msg)
class TestSignalHandlerRegisteringFailures(unittest.TestCase):
def setUp(self):
self.logger = LoggerStub()
LOGGER._message_cache = []
LOGGER.register_logger(self.logger)
self._orig_signal = signal.signal
def tearDown(self):
LOGGER.unregister_logger(self.logger)
signal.signal = self._orig_signal
def test_error_messages(self):
def raise_value_error(signum, handler):
raise ValueError("Got signal %d" % signum)
signal.signal = raise_value_error
_StopSignalMonitor().__enter__()
assert_equal(len(self.logger.messages), 2)
self._verify_warning(self.logger.messages[0], 'INT',
'Got signal %d' % signal.SIGINT)
self._verify_warning(self.logger.messages[1], 'TERM',
'Got signal %d' % signal.SIGTERM)
def _verify_warning(self, msg, signame, err):
ctrlc = 'or with Ctrl-C ' if signame == 'INT' else ''
assert_equal(msg.message,
'Registering signal %s failed. Stopping execution '
'gracefully with this signal %sis not possible. '
'Original error was: %s' % (signame, ctrlc, err))
assert_equal(msg.level, 'WARN')
def test_failure_but_no_warning_when_not_in_main_thread(self):
t = Thread(target=_StopSignalMonitor().__enter__)
t.start()
t.join()
assert_equal(len(self.logger.messages), 0)
if JYTHON:
# signal.signal may raise IllegalArgumentException on Jython:
# http://bugs.jython.org/issue1729
def test_illegal_argument_exception(self):
from java.lang import IllegalArgumentException
def raise_iae_for_sigint(signum, handler):
if signum == signal.SIGINT:
raise IllegalArgumentException('xxx')
signal.signal = raise_iae_for_sigint
_StopSignalMonitor().__enter__()
assert_equal(len(self.logger.messages), 1)
self._verify_warning(self.logger.messages[0], 'INT',
'java.lang.IllegalArgumentException: xxx')
class TestRestoringOriginalHandlers(unittest.TestCase):
def get_int(self):
return signal.getsignal(signal.SIGINT)
def get_term(self):
return signal.getsignal(signal.SIGTERM)
def setUp(self):
self.orig_int = self.get_int()
self.orig_term = self.get_term()
def tearDown(self):
signal.signal(signal.SIGINT, self.orig_int)
signal.signal(signal.SIGTERM, self.orig_term)
def test_restore_when_no_failures(self):
with _StopSignalMonitor() as monitor:
assert_equal(self.get_int(), monitor)
assert_equal(self.get_term(), monitor)
assert_equal(self.get_int(), self.orig_int)
assert_equal(self.get_term(), self.orig_term)
def test_restore_when_failure(self):
try:
with _StopSignalMonitor() as monitor:
assert_equal(self.get_int(), monitor)
assert_equal(self.get_term(), monitor)
raise ZeroDivisionError
except ZeroDivisionError:
pass
else:
raise AssertionError
assert_equal(self.get_int(), self.orig_int)
assert_equal(self.get_term(), self.orig_term)
def test_registered_outside_python(self):
"""
If a signal isn't registered within Python, signal.getsignal() returns None.
This tests to make sure _StopSignalMonitor.__exit__ can handle that.
"""
with _StopSignalMonitor() as monitor:
assert_equal(self.get_int(), monitor)
assert_equal(self.get_term(), monitor)
monitor._orig_sigint = None
monitor._orig_sigterm = None
assert_equal(self.get_int(), signal.SIG_DFL)
assert_equal(self.get_term(), signal.SIG_DFL)
if __name__ == '__main__':
unittest.main()