diff options
| -rw-r--r-- | meta/classes/testimage.bbclass | 3 | ||||
| -rw-r--r-- | meta/lib/oeqa/oetest.py | 28 | ||||
| -rw-r--r-- | meta/lib/oeqa/utils/decorators.py | 34 | 
3 files changed, 63 insertions, 2 deletions
| diff --git a/meta/classes/testimage.bbclass b/meta/classes/testimage.bbclass index 8fa00f5fbf..7c783ea065 100644 --- a/meta/classes/testimage.bbclass +++ b/meta/classes/testimage.bbclass @@ -253,6 +253,8 @@ def testimage_main(d):      testslist = get_tests_list(d)      testsrequired = [t for t in d.getVar("TEST_SUITES", True).split() if t != "auto"] +    tagexp = d.getVar("TEST_SUITES_TAGS", True) +      # we need the host dumper in test context      host_dumper = get_host_dumper(d) @@ -263,6 +265,7 @@ def testimage_main(d):          def __init__(self):              self.d = d              self.testslist = testslist +            self.tagexp = tagexp              self.testsrequired = testsrequired              self.filesdir = os.path.join(os.path.dirname(os.path.abspath(oeqa.runtime.__file__)),"files")              self.target = target diff --git a/meta/lib/oeqa/oetest.py b/meta/lib/oeqa/oetest.py index 4773bdd4d8..9724325083 100644 --- a/meta/lib/oeqa/oetest.py +++ b/meta/lib/oeqa/oetest.py @@ -12,9 +12,32 @@ import unittest  import inspect  import subprocess  import bb -from oeqa.utils.decorators import LogResults +from oeqa.utils.decorators import LogResults, gettag  from sys import exc_info, exc_clear +def getVar(obj): +    #extend form dict, if a variable didn't exists, need find it in testcase +    class VarDict(dict): +        def __getitem__(self, key): +            return gettag(obj, key) +    return VarDict() + +def checkTags(tc, tagexp): +    return eval(tagexp, None, getVar(tc)) + + +def filterByTagExp(testsuite, tagexp): +    if not tagexp: +        return testsuite +    caseList = [] +    for each in testsuite: +        if not isinstance(each, unittest.BaseTestSuite): +            if checkTags(each, tagexp): +                caseList.append(each) +        else: +            caseList.append(filterByTagExp(each, tagexp)) +    return testsuite.__class__(caseList) +  def loadTests(tc, type="runtime"):      if type == "runtime":          # set the context object passed from the test class @@ -29,6 +52,7 @@ def loadTests(tc, type="runtime"):      testloader = unittest.TestLoader()      testloader.sortTestMethodsUsing = None      suites = [testloader.loadTestsFromName(name) for name in tc.testslist] +    suites = filterByTagExp(suites, getattr(tc, "tagexp", None))      def getTests(test):          '''Return all individual tests executed when running the suite.''' @@ -86,6 +110,8 @@ def runTests(tc, type="runtime"):      suite = loadTests(tc, type)      bb.note("Test modules  %s" % tc.testslist) +    if hasattr(tc, "tagexp") and tc.tagexp: +        bb.note("Filter test cases by tags: %s" % tc.tagexp)      bb.note("Found %s tests" % suite.countTestCases())      runner = unittest.TextTestRunner(verbosity=2)      result = runner.run(suite) diff --git a/meta/lib/oeqa/utils/decorators.py b/meta/lib/oeqa/utils/decorators.py index b9fc76c9ee..769b4fffdd 100644 --- a/meta/lib/oeqa/utils/decorators.py +++ b/meta/lib/oeqa/utils/decorators.py @@ -185,4 +185,36 @@ def timeout(seconds):              return wrapped_f          else:              return fn -    return decorator
\ No newline at end of file +    return decorator + +__tag_prefix = "tag__" +def tag(*args, **kwargs): +    """Decorator that adds attributes to classes or functions +    for use with the Attribute (-a) plugin. +    """ +    def wrap_ob(ob): +        for name in args: +            setattr(ob, __tag_prefix + name, True) +        for name, value in kwargs.iteritems(): +            setattr(ob, __tag_prefix + name, value) +        return ob +    return wrap_ob + +def gettag(obj, key, default=None): +    key = __tag_prefix + key +    if not isinstance(obj, unittest.TestCase): +        return getattr(obj, key, default) +    tc_method = getattr(obj, obj._testMethodName) +    ret = getattr(tc_method, key, getattr(obj, key, default)) +    return ret + +def getAllTags(obj): +    def __gettags(o): +        r = {k[len(__tag_prefix):]:getattr(o,k) for k in dir(o) if k.startswith(__tag_prefix)} +        return r +    if not isinstance(obj, unittest.TestCase): +        return __gettags(obj) +    tc_method = getattr(obj, obj._testMethodName) +    ret = __gettags(obj) +    ret.update(__gettags(tc_method)) +    return ret | 
