Tests: ensure fake builds recorded in order

Alter the recording ansible launcher used in tests to record the
build in the launch method which is synchronous, rather than in
the runAnsible method which is run from inside of a thread started
by the launch method.  This way, all builds that show up in the
running_builds attribute appear in the order they arrived from
gearman (which is the order in which they were launched).

Change-Id: I11d8c686f738b51797f9ac9cee0ac201800de383
diff --git a/tests/base.py b/tests/base.py
index a464ef2..3690048 100755
--- a/tests/base.py
+++ b/tests/base.py
@@ -532,11 +532,11 @@
 class FakeBuild(object):
     log = logging.getLogger("zuul.test")
 
-    def __init__(self, launch_server, job, jobdir, number, node):
+    def __init__(self, launch_server, job, number, node):
         self.daemon = True
         self.launch_server = launch_server
         self.job = job
-        self.jobdir = jobdir
+        self.jobdir = None
         self.number = number
         self.node = node
         self.parameters = json.loads(job.arguments)
@@ -642,6 +642,7 @@
         self._build_counter_lock = threading.Lock()
         self.build_counter = 0
         self.fail_tests = {}
+        self.job_builds = {}
 
     def addFailTest(self, name, change):
         l = self.fail_tests.get(name, [])
@@ -670,15 +671,20 @@
         self.log.debug("Done releasing builds %s (%s)" %
                        (regex, len(self.running_builds)))
 
-    def runAnsible(self, jobdir, job):
+    def launch(self, job):
         with self._build_counter_lock:
             self.build_counter += 1
             build_counter = self.build_counter
         node = None
-        build = FakeBuild(self, job, jobdir, build_counter, node)
+        build = FakeBuild(self, job, build_counter, node)
         job.build = build
-
         self.running_builds.append(build)
+        self.job_builds[job.unique] = build
+        super(RecordingLaunchServer, self).launch(job)
+
+    def runAnsible(self, jobdir, job):
+        build = self.job_builds[job.unique]
+        build.jobdir = jobdir
 
         if self._run_ansible:
             result = super(RecordingLaunchServer, self).runAnsible(jobdir, job)
@@ -692,8 +698,8 @@
                          uuid=build.unique, parameters=build.parameters,
                          pipeline=build.parameters['ZUUL_PIPELINE'])
         )
-        if build:
-            self.running_builds.remove(build)
+        self.running_builds.remove(build)
+        del self.job_builds[job.unique]
         self.lock.release()
         return result
 
@@ -1322,11 +1328,7 @@
             if build.number is None:
                 self.log.debug("%s has not reported start" % build)
                 return False
-            worker_build = None
-            for wb in self.launch_server.running_builds:
-                if wb.job.unique == server_job.unique:
-                    worker_build = wb
-                    break
+            worker_build = self.launch_server.job_builds.get(server_job.unique)
             if worker_build:
                 if worker_build.isWaiting():
                     continue