From d557d248f363ba5b8d498ffd9931379208965167 Mon Sep 17 00:00:00 2001 From: Valerij Maljulin Date: Jan 06 2021 21:45:29 +0000 Subject: Add a support for the 'scenario' field in waivers --- diff --git a/greenwave/decision.py b/greenwave/decision.py index 52296a4..c241483 100644 --- a/greenwave/decision.py +++ b/greenwave/decision.py @@ -169,6 +169,7 @@ def make_decision(data, config): subject_identifier=answer.subject.identifier, product_version=product_version, testcase=answer.test_case_name, + scenario=answer.scenario )) if waiver_filters: diff --git a/greenwave/policies.py b/greenwave/policies.py index 2647a56..96e466a 100644 --- a/greenwave/policies.py +++ b/greenwave/policies.py @@ -221,10 +221,11 @@ class InvalidRemoteRuleYaml(RuleNotSatisfied): Remote policy parsing failed. """ - def __init__(self, subject, test_case_name, details): + def __init__(self, subject, test_case_name, details, scenario=None): self.subject = subject self.test_case_name = test_case_name self.details = details + self.scenario = scenario def to_json(self): return { @@ -232,6 +233,7 @@ class InvalidRemoteRuleYaml(RuleNotSatisfied): 'testcase': self.test_case_name, 'subject_type': self.subject.type, 'subject_identifier': self.subject.identifier, + 'scenario': self.scenario, 'details': self.details } @@ -245,6 +247,7 @@ class MissingRemoteRuleYaml(RuleNotSatisfied): """ test_case_name = 'missing-gating-yaml' + scenario = None def __init__(self, subject): self.subject = subject @@ -255,6 +258,7 @@ class MissingRemoteRuleYaml(RuleNotSatisfied): 'testcase': self.test_case_name, 'subject_type': self.subject.type, 'subject_identifier': self.subject.identifier, + 'scenario': self.scenario } def to_waived(self): diff --git a/greenwave/tests/test_waive.py b/greenwave/tests/test_waive.py index 9073784..a7f3961 100644 --- a/greenwave/tests/test_waive.py +++ b/greenwave/tests/test_waive.py @@ -168,3 +168,47 @@ def test_waive_answers_duplicates(): ] assert len(answers_json) == len(answers_to_check) assert all(a in answers_json for a in answers_to_check) + + +def test_waive_scenario(): + answers = [ + TestResultFailed( + subject=test_subject(), + test_case_name='test1', + scenario='scenario1', + result_id=99, + ) + ] + + waivers = [ + dict( + subject_type='koji_build', + subject_identifier='nethack-1.2.3-1.rawhide', + product_version='rawhide', + testcase='test1', + scenario='scenario2' + ) + ] + waived = waive_answers(answers, waivers) + assert answers == waived + + waivers = [ + dict( + subject_type='koji_build', + subject_identifier='nethack-1.2.3-1.rawhide', + product_version='rawhide', + testcase='test1', + scenario='scenario1' + ) + ] + waived = waive_answers(answers, waivers) + expected_json = dict( + type='test-result-failed-waived', + testcase='test1', + subject_type='koji_build', + subject_identifier='nethack-1.2.3-1.rawhide', + result_id=99, + scenario='scenario1', + ) + assert 1 == len(waived) + assert expected_json == waived[0].to_json() diff --git a/greenwave/waivers.py b/greenwave/waivers.py index 34ef497..b47a5c6 100644 --- a/greenwave/waivers.py +++ b/greenwave/waivers.py @@ -11,8 +11,10 @@ def _is_waived(answer, waivers): return any( waiver['subject_type'] == answer.subject.type and waiver['subject_identifier'] == answer.subject.identifier and - waiver['testcase'] == answer.test_case_name - for waiver in waivers) + waiver['testcase'] == answer.test_case_name and + (not waiver.get('scenario') or waiver['scenario'] == answer.scenario) + for waiver in waivers + ) def _maybe_waive(answer, waivers):