From 70ede93f64e189287cc8b5a25df3791dd30a1c2d Mon Sep 17 00:00:00 2001 From: Iain Lane Date: Fri, 4 May 2018 09:30:23 +0100 Subject: [PATCH] force-reset-test: Make the hint apply 'backwards' too If we're force-reset-test foo/N, we should consider all versions up to and including N as ALWAYSFAILED. --- britney2/policies/autopkgtest.py | 22 +++++++++++-- tests/test_autopkgtest.py | 54 ++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/britney2/policies/autopkgtest.py b/britney2/policies/autopkgtest.py index 73c1c91..32fb095 100644 --- a/britney2/policies/autopkgtest.py +++ b/britney2/policies/autopkgtest.py @@ -711,7 +711,7 @@ class AutopkgtestPolicy(BasePolicy): EXCUSES_LABELS. log_url is None if the test is still running. ''' # determine current test result status - until = self.find_max_force_reset_test(src, ver, arch) + until = self.find_max_lower_force_reset_test(src, ver, arch) ever_passed = self.check_ever_passed_before(src, ver, arch, until) url = None try: @@ -732,6 +732,10 @@ class AutopkgtestPolicy(BasePolicy): if ever_passed: if self.has_force_badtest(src, ver, arch): result = 'IGNORE-FAIL' + elif self.has_higher_force_reset_test(src, ver, arch): + # we've got a force-reset-test foo/N, N >= ver hint; + # this is ALWAYSFAIL + result = 'ALWAYSFAIL' else: result = 'REGRESSION' else: @@ -759,7 +763,7 @@ class AutopkgtestPolicy(BasePolicy): return (result, ver, url) - def find_max_force_reset_test(self, src, ver, arch): + def find_max_lower_force_reset_test(self, src, ver, arch): '''Find the maximum force-reset-test hint before/including ver''' hints = self.britney.hints.search('force-reset-test', package=src) found_ver = None @@ -775,6 +779,20 @@ class AutopkgtestPolicy(BasePolicy): return found_ver + def has_higher_force_reset_test(self, src, ver, arch): + '''Find if there is a minimum force-reset-test hint after/including ver''' + hints = self.britney.hints.search('force-reset-test', package=src) + + if hints: + for hint in hints: + for mi in hint.packages: + if (mi.architecture in ['source', arch] and + mi.version != 'all' and + apt_pkg.version_compare(mi.version, ver) >= 0): + return True + + return False + def has_force_badtest(self, src, ver, arch): '''Check if src/ver/arch has a force-badtest hint''' diff --git a/tests/test_autopkgtest.py b/tests/test_autopkgtest.py index c6c07c9..04caaa1 100755 --- a/tests/test_autopkgtest.py +++ b/tests/test_autopkgtest.py @@ -1738,6 +1738,60 @@ class T(TestBase): }) + def test_hint_force_reset_test_earlier_hints(self): + '''force-reset-test for a later version applies backwards''' + + self.swift.set_results({'autopkgtest-series': { + 'series/amd64/l/lightgreen/20150100_100100@': (0, 'lightgreen 1', tr('lightgreen/1')), + 'series/amd64/l/lightgreen/20150101_100100@': (4, 'lightgreen 1', tr('green/2')), + 'series/amd64/l/lightgreen/20150102_100101@': (0, 'lightgreen 2', tr('lightgreen/2')), + 'series/amd64/l/lightgreen/20150103_100101@': (4, 'lightgreen 3', tr('lightgreen/3')), + }}) + + + self.create_hint('pitti', 'force-reset-test lightgreen/3') + self.do_test( + [('libgreen1', {'Version': '2', 'Source': 'green', 'Depends': 'libc6'}, 'autopkgtest'), + ('lightgreen', {'Version': '3', 'Source': 'lightgreen', 'Depends': 'libc6'}, 'autopkgtest')], + {'green': (True, { + 'lightgreen/1': {'amd64': 'ALWAYSFAIL'}, + }), + 'lightgreen': (True, { + 'lightgreen/3': {'amd64': 'ALWAYSFAIL'}, + }), + + }, + {'green': [('old-version', '1'), ('new-version', '2')], + 'lightgreen': [('old-version', '1'), ('new-version', '3')], + }) + + def test_hint_force_reset_test_earlier_hints_pass(self): + '''force-reset-test for a later version which is PASS is still PASS''' + + self.swift.set_results({'autopkgtest-series': { + 'series/amd64/l/lightgreen/20150100_100100@': (0, 'lightgreen 1', tr('lightgreen/1')), + 'series/amd64/l/lightgreen/20150101_100100@': (0, 'lightgreen 1', tr('green/2')), + 'series/amd64/l/lightgreen/20150102_100101@': (0, 'lightgreen 2', tr('lightgreen/2')), + 'series/amd64/l/lightgreen/20150103_100101@': (0, 'lightgreen 3', tr('lightgreen/3')), + }}) + + + self.create_hint('pitti', 'force-reset-test lightgreen/3') + self.do_test( + [('libgreen1', {'Version': '2', 'Source': 'green', 'Depends': 'libc6'}, 'autopkgtest'), + ('lightgreen', {'Version': '3', 'Source': 'lightgreen', 'Depends': 'libc6'}, 'autopkgtest')], + {'green': (True, { + 'lightgreen/1': {'amd64': 'PASS'}, + }), + 'lightgreen': (True, { + 'lightgreen/3': {'amd64': 'PASS'}, + }), + + }, + {'green': [('old-version', '1'), ('new-version', '2')], + 'lightgreen': [('old-version', '1'), ('new-version', '3')], + }) + def test_hint_force_badtest_multi_version(self): '''force-badtest hint'''