diff --git a/autopkgtest.py b/autopkgtest.py index 31a932c..7a1c37f 100644 --- a/autopkgtest.py +++ b/autopkgtest.py @@ -38,7 +38,6 @@ ADT_EXCUSES_LABELS = { "ALWAYSFAIL": 'Always failed', "REGRESSION": 'Regression', "RUNNING": 'Test in progress', - "UNINST": 'Unbuilt/uninstallable', } @@ -170,11 +169,19 @@ class AutoPackageTest(object): continue for rdep in rdeps: rdep_src = binaries_info[rdep][SOURCE] - rdep_src_info = sources_info[rdep_src] + # if rdep_src/unstable is known to be not built yet or + # uninstallable, try to run tests against testing; if that + # works, then the unstable src does not break the testing + # rdep_src and is fine + if rdep_src in self.excludes: + rdep_src_info = self.britney.sources['testing'][rdep_src] + self.log_verbose('Reverse dependency %s of %s/%s is unbuilt or uninstallable, running test against testing version %s' % + (rdep_src, src, ver, rdep_src_info[VERSION])) + else: + rdep_src_info = sources_info[rdep_src] if rdep_src_info[AUTOPKGTEST] or self.has_autodep8(rdep_src_info): if rdep_src not in reported_pkgs: - # we don't care about the version of rdep - tests.append((rdep_src, sources_info[rdep_src][VERSION])) + tests.append((rdep_src, rdep_src_info[VERSION])) reported_pkgs.add(rdep_src) tests.sort(key=lambda (s, v): s) @@ -395,12 +402,11 @@ class AutoPackageTest(object): # def request(self, packages, excludes=None): - if excludes is None: - excludes = [] - self.excludes.update(excludes) + if excludes: + self.excludes.update(excludes) self.log_verbose('Requested autopkgtests for %s, exclusions: %s' % - (['%s/%s' % i for i in packages], str(excludes))) + (['%s/%s' % i for i in packages], str(self.excludes))) for src, ver in packages: for (testsrc, testver) in self.tests_for_source(src, ver): if testsrc not in self.excludes: @@ -496,7 +502,7 @@ class AutoPackageTest(object): def results(self, trigsrc, trigver): '''Return test results for triggering package - Return (passed, src, ver, arch -> ALWAYSFAIL|PASS|FAIL|RUNNING|UNINST) + Return (passed, src, ver, arch -> ALWAYSFAIL|PASS|FAIL|RUNNING) iterator for all package tests that got triggered by trigsrc/trigver. ''' for testsrc, testver in self.tests_for_source(trigsrc, trigver): @@ -525,13 +531,13 @@ class AutoPackageTest(object): arch_status[arch] = 'RUNNING' passed = False except KeyError: - # neither done nor pending; excluded? - if testsrc in self.excludes: - arch_status[arch] = 'UNINST' - passed = False + # ignore if adt or swift results are disabled, + # otherwise this is unexpected + if not hasattr(self.britney.options, 'adt_swift_url'): continue - - # ignore if adt or swift results are disabled + # FIXME: Ignore this error for now as it crashes britney, but investigate! + self.log_error('FIXME: Result for %s/%s/%s (triggered by %s/%s) is neither known nor pending!' % + (testsrc, testver, arch, trigsrc, trigver)) continue # disabled or ignored? diff --git a/britney.py b/britney.py index 5b518d2..d709706 100755 --- a/britney.py +++ b/britney.py @@ -1860,7 +1860,11 @@ class Britney(object): 'r': self.options.series, 'a': arch} archmsg.append('%s: %s' % (url, arch, ADT_EXCUSES_LABELS[arch_status[arch]])) - e.addhtml('autopkgtest for %s %s: %s' % (adtsrc, adtver, ', '.join(archmsg))) + if adtsrc in autopkgtest_excludes: + note = ' (%s is unbuilt/uninstallable)' % self.sources['unstable'][adtsrc][VERSION] + else: + note = '' + e.addhtml('autopkgtest for %s %s%s: %s' % (adtsrc, adtver, note, ', '.join(archmsg))) # hints can override failures if not passed: diff --git a/tests/test_autopkgtest.py b/tests/test_autopkgtest.py index e1de222..47c2412 100644 --- a/tests/test_autopkgtest.py +++ b/tests/test_autopkgtest.py @@ -106,6 +106,8 @@ class TestAutoPkgTest(TestBase): except IOError: self.pending_requests = None + self.assertNotIn('FIXME', out) + return out def test_no_request_for_uninstallable(self): @@ -378,7 +380,7 @@ lightgreen 1 i386 green 2 NOT_CONSIDERED) os.unlink(self.fake_amqp) - # add unbuilt lightgreen + # add unbuilt lightgreen; should run tests against the old version self.data.add_src('lightgreen', True, {'Version': '2', 'Testsuite': 'autopkgtest'}) self.do_test( [], @@ -387,14 +389,14 @@ lightgreen 1 i386 green 2 r'\blightgreen\b.*>1 to .*>2<', r'autopkgtest for green 2: .*amd64.*Pass.*i386.*Pass', r'autopkgtest for darkgreen 1: .*amd64.*Pass.*i386.*Pass', - r'autopkgtest for lightgreen 2: .*amd64.*Unbuilt/uninstallable.*i386.*Unbuilt/uninstallable', + r'autopkgtest for lightgreen 1 \(2 is unbuilt/uninstallable\): .*amd64.*Regression.*i386.*Regression', r'lightgreen has no up-to-date binaries on any arch'], ['Valid candidate']) # lightgreen's tests should not be triggered yet while it is unbuilt self.assertEqual(self.amqp_requests, set()) - # now lightgreen gets built and a test result + # now lightgreen 2 gets built, should trigger a new test run self.swift.set_results({'autopkgtest-series': { 'series/i386/l/lightgreen/20150101_100200@': (0, 'lightgreen 2'), 'series/amd64/l/lightgreen/20150101_102000@': (0, 'lightgreen 2'),