diff options
Diffstat (limited to 'meta/lib/oeqa/core/loader.py')
-rw-r--r-- | meta/lib/oeqa/core/loader.py | 61 |
1 files changed, 17 insertions, 44 deletions
diff --git a/meta/lib/oeqa/core/loader.py b/meta/lib/oeqa/core/loader.py index 7fea0585c7..0d7970d49e 100644 --- a/meta/lib/oeqa/core/loader.py +++ b/meta/lib/oeqa/core/loader.py | |||
@@ -16,7 +16,7 @@ from oeqa.core.utils.test import getSuiteModules, getCaseID | |||
16 | from oeqa.core.exception import OEQATestNotFound | 16 | from oeqa.core.exception import OEQATestNotFound |
17 | from oeqa.core.case import OETestCase | 17 | from oeqa.core.case import OETestCase |
18 | from oeqa.core.decorator import decoratorClasses, OETestDecorator, \ | 18 | from oeqa.core.decorator import decoratorClasses, OETestDecorator, \ |
19 | OETestFilter, OETestDiscover | 19 | OETestDiscover |
20 | 20 | ||
21 | # When loading tests, the unittest framework stores any exceptions and | 21 | # When loading tests, the unittest framework stores any exceptions and |
22 | # displays them only when the run method is called. | 22 | # displays them only when the run method is called. |
@@ -68,7 +68,7 @@ class OETestLoader(unittest.TestLoader): | |||
68 | '_top_level_dir'] | 68 | '_top_level_dir'] |
69 | 69 | ||
70 | def __init__(self, tc, module_paths, modules, tests, modules_required, | 70 | def __init__(self, tc, module_paths, modules, tests, modules_required, |
71 | filters, *args, **kwargs): | 71 | *args, **kwargs): |
72 | self.tc = tc | 72 | self.tc = tc |
73 | 73 | ||
74 | self.modules = _built_modules_dict(modules) | 74 | self.modules = _built_modules_dict(modules) |
@@ -76,13 +76,7 @@ class OETestLoader(unittest.TestLoader): | |||
76 | self.tests = tests | 76 | self.tests = tests |
77 | self.modules_required = modules_required | 77 | self.modules_required = modules_required |
78 | 78 | ||
79 | self.filters = filters | 79 | self.tags_filter = kwargs.get("tags_filter", None) |
80 | self.decorator_filters = [d for d in decoratorClasses if \ | ||
81 | issubclass(d, OETestFilter)] | ||
82 | self._validateFilters(self.filters, self.decorator_filters) | ||
83 | self.used_filters = [d for d in self.decorator_filters | ||
84 | for f in self.filters | ||
85 | if f in d.attrs] | ||
86 | 80 | ||
87 | if isinstance(module_paths, str): | 81 | if isinstance(module_paths, str): |
88 | module_paths = [module_paths] | 82 | module_paths = [module_paths] |
@@ -104,28 +98,6 @@ class OETestLoader(unittest.TestLoader): | |||
104 | setattr(testCaseClass, 'td', self.tc.td) | 98 | setattr(testCaseClass, 'td', self.tc.td) |
105 | setattr(testCaseClass, 'logger', self.tc.logger) | 99 | setattr(testCaseClass, 'logger', self.tc.logger) |
106 | 100 | ||
107 | def _validateFilters(self, filters, decorator_filters): | ||
108 | # Validate if filter isn't empty | ||
109 | for key,value in filters.items(): | ||
110 | if not value: | ||
111 | raise TypeError("Filter %s specified is empty" % key) | ||
112 | |||
113 | # Validate unique attributes | ||
114 | attr_filters = [attr for clss in decorator_filters \ | ||
115 | for attr in clss.attrs] | ||
116 | dup_attr = [attr for attr in attr_filters | ||
117 | if attr_filters.count(attr) > 1] | ||
118 | if dup_attr: | ||
119 | raise TypeError('Detected duplicated attribute(s) %s in filter' | ||
120 | ' decorators' % ' ,'.join(dup_attr)) | ||
121 | |||
122 | # Validate if filter is supported | ||
123 | for f in filters: | ||
124 | if f not in attr_filters: | ||
125 | classes = ', '.join([d.__name__ for d in decorator_filters]) | ||
126 | raise TypeError('Found "%s" filter but not declared in any of ' | ||
127 | '%s decorators' % (f, classes)) | ||
128 | |||
129 | def _registerTestCase(self, case): | 101 | def _registerTestCase(self, case): |
130 | case_id = case.id() | 102 | case_id = case.id() |
131 | self.tc._registry['cases'][case_id] = case | 103 | self.tc._registry['cases'][case_id] = case |
@@ -188,19 +160,20 @@ class OETestLoader(unittest.TestLoader): | |||
188 | return True | 160 | return True |
189 | 161 | ||
190 | # Decorator filters | 162 | # Decorator filters |
191 | if self.filters and isinstance(case, OETestCase): | 163 | if self.tags_filter is not None and callable(self.tags_filter): |
192 | filters = self.filters.copy() | 164 | alltags = set() |
193 | case_decorators = [cd for cd in case.decorators | 165 | # pull tags from the case class |
194 | if cd.__class__ in self.used_filters] | 166 | if hasattr(case, "__oeqa_testtags"): |
195 | 167 | for t in getattr(case, "__oeqa_testtags"): | |
196 | # Iterate over case decorators to check if needs to be filtered. | 168 | alltags.add(t) |
197 | for cd in case_decorators: | 169 | # pull tags from the method itself |
198 | if cd.filtrate(filters): | 170 | if hasattr(case, test_name): |
199 | return True | 171 | method = getattr(case, test_name) |
200 | 172 | if hasattr(method, "__oeqa_testtags"): | |
201 | # Case is missing one or more decorators for all the filters | 173 | for t in getattr(method, "__oeqa_testtags"): |
202 | # being used, so filter test case. | 174 | alltags.add(t) |
203 | if filters: | 175 | |
176 | if self.tags_filter(alltags): | ||
204 | return True | 177 | return True |
205 | 178 | ||
206 | return False | 179 | return False |