ms: Simplify starting of the test and combine loop and wait
This will make it easier to strt different kind of tests. The cost
of calling step_once is hopefully neglectable as it simplifies the
test.
Change-Id: I3708ac382c0a34e17cf147d18f03603946437a53
diff --git a/src/osmo_ms_driver/__main__.py b/src/osmo_ms_driver/__main__.py
index abc5e54..ef06393 100644
--- a/src/osmo_ms_driver/__main__.py
+++ b/src/osmo_ms_driver/__main__.py
@@ -82,10 +82,7 @@
atexit.register(test.stop_all)
# Run until everything has been launched
- test.launch(loop)
-
- # Wait for it to complete
- test.wait_for_result(loop)
+ test.run_test(loop)
# Print stats
test.print_stats()
diff --git a/src/osmo_ms_driver/location_update_test.py b/src/osmo_ms_driver/location_update_test.py
index 4b1c499..48c57eb 100644
--- a/src/osmo_ms_driver/location_update_test.py
+++ b/src/osmo_ms_driver/location_update_test.py
@@ -98,7 +98,7 @@
for phy in self._phys:
phy.verify_ready()
- def launch(self, loop):
+ def prepare(self, loop):
self.log("Starting testcase")
self.pre_launch(loop)
@@ -108,40 +108,57 @@
self._cdf.duration().total_seconds() + \
timedelta(seconds=120).total_seconds()
- current_time = self._start_time
- step_size = self._cdf.step_size().total_seconds()
self._started = []
- too_slow = 0
+ self._too_slow = 0
+
+ def step_once(self, loop, current_time):
+ if len(self._unstarted) <= 0:
+ return current_time, None
+
+ step_size = self._cdf.step_size().total_seconds()
# Start
self._cdf.step_once()
- while len(self._unstarted) > 0:
- # Check for timeout
- # start pending MS
- while len(self._started) < self._cdf.current_scaled_value() and len(self._unstarted) > 0:
- ms = self._unstarted.pop(0)
- ms.start(loop)
- launch_time = time.clock_gettime(time.CLOCK_MONOTONIC)
- self._results[ms.name_number()].set_launch_time(launch_time)
- self._started.append(ms)
+ # Check for timeout
+ # start pending MS
+ while len(self._started) < self._cdf.current_scaled_value() and len(self._unstarted) > 0:
+ ms = self._unstarted.pop(0)
+ ms.start(loop)
+ launch_time = time.clock_gettime(time.CLOCK_MONOTONIC)
+ self._results[ms.name_number()].set_launch_time(launch_time)
+ self._started.append(ms)
- # Progress and sleep
- self._cdf.step_once()
+ now_time = time.clock_gettime(time.CLOCK_MONOTONIC)
+ sleep_time = (current_time + step_size) - now_time
+ if sleep_time <= 0:
+ self.log("Starting too slowly. Moving on",
+ target=(current_time + step_size), now=now_time, sleep=sleep_time)
+ self._too_slow += 1
+ sleep_time = 0
+ if len(self._unstarted) == 0:
+ end_time = time.clock_gettime(time.CLOCK_MONOTONIC)
+ self.log("All started...", too_slow=self._too_slow, duration=end_time - self._start_time)
+ return current_time, None
+
+ return current_time + step_size, sleep_time
+
+ def run_test(self, loop):
+ self.prepare(loop)
+
+ to_complete_time = self._start_time + self.TEST_TIME.total_seconds()
+ tick_time = self._start_time
+
+ while not self.all_completed():
+ tick_time, sleep_time = self.step_once(loop, tick_time)
now_time = time.clock_gettime(time.CLOCK_MONOTONIC)
- sleep_time = (current_time + step_size) - now_time
- if sleep_time <= 0:
- self.log("Starting too slowly. Moving on",
- target=(current_time + step_size), now=now_time, sleep=sleep_time)
- too_slow += 1
- else:
- loop.schedule_timeout(sleep_time)
- loop.select()
- current_time += step_size
-
- end_time = time.clock_gettime(time.CLOCK_MONOTONIC)
- self.log("All started...", too_slow=too_slow, duration=end_time - self._start_time)
+ if sleep_time is None:
+ sleep_time = to_complete_time - now_time
+ if sleep_time < 0:
+ break
+ loop.schedule_timeout(sleep_time)
+ loop.select()
def stop_all(self):
for launcher in self._started:
@@ -168,17 +185,6 @@
raise Exception("Unknown event type..:" + _data.decode())
- def wait_for_result(self, loop):
- to_complete_time = self._start_time + self.TEST_TIME.total_seconds()
-
- while not self.all_completed():
- now_time = time.clock_gettime(time.CLOCK_MONOTONIC)
- sleep_time = to_complete_time - now_time
- if sleep_time < 0:
- break
- loop.schedule_timeout(sleep_time)
- loop.select()
-
def all_completed(self):
return self._outstanding == 0