From fa02b9c677b98bb742116db904193ad2f96ea95e Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Wed, 6 May 2020 21:11:39 +0200 Subject: [PATCH] suites: 4g: Parametrize handover.py test Change-Id: I7de5acdaa6b905e52655786758bd51490add1d2b --- sysmocom/scenarios/suite-4g@.conf | 6 ++++ sysmocom/suites/4g/handover.py | 55 ++++++++++++++++++++----------- sysmocom/suites/4g/suite.conf | 5 +++ 3 files changed, 47 insertions(+), 19 deletions(-) create mode 100644 sysmocom/scenarios/suite-4g@.conf diff --git a/sysmocom/scenarios/suite-4g@.conf b/sysmocom/scenarios/suite-4g@.conf new file mode 100644 index 00000000..6c36e4c0 --- /dev/null +++ b/sysmocom/scenarios/suite-4g@.conf @@ -0,0 +1,6 @@ +config: + suite: + 4g: + handover: + duration: ${param1} + threshold: ${param2} diff --git a/sysmocom/suites/4g/handover.py b/sysmocom/suites/4g/handover.py index 25b424bb..a503465b 100755 --- a/sysmocom/suites/4g/handover.py +++ b/sysmocom/suites/4g/handover.py @@ -1,10 +1,32 @@ #!/usr/bin/env python3 from osmo_gsm_tester.testenv import * -epc = suite.epc() -enb = suite.enb() -ue = suite.modem() -iperf3srv = suite.iperf3srv({'addr': epc.tun_addr()}) +import time + +test_config = tenv.config_test_specific() +duration = int(test_config.get('duration', 0)) # 0 = one HO loop +threshold = int(test_config.get('threshold', 2)) + +import pprint +print("TEST_CONFIG:\n" + pprint.pformat(test_config)) + +# attenuation from 0 to 10, then back to 0 +cell1_att_li = list(range(0, 11, 1)) + list(range(9, -1, -1)) +# attenuation from 10 to 0, then back to 10 +cell2_att_li = list(range(10, 0, -1)) + list(range(0, 11, 1)) + +def do_one_ho_loop(rfemu_cell1, rfemu_cell2): + step = 0 + while step < len(cell1_att_li): + rfemu_cell1.set_attenuation(cell1_att_li[step]) + rfemu_cell2.set_attenuation(cell2_att_li[step]) + step += 1 + sleep(1) + +epc = tenv.epc() +enb = tenv.enb() +ue = tenv.modem() +iperf3srv = tenv.iperf3srv({'addr': epc.tun_addr()}) iperf3srv.set_run_node(epc.run_node()) iperf3cli = iperf3srv.create_client() iperf3cli.set_run_node(ue.run_node()) @@ -21,7 +43,7 @@ print('ENB is connected to EPC') ue.connect(enb) iperf3srv.start() -proc = iperf3cli.prepare_test_proc(False, ue.netns(), 30) +proc = iperf3cli.prepare_test_proc(False, ue.netns(), duration + 30) print('waiting for UE to attach...') wait(ue.is_connected, None) @@ -30,22 +52,17 @@ print('UE is attached') rfemu_cell1 = enb.get_rfemu(0) rfemu_cell2 = enb.get_rfemu(1) -# attenuation from 0 to 10, then back to 0 -cell1_att_li = list(range(0, 11, 1)) + list(range(9, -1, -1)) -# attenuation from 10 to 0, then back to 10 -cell2_att_li = list(range(10, 0, -1)) + list(range(0, 11, 1)) - +print('Iterating for %d seconds to produce at least %d handovers...' % (duration, threshold)) try: proc.launch() - step = 0 - while step < len(cell1_att_li): - rfemu_cell1.set_attenuation(cell1_att_li[step]) - rfemu_cell2.set_attenuation(cell2_att_li[step]) - step += 1 - sleep(1) + t_end = time.time() + duration + if duration == 0: + t_end += 1 # allow loop to run once + while time.time() < t_end: + do_one_ho_loop(rfemu_cell1, rfemu_cell2) num_handovers = ue.get_counter('handover_success') - if num_handovers != 2: - raise Exception('Wrong number of handovers %d vs expected 2' % num_handovers) + if num_handovers < threshold: + raise Exception('Wrong number of handovers %d < threshold %d during %d seconds' % (num_handovers, threshold, duration)) except Exception as e: try: proc.terminate() # make sure we always terminate the process @@ -53,7 +70,7 @@ except Exception as e: print("Exception while terminating process %r" % repr(process)) raise e -rest_str = 'Got %d successful handovers' % num_handovers +rest_str = 'Got %d successful handovers (>= %d) during %d seconds' % (num_handovers, threshold, duration) print(res_str) test.set_report_stdout(res_str) proc.terminate() diff --git a/sysmocom/suites/4g/suite.conf b/sysmocom/suites/4g/suite.conf index e439e991..fbd81b6b 100644 --- a/sysmocom/suites/4g/suite.conf +++ b/sysmocom/suites/4g/suite.conf @@ -8,5 +8,10 @@ resources: features: - 4g +schema: + handover: + duration: 'duration' + threshold: 'uint' + defaults: timeout: 180s