Skip to content

Commit 6809c05

Browse files
gchwiernashif
authored andcommitted
twister: quarantine: Added pytests
Implemented scenarios to test the quarantine in twister Signed-off-by: Grzegorz Chwierut <[email protected]>
1 parent bac1a95 commit 6809c05

File tree

7 files changed

+106
-0
lines changed

7 files changed

+106
-0
lines changed

scripts/pylib/twister/twisterlib/quarantine.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ def load_data_from_yaml(cls, filename: str | Path) -> QuarantineData:
8080
with open(filename, 'r', encoding='UTF-8') as yaml_fd:
8181
qlist_raw_data: list[dict] = safe_load(yaml_fd)
8282
try:
83+
if not qlist_raw_data:
84+
# in case of loading empty quarantine file
85+
return cls()
8386
return cls(qlist_raw_data)
8487

8588
except Exception as e:

scripts/pylib/twister/twisterlib/testplan.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,9 @@ def discover(self):
134134
logger.error("No quarantine list given to be verified")
135135
raise TwisterRuntimeError("No quarantine list given to be verified")
136136
if ql:
137+
for quarantine_file in ql:
138+
# validate quarantine yaml file against the provided schema
139+
scl.yaml_load_verify(quarantine_file, self.quarantine_schema)
137140
self.quarantine = Quarantine(ql)
138141

139142
def load(self):
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
- scenarios:
2+
- test_a.check_1
3+
platforms:
4+
- demo_board_1
5+
- demo_board_3
6+
comment: "a1 on board_1 and board_3"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# empty quarantine file
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
- platforms:
3+
- demo_board_3
4+
comment: "all on board_3"
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
- scenarios:
3+
- test_(a|c).check_2
4+
architectures:
5+
- x86.*
6+
comment: "a2 and c2 on x86"
7+
8+
- scenarios:
9+
- test_d.*
10+
comment: "all test_d"

scripts/tests/twister/test_testplan_class.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from twisterlib.testinstance import TestInstance
1818
from twisterlib.testsuite import TestSuite
1919
from twisterlib.platform import Platform
20+
from twisterlib.quarantine import Quarantine
2021

2122

2223
def test_testplan_add_testsuites(class_testplan):
@@ -256,3 +257,81 @@ def test_add_instances(test_data, class_env, all_testsuites_dict, platforms_list
256257
[platform.name + '/' + s for s in list(all_testsuites_dict.keys())]
257258
assert all(isinstance(n, TestInstance) for n in list(plan.instances.values()))
258259
assert list(plan.instances.values()) == instance_list
260+
261+
262+
QUARANTINE_BASIC = {
263+
'demo_board_1/zephyr/scripts/tests/twister/test_data/testsuites/tests/test_a/test_a.check_1' : 'a1 on board_1 and board_3',
264+
'demo_board_3/zephyr/scripts/tests/twister/test_data/testsuites/tests/test_a/test_a.check_1' : 'a1 on board_1 and board_3'
265+
}
266+
267+
QUARANTINE_WITH_REGEXP = {
268+
'demo_board_2/zephyr/scripts/tests/twister/test_data/testsuites/tests/test_a/test_a.check_2' : 'a2 and c2 on x86',
269+
'demo_board_1/zephyr/scripts/tests/twister/test_data/testsuites/tests/test_d/test_d.check_1' : 'all test_d',
270+
'demo_board_3/zephyr/scripts/tests/twister/test_data/testsuites/tests/test_d/test_d.check_1' : 'all test_d',
271+
'demo_board_2/zephyr/scripts/tests/twister/test_data/testsuites/tests/test_d/test_d.check_1' : 'all test_d',
272+
'demo_board_2/zephyr/scripts/tests/twister/test_data/testsuites/tests/test_c/test_c.check_2' : 'a2 and c2 on x86'
273+
}
274+
275+
QUARANTINE_PLATFORM = {
276+
'demo_board_3/zephyr/scripts/tests/twister/test_data/testsuites/tests/test_a/test_a.check_1' : 'all on board_3',
277+
'demo_board_3/zephyr/scripts/tests/twister/test_data/testsuites/tests/test_a/test_a.check_2' : 'all on board_3',
278+
'demo_board_3/zephyr/scripts/tests/twister/test_data/testsuites/tests/test_d/test_d.check_1' : 'all on board_3',
279+
'demo_board_3/zephyr/scripts/tests/twister/test_data/testsuites/tests/test_b/test_b.check_1' : 'all on board_3',
280+
'demo_board_3/zephyr/scripts/tests/twister/test_data/testsuites/tests/test_b/test_b.check_2' : 'all on board_3',
281+
'demo_board_3/zephyr/scripts/tests/twister/test_data/testsuites/tests/test_c/test_c.check_1' : 'all on board_3',
282+
'demo_board_3/zephyr/scripts/tests/twister/test_data/testsuites/tests/test_c/test_c.check_2' : 'all on board_3'
283+
}
284+
285+
QUARANTINE_MULTIFILES = {
286+
**QUARANTINE_BASIC,
287+
**QUARANTINE_WITH_REGEXP
288+
}
289+
290+
@pytest.mark.parametrize(
291+
("quarantine_files, quarantine_verify, expected_val"),
292+
[
293+
(['basic.yaml'], False, QUARANTINE_BASIC),
294+
(['with_regexp.yaml'], False, QUARANTINE_WITH_REGEXP),
295+
(['with_regexp.yaml'], True, QUARANTINE_WITH_REGEXP),
296+
(['platform.yaml'], False, QUARANTINE_PLATFORM),
297+
(['basic.yaml', 'with_regexp.yaml'], False, QUARANTINE_MULTIFILES),
298+
(['empty.yaml'], False, {})
299+
],
300+
ids=[
301+
'basic',
302+
'with_regexp',
303+
'quarantine_verify',
304+
'platform',
305+
'multifiles',
306+
'empty'
307+
])
308+
def test_quarantine(class_testplan, platforms_list, test_data,
309+
quarantine_files, quarantine_verify, expected_val):
310+
""" Testing quarantine feature in Twister
311+
"""
312+
class_testplan.options.all = True
313+
class_testplan.platforms = platforms_list
314+
class_testplan.platform_names = [p.name for p in platforms_list]
315+
class_testplan.TESTSUITE_FILENAME = 'test_data.yaml'
316+
class_testplan.add_testsuites()
317+
318+
quarantine_list = [
319+
os.path.join(test_data, 'quarantines', quarantine_file) for quarantine_file in quarantine_files
320+
]
321+
class_testplan.quarantine = Quarantine(quarantine_list)
322+
class_testplan.options.quarantine_verify = quarantine_verify
323+
class_testplan.apply_filters()
324+
325+
for testname, instance in class_testplan.instances.items():
326+
if quarantine_verify:
327+
if testname in expected_val:
328+
assert not instance.status
329+
else:
330+
assert instance.status == 'filtered'
331+
assert instance.reason == "Not under quarantine"
332+
else:
333+
if testname in expected_val:
334+
assert instance.status == 'filtered'
335+
assert instance.reason == expected_val[testname]
336+
else:
337+
assert not instance.status

0 commit comments

Comments
 (0)