ms: Quit early when all tests concluded..

And fix the the detection if everything has completed.

Change-Id: I3575ee7618c35e3b66d25fa31844d267489d9179
diff --git a/src/osmo_ms_driver/location_update_test.py b/src/osmo_ms_driver/location_update_test.py
index 2a3c246..4b1c499 100644
--- a/src/osmo_ms_driver/location_update_test.py
+++ b/src/osmo_ms_driver/location_update_test.py
@@ -35,6 +35,9 @@
         assert self._time_of_lu is None
         self._time_of_lu = time
 
+    def has_lu_time(self):
+        return self._time_of_lu is not None
+
     def lu_time(self):
         return self._time_of_lu or 0
 
@@ -64,6 +67,7 @@
         self._results = {}
         imsi_gen = imsi_ki_gen()
 
+        self._outstanding = number_of_ms
         for i in range(0, number_of_ms):
             ms_name = "%.5d" % i
 
@@ -155,6 +159,8 @@
         elif data['type'] == 'event':
             if data['data']['lu_done'] == 1:
                 ms = self._results[data['ms']]
+                if not ms.has_lu_time():
+                    self._outstanding = self._outstanding - 1
                 ms.set_lu_time(time)
                 self.log("MS performed LU ", ms=ms, at=time, lu_delay=ms.lu_delay())
         else:
@@ -165,7 +171,7 @@
     def wait_for_result(self, loop):
         to_complete_time = self._start_time + self.TEST_TIME.total_seconds()
 
-        while True:
+        while not self.all_completed():
             now_time = time.clock_gettime(time.CLOCK_MONOTONIC)
             sleep_time = to_complete_time - now_time
             if sleep_time < 0:
@@ -173,9 +179,11 @@
             loop.schedule_timeout(sleep_time)
             loop.select()
 
+    def all_completed(self):
+        return self._outstanding == 0
+
     def print_stats(self):
-        from functools import reduce
-        all_completed = reduce(lambda b, ms: b and ms.lu_time() is not None, self._results.values(), True)
+        all_completed = self.all_completed()
         min_value = min(self._results.values(), key=lambda x: x.lu_delay())
         max_value = max(self._results.values(), key=lambda x: x.lu_delay())