aboutsummaryrefslogtreecommitdiffstats
path: root/meta/lib/oeqa/utils/decorators.py
diff options
context:
space:
mode:
authorLucian Musat <george.l.musat@intel.com>2015-06-10 13:52:40 +0300
committerRichard Purdie <richard.purdie@linuxfoundation.org>2015-06-11 23:56:30 +0100
commitc6fe26ade5734efb5250e00c56fdbb4095b0018b (patch)
treefc17316df87c90e464e112321d3fb7cc4fbfdc3a /meta/lib/oeqa/utils/decorators.py
parent8670b99b06ce14ed391b4713d7887af90d44a2c8 (diff)
downloadopenembedded-core-contrib-c6fe26ade5734efb5250e00c56fdbb4095b0018b.tar.gz
oeqa/utils: Added timeout decorator for testcases.
Signed-off-by: Lucian Musat <george.l.musat@intel.com> Signed-off-by: Ross Burton <ross.burton@intel.com>
Diffstat (limited to 'meta/lib/oeqa/utils/decorators.py')
-rw-r--r--meta/lib/oeqa/utils/decorators.py26
1 files changed, 26 insertions, 0 deletions
diff --git a/meta/lib/oeqa/utils/decorators.py b/meta/lib/oeqa/utils/decorators.py
index 61a1a739ea..b9fc76c9ee 100644
--- a/meta/lib/oeqa/utils/decorators.py
+++ b/meta/lib/oeqa/utils/decorators.py
@@ -11,6 +11,8 @@ import logging
import sys
import unittest
import threading
+import signal
+from functools import wraps
#get the "result" object from one of the upper frames provided that one of these upper frames is a unittest.case frame
class getResults(object):
@@ -160,3 +162,27 @@ def LogResults(original_class):
original_class.run = run
return original_class
+
+class TimeOut(BaseException):
+ pass
+
+def timeout(seconds):
+ def decorator(fn):
+ if hasattr(signal, 'alarm'):
+ @wraps(fn)
+ def wrapped_f(*args, **kw):
+ current_frame = sys._getframe()
+ def raiseTimeOut(signal, frame):
+ if frame is not current_frame:
+ raise TimeOut('%s seconds' % seconds)
+ prev_handler = signal.signal(signal.SIGALRM, raiseTimeOut)
+ try:
+ signal.alarm(seconds)
+ return fn(*args, **kw)
+ finally:
+ signal.alarm(0)
+ signal.signal(signal.SIGALRM, prev_handler)
+ return wrapped_f
+ else:
+ return fn
+ return decorator \ No newline at end of file