<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/17901">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  pespin: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">suites/4g: Introduce sample handover test<br><br>This test currently only works with AmarisoftENB and srsUE, because:<br>* srsENB has no handover support yet<br>* AmarisoftUE doesn't provide any known way to verify handovers.<br><br>As a result, it usually runs with following filters and modifiers:<br>amarisoftenb-rftype@uhd+srsue-rftype@uhd+mod-enb-ncells@2+mod-enb-meas-enable<br><br>The get_counter() API may change in the future based on information<br>available from other implementations.<br><br>Change-Id: I0dff4af7e3a89804a03842ad4a4d697bca3a9773<br>---<br>M src/osmo_gsm_tester/obj/ms.py<br>M src/osmo_gsm_tester/obj/ms_srs.py<br>A sysmocom/scenarios/mod-enb-meas-enable.conf<br>A sysmocom/suites/4g/handover.py<br>4 files changed, 81 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo_gsm_tester/obj/ms.py b/src/osmo_gsm_tester/obj/ms.py</span><br><span>index 2774deb..e74377d 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/ms.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/ms.py</span><br><span>@@ -97,3 +97,6 @@</span><br><span> </span><br><span>     def msisdn(self):</span><br><span>         return self.msisdn</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def get_counter(self, counter_name):</span><br><span style="color: hsl(120, 100%, 40%);">+        raise log.Error('get_counter() not implemented!')</span><br><span>diff --git a/src/osmo_gsm_tester/obj/ms_srs.py b/src/osmo_gsm_tester/obj/ms_srs.py</span><br><span>index 106502d..cb29f06 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/ms_srs.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/ms_srs.py</span><br><span>@@ -327,6 +327,20 @@</span><br><span>         proc.launch_sync()</span><br><span>         return proc</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    def _get_counter_handover_success(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        # Match against sample line: "HO success"</span><br><span style="color: hsl(120, 100%, 40%);">+        n = 0</span><br><span style="color: hsl(120, 100%, 40%);">+        stdout_lines = (self.process.get_stdout() or '').splitlines()</span><br><span style="color: hsl(120, 100%, 40%);">+        for l in stdout_lines:</span><br><span style="color: hsl(120, 100%, 40%);">+            if l == 'HO successful':</span><br><span style="color: hsl(120, 100%, 40%);">+                n += 1</span><br><span style="color: hsl(120, 100%, 40%);">+        return n</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def get_counter(self, counter_name):</span><br><span style="color: hsl(120, 100%, 40%);">+        if counter_name == 'handover_success':</span><br><span style="color: hsl(120, 100%, 40%);">+            return self._get_counter_handover_success()</span><br><span style="color: hsl(120, 100%, 40%);">+        raise log.Error('counter %s not implemented!' % counter_name)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     def verify_metric(self, value, operation='avg', metric='dl_brate', criterion='gt'):</span><br><span>         # file is not properly flushed until the process has stopped.</span><br><span>         if self.running():</span><br><span>diff --git a/sysmocom/scenarios/mod-enb-meas-enable.conf b/sysmocom/scenarios/mod-enb-meas-enable.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..e3e841e</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/scenarios/mod-enb-meas-enable.conf</span><br><span>@@ -0,0 +1,3 @@</span><br><span style="color: hsl(120, 100%, 40%);">+modifiers:</span><br><span style="color: hsl(120, 100%, 40%);">+  enb:</span><br><span style="color: hsl(120, 100%, 40%);">+  - enable_measurements: true</span><br><span>diff --git a/sysmocom/suites/4g/handover.py b/sysmocom/suites/4g/handover.py</span><br><span>new file mode 100755</span><br><span>index 0000000..25b424b</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/suites/4g/handover.py</span><br><span>@@ -0,0 +1,61 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/usr/bin/env python3</span><br><span style="color: hsl(120, 100%, 40%);">+from osmo_gsm_tester.testenv import *</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+epc = suite.epc()</span><br><span style="color: hsl(120, 100%, 40%);">+enb = suite.enb()</span><br><span style="color: hsl(120, 100%, 40%);">+ue = suite.modem()</span><br><span style="color: hsl(120, 100%, 40%);">+iperf3srv = suite.iperf3srv({'addr': epc.tun_addr()})</span><br><span style="color: hsl(120, 100%, 40%);">+iperf3srv.set_run_node(epc.run_node())</span><br><span style="color: hsl(120, 100%, 40%);">+iperf3cli = iperf3srv.create_client()</span><br><span style="color: hsl(120, 100%, 40%);">+iperf3cli.set_run_node(ue.run_node())</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+epc.subscriber_add(ue)</span><br><span style="color: hsl(120, 100%, 40%);">+epc.start()</span><br><span style="color: hsl(120, 100%, 40%);">+enb.ue_add(ue)</span><br><span style="color: hsl(120, 100%, 40%);">+enb.start(epc)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+print('waiting for ENB to connect to EPC...')</span><br><span style="color: hsl(120, 100%, 40%);">+wait(epc.enb_is_connected, enb)</span><br><span style="color: hsl(120, 100%, 40%);">+print('ENB is connected to EPC')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ue.connect(enb)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+iperf3srv.start()</span><br><span style="color: hsl(120, 100%, 40%);">+proc = iperf3cli.prepare_test_proc(False, ue.netns(), 30)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+print('waiting for UE to attach...')</span><br><span style="color: hsl(120, 100%, 40%);">+wait(ue.is_connected, None)</span><br><span style="color: hsl(120, 100%, 40%);">+print('UE is attached')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+rfemu_cell1 = enb.get_rfemu(0)</span><br><span style="color: hsl(120, 100%, 40%);">+rfemu_cell2 = enb.get_rfemu(1)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# attenuation from 0 to 10, then back to 0</span><br><span style="color: hsl(120, 100%, 40%);">+cell1_att_li = list(range(0, 11, 1)) + list(range(9, -1, -1))</span><br><span style="color: hsl(120, 100%, 40%);">+# attenuation from 10 to 0, then back to 10</span><br><span style="color: hsl(120, 100%, 40%);">+cell2_att_li = list(range(10, 0, -1)) + list(range(0, 11, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+try:</span><br><span style="color: hsl(120, 100%, 40%);">+    proc.launch()</span><br><span style="color: hsl(120, 100%, 40%);">+    step = 0</span><br><span style="color: hsl(120, 100%, 40%);">+    while step < len(cell1_att_li):</span><br><span style="color: hsl(120, 100%, 40%);">+        rfemu_cell1.set_attenuation(cell1_att_li[step])</span><br><span style="color: hsl(120, 100%, 40%);">+        rfemu_cell2.set_attenuation(cell2_att_li[step])</span><br><span style="color: hsl(120, 100%, 40%);">+        step += 1</span><br><span style="color: hsl(120, 100%, 40%);">+        sleep(1)</span><br><span style="color: hsl(120, 100%, 40%);">+    num_handovers = ue.get_counter('handover_success')</span><br><span style="color: hsl(120, 100%, 40%);">+    if num_handovers != 2:</span><br><span style="color: hsl(120, 100%, 40%);">+        raise Exception('Wrong number of handovers %d vs expected 2' % num_handovers)</span><br><span style="color: hsl(120, 100%, 40%);">+except Exception as e:</span><br><span style="color: hsl(120, 100%, 40%);">+    try:</span><br><span style="color: hsl(120, 100%, 40%);">+        proc.terminate() # make sure we always terminate the process</span><br><span style="color: hsl(120, 100%, 40%);">+    except Exception:</span><br><span style="color: hsl(120, 100%, 40%);">+            print("Exception while terminating process %r" % repr(process))</span><br><span style="color: hsl(120, 100%, 40%);">+    raise e</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+rest_str = 'Got %d successful handovers' % num_handovers</span><br><span style="color: hsl(120, 100%, 40%);">+print(res_str)</span><br><span style="color: hsl(120, 100%, 40%);">+test.set_report_stdout(res_str)</span><br><span style="color: hsl(120, 100%, 40%);">+proc.terminate()</span><br><span style="color: hsl(120, 100%, 40%);">+proc.wait()</span><br><span style="color: hsl(120, 100%, 40%);">+print("Done")</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/17901">change 17901</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/17901"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-gsm-tester </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I0dff4af7e3a89804a03842ad4a4d697bca3a9773 </div>
<div style="display:none"> Gerrit-Change-Number: 17901 </div>
<div style="display:none"> Gerrit-PatchSet: 8 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: srs_andre <andre@softwareradiosystems.com> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>