From c59033afaec7372f70627fd1595cb51cea8763bc Mon Sep 17 00:00:00 2001
From: Martin Pitt <martin.pitt@canonical.com>
Date: Mon, 24 Aug 2015 10:58:27 +0200
Subject: [PATCH] autopkgtest: Check for existing test results for unstable
 version too

r472 added >= version matching to the results evaluation. But we also must do
this in add_test_request() so that we avoid requesting a test for the testing
version over and over again if we get results for the unstable version only.
But here it is enough to only check the requested version and the unstable
version (if that's higher).
---
 autopkgtest.py            | 15 +++++++----
 tests/test_autopkgtest.py | 56 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 66 insertions(+), 5 deletions(-)

diff --git a/autopkgtest.py b/autopkgtest.py
index 1d012da..45e9317 100644
--- a/autopkgtest.py
+++ b/autopkgtest.py
@@ -278,14 +278,19 @@ class AutoPackageTest(object):
         previous run (i. e. not already in self.pending_tests) or there already
         is a result for it.
         '''
-        try:
-            for (tsrc, tver) in self.test_results[src][arch][1][ver][1]:
+        # check for existing results for both the requested and the current
+        # unstable version: test runs might see newly built versions which we
+        # didn't see in britney yet
+        pkg_arch_results = self.test_results.get(src, {}).get(arch, [None, {}, None])[1]
+        unstable_ver = self.britney.sources['unstable'][src][VERSION]
+        for result_ver in [ver, unstable_ver]:
+            if result_ver not in pkg_arch_results or apt_pkg.version_compare(result_ver, ver) < 0:
+                continue
+            for (tsrc, tver) in pkg_arch_results[result_ver][1]:
                 if tsrc == trigsrc and apt_pkg.version_compare(tver, trigver) >= 0:
                     self.log_verbose('There already is a result for %s/%s/%s triggered by %s/%s' %
-                                     (src, ver, arch, tsrc, tver))
+                                     (src, result_ver, arch, tsrc, tver))
                     return
-        except KeyError:
-            pass
 
         if (trigsrc, trigver) in self.pending_tests.get(src, {}).get(
                 ver, {}).get(arch, set()):
diff --git a/tests/test_autopkgtest.py b/tests/test_autopkgtest.py
index dbc1bda..7f9ef71 100644
--- a/tests/test_autopkgtest.py
+++ b/tests/test_autopkgtest.py
@@ -509,6 +509,62 @@ lightgreen 1 i386 green 2
         self.assertEqual(self.amqp_requests, set())
         self.assertEqual(self.pending_requests, '')
 
+        # next run should not trigger any new requests
+        self.do_test([], NOT_CONSIDERED, [])
+        self.assertEqual(self.amqp_requests, set())
+        self.assertEqual(self.pending_requests, '')
+
+    def test_rdepends_unbuilt_new_version_fail(self):
+        '''Unbuilt reverse dependency gets failure for newer version'''
+
+        # add unbuilt lightgreen; should request tests against the old version
+        self.data.add_src('lightgreen', True, {'Version': '2', 'Testsuite': 'autopkgtest'})
+        self.do_test(
+            [('libgreen1', {'Version': '2', 'Source': 'green', 'Depends': 'libc6'}, 'autopkgtest')],
+            NOT_CONSIDERED,
+            [r'\bgreen\b.*>1</a> to .*>2<',
+             r'\blightgreen\b.*>1</a> to .*>2<',
+             r'autopkgtest for green 2: .*amd64.*in progress.*i386.*in progress',
+             r'autopkgtest for darkgreen 1: .*amd64.*in progress.*i386.*in progress',
+             r'autopkgtest for lightgreen 1 \(2 is unbuilt/uninstallable\): .*amd64.*in progress.*i386.*in progress',
+             r'lightgreen has no up-to-date binaries on any arch'],
+            ['Valid candidate'])
+        self.assertEqual(
+            self.amqp_requests,
+            set(['debci-series-i386:green', 'debci-series-amd64:green',
+                 'debci-series-i386:lightgreen', 'debci-series-amd64:lightgreen',
+                 'debci-series-i386:darkgreen', 'debci-series-amd64:darkgreen']))
+
+        # we only get a result for lightgreen 2, not for the requested 1
+        self.swift.set_results({'autopkgtest-series': {
+            'series/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1'),
+            'series/amd64/d/darkgreen/20150101_100001@': (0, 'darkgreen 1'),
+            'series/i386/l/lightgreen/20150101_100100@': (0, 'lightgreen 0.5'),
+            'series/amd64/l/lightgreen/20150101_100100@': (0, 'lightgreen 0.5'),
+            'series/i386/l/lightgreen/20150101_100200@': (4, 'lightgreen 2'),
+            'series/amd64/l/lightgreen/20150101_100200@': (4, 'lightgreen 2'),
+            'series/i386/g/green/20150101_100200@': (0, 'green 2'),
+            'series/amd64/g/green/20150101_100201@': (0, 'green 2'),
+        }})
+        self.do_test(
+            [],
+            NOT_CONSIDERED,
+            [r'\bgreen\b.*>1</a> to .*>2<',
+             r'\blightgreen\b.*>1</a> 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 \(2 is unbuilt/uninstallable\): .*amd64.*Regression.*i386.*Regression',
+             r'lightgreen has no up-to-date binaries on any arch'],
+            ['Valid candidate'])
+
+        self.assertEqual(self.amqp_requests, set())
+        self.assertEqual(self.pending_requests, '')
+
+        # next run should not trigger any new requests
+        self.do_test([], NOT_CONSIDERED, [], ['Valid candidate'])
+        self.assertEqual(self.pending_requests, '')
+        self.assertEqual(self.amqp_requests, set())
+
     def test_hint_force_badtest(self):
         '''force-badtest hint'''