From b4ad8d72431df2336b9c7fbc6eb9597daa80a35c Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Sat, 23 Feb 2019 09:58:59 +0000 Subject: nitb_netreg_mass: Add code to declare a run successful/failure Change-Id: I49a821e8e4656466259e519ef901726cbb76ef86 --- src/osmo_gsm_tester/ms_driver.py | 12 ++++++++ src/osmo_ms_driver/location_update_test.py | 27 ++++++++++++++-- suites/nitb_netreg_mass/register_default_mass.py | 39 +++++++++++++++++++++--- 3 files changed, 71 insertions(+), 7 deletions(-) diff --git a/src/osmo_gsm_tester/ms_driver.py b/src/osmo_gsm_tester/ms_driver.py index e8e543c..de2f967 100644 --- a/src/osmo_gsm_tester/ms_driver.py +++ b/src/osmo_gsm_tester/ms_driver.py @@ -146,6 +146,18 @@ class MsDriver(log.Origin): """ self._test_case.print_stats() + def get_stats(self): + """ + Returns a statistical summary of the test. + """ + return self._test_case.get_stats() + + def get_result_values(self): + """ + Returns the raw result values of the test run in any order. + """ + return self._test_case.get_result_values() + def cleanup(self): """ Cleans up the driver (e.g. AF_UNIX files). diff --git a/src/osmo_ms_driver/location_update_test.py b/src/osmo_ms_driver/location_update_test.py index 8500607..f14bd28 100644 --- a/src/osmo_ms_driver/location_update_test.py +++ b/src/osmo_ms_driver/location_update_test.py @@ -23,9 +23,11 @@ from .test_support import imsi_ki_gen, Results from datetime import timedelta +import collections import time class LUResult(Results): + """Representation of a Location Updating Result.""" def __init__(self, name): super().__init__(name) @@ -44,6 +46,10 @@ class LUResult(Results): def lu_delay(self): return self.lu_time() - self.start_time() + +LUStats = collections.namedtuple("LUStats", ["num_attempted", "num_completed", + "min_latency", "max_latency"]) + class MassUpdateLocationTest(log.Origin): """ A test to launch a configurable amount of MS and make them @@ -207,9 +213,24 @@ class MassUpdateLocationTest(log.Origin): max_value = result.lu_delay() return min_value, max_value + def get_result_values(self): + """ + Returns the raw result values of the test run in any order. + """ + return self._results.values() + + def get_stats(self): + """ + Returns a statistical summary of the test. + """ + attempted = self._number_of_ms + completed = attempted - self._outstanding + min_latency, max_latency = self.find_min_max(filter(lambda x: x.has_lu_time(), self._results.values())) + return LUStats(attempted, completed, min_latency, max_latency) + def print_stats(self): - all_completed = self.all_completed() - min_value, max_value = self.find_min_max(filter(lambda x: x.has_lu_time(), self._results.values())) + stats = self.get_stats() + all_completed = stats.num_attempted == stats.num_completed self.log("Tests done", all_completed=all_completed, - min=min_value, max=max_value) + min=stats.min_latency, max=stats.max_latency) diff --git a/suites/nitb_netreg_mass/register_default_mass.py b/suites/nitb_netreg_mass/register_default_mass.py index ede2b74..8259359 100644 --- a/suites/nitb_netreg_mass/register_default_mass.py +++ b/suites/nitb_netreg_mass/register_default_mass.py @@ -1,16 +1,17 @@ #!/usr/bin/env python3 """ -Run a network registration with a 'massive' amount of MS +Runs a network registration with a 'massive' amount of MS using the ms_driver infrastructure. """ from osmo_gsm_tester.testenv import * +from datetime import timedelta -print('use resources...') +print('Claiming resources for the test') nitb = suite.nitb() bts = suite.bts() ms_driver = suite.ms_driver() -print('start nitb and bts...') +print('Launching a simple network') nitb.bts_add(bts) nitb.start() bts.start() @@ -23,5 +24,35 @@ for ms in ms_driver.ms_subscribers(): # Run the base test. ms_driver.run_test() -# Print stats +# Print the stats of the run. ms_driver.print_stats() + +# Evaluate if this run was successful or not. Our initial acceptance criteria +# is quite basic but it should allow us to scale to a larger number of MS and +# reasons (e.g. have a full BCCH). +# +# 99% of LUs should complete +# 99% of successful LUs should complete within 10s. +stats = ms_driver.get_stats() +if len(mobiles) > 0 and stats.num_completed < 1: + raise Exception("No run completed.") +completion_ratio = stats.num_attempted / stats.num_completed + +# Verify that 99% of LUs completed. +if completion_ratio < 0.99: + raise Exception("Completion ratio of %f%% lower than threshold." % (completion_ratio * 100.0)) + +# Check how many results are below our threshold. +acceptable_delay = timedelta(seconds=20) +results = ms_driver.get_result_values() +quick_enough = 0 +for result in results: + if not result.has_lu_time(): + continue + if timedelta(seconds=result.lu_delay()) >= acceptable_delay: + continue + quick_enough = quick_enough + 1 + +latency_ratio = quick_enough / len(results) +if latency_ratio < 0.99: + raise Exception("Latency ratio of %f%% lower than threshold." % (latency_ratio * 100.0)) -- cgit v1.2.3