# # Copyright (C) 2016 Intel Corporation # # SPDX-License-Identifier: MIT # from functools import wraps from abc import abstractmethod, ABCMeta from oeqa.core.utils.misc import strToList decoratorClasses = set() def registerDecorator(cls): decoratorClasses.add(cls) return cls class OETestDecorator(object, metaclass=ABCMeta): case = None # Reference of OETestCase decorated attrs = None # Attributes to be loaded by decorator implementation def __init__(self, *args, **kwargs): if not self.attrs: return for idx, attr in enumerate(self.attrs): if attr in kwargs: value = kwargs[attr] else: value = args[idx] setattr(self, attr, value) def __call__(self, func): @wraps(func) def wrapped_f(*args, **kwargs): self.attrs = self.attrs # XXX: Enables OETestLoader discover return func(*args, **kwargs) return wrapped_f # OETestLoader call it when is loading test cases. # XXX: Most methods would change the registry for later # processing; be aware that filtrate method needs to # run later than bind, so there could be data (in the # registry) of a cases that were filtered. def bind(self, registry, case): self.case = case self.logger = case.tc.logger self.case.decorators.append(self) # OETestRunner call this method when tries to run # the test case. def setUpDecorator(self): pass # OETestRunner call it after a test method has been # called even if the method raised an exception. def tearDownDecorator(self): pass class OETestDiscover(OETestDecorator): # OETestLoader call it after discover test cases # needs to return the cases to be run. @staticmethod def discover(registry): return registry['cases'] def OETestTag(*tags): expandedtags = [] for tag in tags: expandedtags += strToList(tag) def decorator(item): if hasattr(item, "__oeqa_testtags"): # do not append, create a new list (to handle classes with inheritance) item.__oeqa_testtags = list(item.__oeqa_testtags) + expandedtags else: item.__oeqa_testtags = expandedtags return item return decorator