]> code.ossystems Code Review - openembedded-core.git/commitdiff
oeqa/utils: Added timeout decorator for testcases.
authorLucian Musat <george.l.musat@intel.com>
Wed, 10 Jun 2015 10:52:40 +0000 (13:52 +0300)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Thu, 11 Jun 2015 22:56:30 +0000 (23:56 +0100)
Signed-off-by: Lucian Musat <george.l.musat@intel.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
meta/lib/oeqa/utils/decorators.py

index 61a1a739eae0c6731114b18f1e5a4de0b5bd6f7c..b9fc76c9ee0038d87ce7b12738eb61242855e283 100644 (file)
@@ -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