diff options
author | Lucian Musat <george.l.musat@intel.com> | 2015-09-15 18:11:59 +0300 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2015-09-18 09:05:21 +0100 |
commit | d8eb9d41b0afb48f98dc59383cf886c8ca53c21a (patch) | |
tree | 36f2ee6a2ce7c302c16b74ccd167baea2b9bd74f | |
parent | 5acf99d1afc7efa962e4e698cc09a7f08133a64e (diff) | |
download | poky-d8eb9d41b0afb48f98dc59383cf886c8ca53c21a.tar.gz |
oeqa/decorators: Added decorator to restart the DUT in case of test hang.
Once the DUT is hanged during testing, currently all the following test
cases have to wait for default timeout to exit. Using this decorator the
user can choose a timeout at case by case basis and what happens when the
timeout is reached by overwriting the self.target.restart method.
[YOCTO #7853]
(From OE-Core rev: ce9a7501ea29ddba61ef7c297223b3f7eca5a2a1)
Signed-off-by: Lucian Musat <george.l.musat@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | meta/lib/oeqa/oetest.py | 6 | ||||
-rw-r--r-- | meta/lib/oeqa/utils/decorators.py | 25 |
2 files changed, 31 insertions, 0 deletions
diff --git a/meta/lib/oeqa/oetest.py b/meta/lib/oeqa/oetest.py index 0fe68d4d52..a6f89b6a86 100644 --- a/meta/lib/oeqa/oetest.py +++ b/meta/lib/oeqa/oetest.py | |||
@@ -151,6 +151,12 @@ class oeRuntimeTest(oeTest): | |||
151 | elif (type(self.target).__name__ == "QemuTarget"): | 151 | elif (type(self.target).__name__ == "QemuTarget"): |
152 | self.assertTrue(self.target.check(), msg = "Qemu not running?") | 152 | self.assertTrue(self.target.check(), msg = "Qemu not running?") |
153 | 153 | ||
154 | self.setUpLocal() | ||
155 | |||
156 | # a setup method before tests but after the class instantiation | ||
157 | def setUpLocal(self): | ||
158 | pass | ||
159 | |||
154 | def tearDown(self): | 160 | def tearDown(self): |
155 | # If a test fails or there is an exception | 161 | # If a test fails or there is an exception |
156 | if not exc_info() == (None, None, None): | 162 | if not exc_info() == (None, None, None): |
diff --git a/meta/lib/oeqa/utils/decorators.py b/meta/lib/oeqa/utils/decorators.py index 162a88fb78..b6adcb1846 100644 --- a/meta/lib/oeqa/utils/decorators.py +++ b/meta/lib/oeqa/utils/decorators.py | |||
@@ -220,3 +220,28 @@ def getAllTags(obj): | |||
220 | ret = __gettags(obj) | 220 | ret = __gettags(obj) |
221 | ret.update(__gettags(tc_method)) | 221 | ret.update(__gettags(tc_method)) |
222 | return ret | 222 | return ret |
223 | |||
224 | def timeout_handler(seconds): | ||
225 | def decorator(fn): | ||
226 | if hasattr(signal, 'alarm'): | ||
227 | @wraps(fn) | ||
228 | def wrapped_f(self, *args, **kw): | ||
229 | current_frame = sys._getframe() | ||
230 | def raiseTimeOut(signal, frame): | ||
231 | if frame is not current_frame: | ||
232 | try: | ||
233 | self.target.restart() | ||
234 | raise TimeOut('%s seconds' % seconds) | ||
235 | except: | ||
236 | raise TimeOut('%s seconds' % seconds) | ||
237 | prev_handler = signal.signal(signal.SIGALRM, raiseTimeOut) | ||
238 | try: | ||
239 | signal.alarm(seconds) | ||
240 | return fn(self, *args, **kw) | ||
241 | finally: | ||
242 | signal.alarm(0) | ||
243 | signal.signal(signal.SIGALRM, prev_handler) | ||
244 | return wrapped_f | ||
245 | else: | ||
246 | return fn | ||
247 | return decorator | ||