diff options
| -rw-r--r-- | meta/lib/oeqa/oetest.py | 17 | ||||
| -rw-r--r-- | meta/lib/oeqa/utils/decorators.py | 40 |
2 files changed, 34 insertions, 23 deletions
diff --git a/meta/lib/oeqa/oetest.py b/meta/lib/oeqa/oetest.py index 0db6cb80a9..ecb8e53705 100644 --- a/meta/lib/oeqa/oetest.py +++ b/meta/lib/oeqa/oetest.py | |||
| @@ -11,7 +11,6 @@ import os, re, mmap | |||
| 11 | import unittest | 11 | import unittest |
| 12 | import inspect | 12 | import inspect |
| 13 | 13 | ||
| 14 | |||
| 15 | def loadTests(tc): | 14 | def loadTests(tc): |
| 16 | 15 | ||
| 17 | # set the context object passed from the test class | 16 | # set the context object passed from the test class |
| @@ -36,24 +35,9 @@ def runTests(tc): | |||
| 36 | 35 | ||
| 37 | return result | 36 | return result |
| 38 | 37 | ||
| 39 | |||
| 40 | class oeTest(unittest.TestCase): | 38 | class oeTest(unittest.TestCase): |
| 41 | 39 | ||
| 42 | longMessage = True | 40 | longMessage = True |
| 43 | testFailures = [] | ||
| 44 | testSkipped = [] | ||
| 45 | testErrors = [] | ||
| 46 | |||
| 47 | def run(self, result=None): | ||
| 48 | super(oeTest, self).run(result) | ||
| 49 | |||
| 50 | # we add to our own lists the results, we use those for decorators | ||
| 51 | if len(result.failures) > len(oeTest.testFailures): | ||
| 52 | oeTest.testFailures.append(str(result.failures[-1][0]).split()[0]) | ||
| 53 | if len(result.skipped) > len(oeTest.testSkipped): | ||
| 54 | oeTest.testSkipped.append(str(result.skipped[-1][0]).split()[0]) | ||
| 55 | if len(result.errors) > len(oeTest.testErrors): | ||
| 56 | oeTest.testErrors.append(str(result.errors[-1][0]).split()[0]) | ||
| 57 | 41 | ||
| 58 | @classmethod | 42 | @classmethod |
| 59 | def hasPackage(self, pkg): | 43 | def hasPackage(self, pkg): |
| @@ -71,7 +55,6 @@ class oeTest(unittest.TestCase): | |||
| 71 | else: | 55 | else: |
| 72 | return False | 56 | return False |
| 73 | 57 | ||
| 74 | |||
| 75 | class oeRuntimeTest(oeTest): | 58 | class oeRuntimeTest(oeTest): |
| 76 | 59 | ||
| 77 | def __init__(self, methodName='runTest'): | 60 | def __init__(self, methodName='runTest'): |
diff --git a/meta/lib/oeqa/utils/decorators.py b/meta/lib/oeqa/utils/decorators.py index a0d94e6d24..439e80a42b 100644 --- a/meta/lib/oeqa/utils/decorators.py +++ b/meta/lib/oeqa/utils/decorators.py | |||
| @@ -6,9 +6,34 @@ | |||
| 6 | # Most useful is skipUnlessPassed which can be used for | 6 | # Most useful is skipUnlessPassed which can be used for |
| 7 | # creating dependecies between two test methods. | 7 | # creating dependecies between two test methods. |
| 8 | 8 | ||
| 9 | from oeqa.oetest import * | ||
| 10 | import logging | 9 | import logging |
| 11 | import sys | 10 | import sys |
| 11 | import unittest | ||
| 12 | |||
| 13 | #get the "result" object from one of the upper frames provided that one of these upper frames is a unittest.case frame | ||
| 14 | class getResults(object): | ||
| 15 | def __init__(self): | ||
| 16 | #dynamically determine the unittest.case frame and use it to get the name of the test method | ||
| 17 | upperf = sys._current_frames().values()[0] | ||
| 18 | while (upperf.f_globals['__name__'] != 'unittest.case'): | ||
| 19 | upperf = upperf.f_back | ||
| 20 | self.faillist = [ seq[0]._testMethodName for seq in upperf.f_locals['result'].failures ] | ||
| 21 | self.errorlist = [ seq[0]._testMethodName for seq in upperf.f_locals['result'].errors ] | ||
| 22 | #ignore the _ErrorHolder objects from the skipped tests list | ||
| 23 | self.skiplist = [] | ||
| 24 | for seq in upperf.f_locals['result'].skipped: | ||
| 25 | try: | ||
| 26 | self.skiplist.append(seq[0]._testMethodName) | ||
| 27 | except: pass | ||
| 28 | |||
| 29 | def getFailList(self): | ||
| 30 | return self.faillist | ||
| 31 | |||
| 32 | def getErrorList(self): | ||
| 33 | return self.errorlist | ||
| 34 | |||
| 35 | def getSkipList(self): | ||
| 36 | return self.skiplist | ||
| 12 | 37 | ||
| 13 | class skipIfFailure(object): | 38 | class skipIfFailure(object): |
| 14 | 39 | ||
| @@ -17,7 +42,8 @@ class skipIfFailure(object): | |||
| 17 | 42 | ||
| 18 | def __call__(self,f): | 43 | def __call__(self,f): |
| 19 | def wrapped_f(*args): | 44 | def wrapped_f(*args): |
| 20 | if self.testcase in (oeTest.testFailures or oeTest.testErrors): | 45 | res = getResults() |
| 46 | if self.testcase in (res.getFailList() or res.getErrorList()): | ||
| 21 | raise unittest.SkipTest("Testcase dependency not met: %s" % self.testcase) | 47 | raise unittest.SkipTest("Testcase dependency not met: %s" % self.testcase) |
| 22 | return f(*args) | 48 | return f(*args) |
| 23 | wrapped_f.__name__ = f.__name__ | 49 | wrapped_f.__name__ = f.__name__ |
| @@ -30,7 +56,8 @@ class skipIfSkipped(object): | |||
| 30 | 56 | ||
| 31 | def __call__(self,f): | 57 | def __call__(self,f): |
| 32 | def wrapped_f(*args): | 58 | def wrapped_f(*args): |
| 33 | if self.testcase in oeTest.testSkipped: | 59 | res = getResults() |
| 60 | if self.testcase in res.getSkipList(): | ||
| 34 | raise unittest.SkipTest("Testcase dependency not met: %s" % self.testcase) | 61 | raise unittest.SkipTest("Testcase dependency not met: %s" % self.testcase) |
| 35 | return f(*args) | 62 | return f(*args) |
| 36 | wrapped_f.__name__ = f.__name__ | 63 | wrapped_f.__name__ = f.__name__ |
| @@ -43,9 +70,10 @@ class skipUnlessPassed(object): | |||
| 43 | 70 | ||
| 44 | def __call__(self,f): | 71 | def __call__(self,f): |
| 45 | def wrapped_f(*args): | 72 | def wrapped_f(*args): |
| 46 | if self.testcase in oeTest.testSkipped or \ | 73 | res = getResults() |
| 47 | self.testcase in oeTest.testFailures or \ | 74 | if self.testcase in res.getSkipList() or \ |
| 48 | self.testcase in oeTest.testErrors: | 75 | self.testcase in res.getFailList() or \ |
| 76 | self.testcase in res.getErrorList(): | ||
| 49 | raise unittest.SkipTest("Testcase dependency not met: %s" % self.testcase) | 77 | raise unittest.SkipTest("Testcase dependency not met: %s" % self.testcase) |
| 50 | return f(*args) | 78 | return f(*args) |
| 51 | wrapped_f.__name__ = f.__name__ | 79 | wrapped_f.__name__ = f.__name__ |
