From d8eb9d41b0afb48f98dc59383cf886c8ca53c21a Mon Sep 17 00:00:00 2001 From: Lucian Musat Date: Tue, 15 Sep 2015 18:11:59 +0300 Subject: 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 Signed-off-by: Richard Purdie --- meta/lib/oeqa/utils/decorators.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'meta/lib/oeqa/utils/decorators.py') 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): ret = __gettags(obj) ret.update(__gettags(tc_method)) return ret + +def timeout_handler(seconds): + def decorator(fn): + if hasattr(signal, 'alarm'): + @wraps(fn) + def wrapped_f(self, *args, **kw): + current_frame = sys._getframe() + def raiseTimeOut(signal, frame): + if frame is not current_frame: + try: + self.target.restart() + raise TimeOut('%s seconds' % seconds) + except: + raise TimeOut('%s seconds' % seconds) + prev_handler = signal.signal(signal.SIGALRM, raiseTimeOut) + try: + signal.alarm(seconds) + return fn(self, *args, **kw) + finally: + signal.alarm(0) + signal.signal(signal.SIGALRM, prev_handler) + return wrapped_f + else: + return fn + return decorator -- cgit 1.2.3-korg