<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/21523">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add handover_2G suite, with handover.py test<br><br>Via VTY, handover two lchans of a voice call from bts0 to bts1 and back.<br><br>New scenarios/bts1-* allow selecting various types for bts1,<br>complementing the already existing files for selecting bts0.<br><br>Change-Id: I0b2671304165a1aaae2b386af46fbd8b098e3bd8<br>---<br>M src/osmo_gsm_tester/obj/bsc_osmo.py<br>M src/osmo_gsm_tester/testenv.py<br>A sysmocom/handover-suites.conf<br>A sysmocom/scenarios/bts1-nanobts.conf<br>A sysmocom/scenarios/bts1-oc2g.conf<br>A sysmocom/scenarios/bts1-octphy.conf<br>A sysmocom/scenarios/bts1-sysmo.conf<br>A sysmocom/scenarios/bts1-trx-b200.conf<br>A sysmocom/scenarios/bts1-trx-lms-limenet-micro.conf<br>A sysmocom/scenarios/bts1-trx-lms.conf<br>A sysmocom/scenarios/bts1-trx-sysmocell5000.conf<br>A sysmocom/scenarios/bts1-trx-umtrx.conf<br>A sysmocom/suites/handover_2G/handover.py<br>A sysmocom/suites/handover_2G/suite.conf<br>14 files changed, 315 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-gsm-tester refs/changes/23/21523/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo_gsm_tester/obj/bsc_osmo.py b/src/osmo_gsm_tester/obj/bsc_osmo.py</span><br><span>index 62026e6..1be3277 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/bsc_osmo.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/bsc_osmo.py</span><br><span>@@ -154,6 +154,9 @@</span><br><span>     def vty(self):</span><br><span>         return OsmoBscVty(self)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    def ctrl(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return OsmoBscCtrl(self).ctrl()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     def get_active_lchans(self):</span><br><span>         lchan_summary = self.vty().cmd('show lchan summary')</span><br><span> </span><br><span>diff --git a/src/osmo_gsm_tester/testenv.py b/src/osmo_gsm_tester/testenv.py</span><br><span>index 651183c..c7e0f65 100644</span><br><span>--- a/src/osmo_gsm_tester/testenv.py</span><br><span>+++ b/src/osmo_gsm_tester/testenv.py</span><br><span>@@ -31,6 +31,7 @@</span><br><span> from .core import resource</span><br><span> from .core.event_loop import MainLoop</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+test = None</span><br><span> suite = None</span><br><span> log = None</span><br><span> dbg = None</span><br><span>diff --git a/sysmocom/handover-suites.conf b/sysmocom/handover-suites.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..623bbfb</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/handover-suites.conf</span><br><span>@@ -0,0 +1,36 @@</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:nanobts+bts1-oc2g</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:nanobts+bts1-octphy</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:nanobts+bts1-trx-lms</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:nanobts+bts1-trx-lms-limenet-micro</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:nanobts+bts1-trx-sysmocell5000</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:nanobts+bts1-sysmo</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:nanobts+bts1-trx-b200</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:nanobts+bts1-trx-umtrx</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:oc2g+bts1-octphy</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:oc2g+bts1-trx-lms</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:oc2g+bts1-trx-lms-limenet-micro</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:oc2g+bts1-trx-sysmocell5000</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:oc2g+bts1-sysmo</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:oc2g+bts1-trx-b200</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:oc2g+bts1-trx-umtrx</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:octphy+bts1-trx-lms</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:octphy+bts1-trx-lms-limenet-micro</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:octphy+bts1-trx-sysmocell5000</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:octphy+bts1-sysmo</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:octphy+bts1-trx-b200</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:octphy+bts1-trx-umtrx</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:trx-lms+bts1-trx-lms-limenet-micro</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:trx-lms+bts1-trx-sysmocell5000</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:trx-lms+bts1-sysmo</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:trx-lms+bts1-trx-b200</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:trx-lms+bts1-trx-umtrx</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:trx-lms-limenet-micro+bts1-trx-sysmocell5000</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:trx-lms-limenet-micro+bts1-sysmo</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:trx-lms-limenet-micro+bts1-trx-b200</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:trx-lms-limenet-micro+bts1-trx-umtrx</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:trx-sysmocell5000+bts1-sysmo</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:trx-sysmocell5000+bts1-trx-b200</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:trx-sysmocell5000+bts1-trx-umtrx</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:sysmo+bts1-trx-b200</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:sysmo+bts1-trx-umtrx</span><br><span style="color: hsl(120, 100%, 40%);">+- handover_2G:trx-b200+bts1-trx-umtrx</span><br><span>diff --git a/sysmocom/scenarios/bts1-nanobts.conf b/sysmocom/scenarios/bts1-nanobts.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..2425b7f</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/scenarios/bts1-nanobts.conf</span><br><span>@@ -0,0 +1,4 @@</span><br><span style="color: hsl(120, 100%, 40%);">+resources:</span><br><span style="color: hsl(120, 100%, 40%);">+  bts:</span><br><span style="color: hsl(120, 100%, 40%);">+  - {}</span><br><span style="color: hsl(120, 100%, 40%);">+  - type: nanobts</span><br><span>diff --git a/sysmocom/scenarios/bts1-oc2g.conf b/sysmocom/scenarios/bts1-oc2g.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..ff45d8e</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/scenarios/bts1-oc2g.conf</span><br><span>@@ -0,0 +1,4 @@</span><br><span style="color: hsl(120, 100%, 40%);">+resources:</span><br><span style="color: hsl(120, 100%, 40%);">+  bts:</span><br><span style="color: hsl(120, 100%, 40%);">+  - {}</span><br><span style="color: hsl(120, 100%, 40%);">+  - type: osmo-bts-oc2g</span><br><span>diff --git a/sysmocom/scenarios/bts1-octphy.conf b/sysmocom/scenarios/bts1-octphy.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..2eb51d1</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/scenarios/bts1-octphy.conf</span><br><span>@@ -0,0 +1,4 @@</span><br><span style="color: hsl(120, 100%, 40%);">+resources:</span><br><span style="color: hsl(120, 100%, 40%);">+  bts:</span><br><span style="color: hsl(120, 100%, 40%);">+  - {}</span><br><span style="color: hsl(120, 100%, 40%);">+  - type: osmo-bts-octphy</span><br><span>diff --git a/sysmocom/scenarios/bts1-sysmo.conf b/sysmocom/scenarios/bts1-sysmo.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..fa466a8</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/scenarios/bts1-sysmo.conf</span><br><span>@@ -0,0 +1,4 @@</span><br><span style="color: hsl(120, 100%, 40%);">+resources:</span><br><span style="color: hsl(120, 100%, 40%);">+  bts:</span><br><span style="color: hsl(120, 100%, 40%);">+  - {}</span><br><span style="color: hsl(120, 100%, 40%);">+  - type: osmo-bts-sysmo</span><br><span>diff --git a/sysmocom/scenarios/bts1-trx-b200.conf b/sysmocom/scenarios/bts1-trx-b200.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..9927b88</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/scenarios/bts1-trx-b200.conf</span><br><span>@@ -0,0 +1,5 @@</span><br><span style="color: hsl(120, 100%, 40%);">+resources:</span><br><span style="color: hsl(120, 100%, 40%);">+  bts:</span><br><span style="color: hsl(120, 100%, 40%);">+  - {}</span><br><span style="color: hsl(120, 100%, 40%);">+  - label: Ettus B200</span><br><span style="color: hsl(120, 100%, 40%);">+    type: osmo-bts-trx</span><br><span>diff --git a/sysmocom/scenarios/bts1-trx-lms-limenet-micro.conf b/sysmocom/scenarios/bts1-trx-lms-limenet-micro.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..e0536ec</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/scenarios/bts1-trx-lms-limenet-micro.conf</span><br><span>@@ -0,0 +1,5 @@</span><br><span style="color: hsl(120, 100%, 40%);">+resources:</span><br><span style="color: hsl(120, 100%, 40%);">+  bts:</span><br><span style="color: hsl(120, 100%, 40%);">+  - {}</span><br><span style="color: hsl(120, 100%, 40%);">+  - label: LimeNET-Micro</span><br><span style="color: hsl(120, 100%, 40%);">+    type: osmo-bts-trx</span><br><span>diff --git a/sysmocom/scenarios/bts1-trx-lms.conf b/sysmocom/scenarios/bts1-trx-lms.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..df644c0</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/scenarios/bts1-trx-lms.conf</span><br><span>@@ -0,0 +1,5 @@</span><br><span style="color: hsl(120, 100%, 40%);">+resources:</span><br><span style="color: hsl(120, 100%, 40%);">+  bts:</span><br><span style="color: hsl(120, 100%, 40%);">+  - {}</span><br><span style="color: hsl(120, 100%, 40%);">+  - label: LimeSDR-USB</span><br><span style="color: hsl(120, 100%, 40%);">+    type: osmo-bts-trx</span><br><span>diff --git a/sysmocom/scenarios/bts1-trx-sysmocell5000.conf b/sysmocom/scenarios/bts1-trx-sysmocell5000.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..d5d3069</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/scenarios/bts1-trx-sysmocell5000.conf</span><br><span>@@ -0,0 +1,5 @@</span><br><span style="color: hsl(120, 100%, 40%);">+resources:</span><br><span style="color: hsl(120, 100%, 40%);">+  bts:</span><br><span style="color: hsl(120, 100%, 40%);">+  - {}</span><br><span style="color: hsl(120, 100%, 40%);">+  - label: sysmoCell 5000</span><br><span style="color: hsl(120, 100%, 40%);">+    type: osmo-bts-trx</span><br><span>diff --git a/sysmocom/scenarios/bts1-trx-umtrx.conf b/sysmocom/scenarios/bts1-trx-umtrx.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..e8504bf</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/scenarios/bts1-trx-umtrx.conf</span><br><span>@@ -0,0 +1,5 @@</span><br><span style="color: hsl(120, 100%, 40%);">+resources:</span><br><span style="color: hsl(120, 100%, 40%);">+  bts:</span><br><span style="color: hsl(120, 100%, 40%);">+  - {}</span><br><span style="color: hsl(120, 100%, 40%);">+  - label: UmTRX</span><br><span style="color: hsl(120, 100%, 40%);">+    type: osmo-bts-trx</span><br><span>diff --git a/sysmocom/suites/handover_2G/handover.py b/sysmocom/suites/handover_2G/handover.py</span><br><span>new file mode 100755</span><br><span>index 0000000..f5476d9</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/suites/handover_2G/handover.py</span><br><span>@@ -0,0 +1,225 @@</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%);">+from osmo_gsm_tester.obj.osmo_ctrl import *</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+hlr = tenv.hlr()</span><br><span style="color: hsl(120, 100%, 40%);">+bts0 = tenv.bts()</span><br><span style="color: hsl(120, 100%, 40%);">+bts1 = tenv.bts()</span><br><span style="color: hsl(120, 100%, 40%);">+mgw_msc = tenv.mgw()</span><br><span style="color: hsl(120, 100%, 40%);">+mgw_bsc = tenv.mgw()</span><br><span style="color: hsl(120, 100%, 40%);">+stp = tenv.stp()</span><br><span style="color: hsl(120, 100%, 40%);">+msc = tenv.msc(hlr, mgw_msc, stp)</span><br><span style="color: hsl(120, 100%, 40%);">+bsc = tenv.bsc(msc, mgw_bsc, stp)</span><br><span style="color: hsl(120, 100%, 40%);">+ms_mo = tenv.modem()</span><br><span style="color: hsl(120, 100%, 40%);">+ms_mt = tenv.modem()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+hlr.start()</span><br><span style="color: hsl(120, 100%, 40%);">+stp.start()</span><br><span style="color: hsl(120, 100%, 40%);">+msc.start()</span><br><span style="color: hsl(120, 100%, 40%);">+mgw_msc.start()</span><br><span style="color: hsl(120, 100%, 40%);">+mgw_bsc.start()</span><br><span style="color: hsl(120, 100%, 40%);">+bsc.bts_add(bts0)</span><br><span style="color: hsl(120, 100%, 40%);">+bsc.bts_add(bts1)</span><br><span style="color: hsl(120, 100%, 40%);">+bsc.start()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# prevent handovers from measurement reports, enable handover so that</span><br><span style="color: hsl(120, 100%, 40%);">+# triggering handover from VTY works.</span><br><span style="color: hsl(120, 100%, 40%);">+bsc.vty().cmds(</span><br><span style="color: hsl(120, 100%, 40%);">+        'enable',</span><br><span style="color: hsl(120, 100%, 40%);">+         'configure terminal',</span><br><span style="color: hsl(120, 100%, 40%);">+          'network',</span><br><span style="color: hsl(120, 100%, 40%);">+           'handover algorithm 2',</span><br><span style="color: hsl(120, 100%, 40%);">+           'handover2 min rxlev -110',</span><br><span style="color: hsl(120, 100%, 40%);">+           'handover2 min rxqual 7',</span><br><span style="color: hsl(120, 100%, 40%);">+           'handover2 power budget hysteresis 999',</span><br><span style="color: hsl(120, 100%, 40%);">+           'handover 1')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# first start only the first BTS, to make sure both modems subscribe there</span><br><span style="color: hsl(120, 100%, 40%);">+with test.report_fragment('01_bts0_started'):</span><br><span style="color: hsl(120, 100%, 40%);">+    bts0.start()</span><br><span style="color: hsl(120, 100%, 40%);">+    wait(bsc.bts_is_connected, bts0)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+hlr.subscriber_add(ms_mo)</span><br><span style="color: hsl(120, 100%, 40%);">+hlr.subscriber_add(ms_mt)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ms_mo.connect(msc.mcc_mnc())</span><br><span style="color: hsl(120, 100%, 40%);">+ms_mt.connect(msc.mcc_mnc())</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ms_mo.log_info()</span><br><span style="color: hsl(120, 100%, 40%);">+ms_mt.log_info()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+print('waiting for modems to attach...')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+with test.report_fragment('02.1_ms0_attach'):</span><br><span style="color: hsl(120, 100%, 40%);">+    wait(ms_mo.is_registered, msc.mcc_mnc())</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+with test.report_fragment('02.2_ms1_attach'):</span><br><span style="color: hsl(120, 100%, 40%);">+    wait(ms_mt.is_registered, msc.mcc_mnc())</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+with test.report_fragment('02.3_subscribed_in_msc'):</span><br><span style="color: hsl(120, 100%, 40%);">+    wait(msc.subscriber_attached, ms_mo, ms_mt)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+assert len(ms_mo.call_id_list()) == 0 and len(ms_mt.call_id_list()) == 0</span><br><span style="color: hsl(120, 100%, 40%);">+mo_cid = ms_mo.call_dial(ms_mt)</span><br><span style="color: hsl(120, 100%, 40%);">+mt_cid = ms_mt.call_wait_incoming(ms_mo)</span><br><span style="color: hsl(120, 100%, 40%);">+print('dial success')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+with test.report_fragment('03_call_established'):</span><br><span style="color: hsl(120, 100%, 40%);">+    assert not ms_mo.call_is_active(mo_cid) and not ms_mt.call_is_active(mt_cid)</span><br><span style="color: hsl(120, 100%, 40%);">+    ms_mt.call_answer(mt_cid)</span><br><span style="color: hsl(120, 100%, 40%);">+    wait(ms_mo.call_is_active, mo_cid)</span><br><span style="color: hsl(120, 100%, 40%);">+    wait(ms_mt.call_is_active, mt_cid)</span><br><span style="color: hsl(120, 100%, 40%);">+    print('answer success, call established and ongoing')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    assert bsc.active_lchans_match(</span><br><span style="color: hsl(120, 100%, 40%);">+            expected=('0-0-2-0 TCH/F ESTABLISHED',</span><br><span style="color: hsl(120, 100%, 40%);">+                      '0-0-3-0 TCH/F ESTABLISHED'))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# call is connected; start up the second BTS so that we can trigger a handover to it</span><br><span style="color: hsl(120, 100%, 40%);">+with test.report_fragment('04.1_bts1_started'):</span><br><span style="color: hsl(120, 100%, 40%);">+    bts1.start()</span><br><span style="color: hsl(120, 100%, 40%);">+    wait(bsc.bts_is_connected, bts1)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+print('wait a bit for modems to see bts1')</span><br><span style="color: hsl(120, 100%, 40%);">+sleep(10.0)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+print('starting the second BTS probably took a while, check on the ongoing call')</span><br><span style="color: hsl(120, 100%, 40%);">+assert bsc.active_lchans_match(</span><br><span style="color: hsl(120, 100%, 40%);">+        expected=('0-0-2-0 TCH/F ESTABLISHED',</span><br><span style="color: hsl(120, 100%, 40%);">+                  '0-0-3-0 TCH/F ESTABLISHED'))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+with bsc.ctrl() as bsc_ctrl:</span><br><span style="color: hsl(120, 100%, 40%);">+    counter_names = (</span><br><span style="color: hsl(120, 100%, 40%);">+            'handover:completed',</span><br><span style="color: hsl(120, 100%, 40%);">+            'handover:stopped',</span><br><span style="color: hsl(120, 100%, 40%);">+            'handover:no_channel',</span><br><span style="color: hsl(120, 100%, 40%);">+            'handover:timeout',</span><br><span style="color: hsl(120, 100%, 40%);">+            'handover:failed',</span><br><span style="color: hsl(120, 100%, 40%);">+            'handover:error',</span><br><span style="color: hsl(120, 100%, 40%);">+            )</span><br><span style="color: hsl(120, 100%, 40%);">+    counters = RateCounters('bsc', counter_names, from_ctrl=bsc_ctrl)</span><br><span style="color: hsl(120, 100%, 40%);">+    counters.add(RateCounters('bts', counter_names, instances=(0, 1)))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def do_handover(initial_lchans, target_lchan, vty_cmd, final_lchans, attempts=5):</span><br><span style="color: hsl(120, 100%, 40%);">+        worked = False</span><br><span style="color: hsl(120, 100%, 40%);">+        while (attempts > 0) and (not worked):</span><br><span style="color: hsl(120, 100%, 40%);">+            # make sure the call is still active as expected</span><br><span style="color: hsl(120, 100%, 40%);">+            assert bsc.active_lchans_match(**initial_lchans)</span><br><span style="color: hsl(120, 100%, 40%);">+            # make sure the handover target lchan is unused (maybe waiting after previous error)</span><br><span style="color: hsl(120, 100%, 40%);">+            wait(bsc.active_lchans_match, **target_lchan, timeout=20)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            counters.read()</span><br><span style="color: hsl(120, 100%, 40%);">+            log_mark = bsc.process.get_output_mark('stderr')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            print('trigger handover: %s' % vty_cmd)</span><br><span style="color: hsl(120, 100%, 40%);">+            bsc.vty().cmds('enable', vty_cmd)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            print('wait for handover counters to change...')</span><br><span style="color: hsl(120, 100%, 40%);">+            wait_no_raise(counters.changed, timeout=20)</span><br><span style="color: hsl(120, 100%, 40%);">+            print(counters.diff.str(skip_zero_vals=True))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            print('\n'+'\n'.join(bsc.process.grep_output('stderr', r'\bhandover\(|\bDCHAN\b', log_mark)))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            worked = bsc.active_lchans_match(**final_lchans)</span><br><span style="color: hsl(120, 100%, 40%);">+            if not worked and attempts > 0:</span><br><span style="color: hsl(120, 100%, 40%);">+                attempts -= 1</span><br><span style="color: hsl(120, 100%, 40%);">+                print('did not work, try again... (attempts left: %d)' % attempts)</span><br><span style="color: hsl(120, 100%, 40%);">+        return worked</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    with test.report_fragment('05.1_handover'):</span><br><span style="color: hsl(120, 100%, 40%);">+        assert do_handover(</span><br><span style="color: hsl(120, 100%, 40%);">+            initial_lchans=dict(</span><br><span style="color: hsl(120, 100%, 40%);">+                    expected=('0-0-2-0 TCH/F ESTABLISHED',</span><br><span style="color: hsl(120, 100%, 40%);">+                              '0-0-3-0 TCH/F ESTABLISHED'),</span><br><span style="color: hsl(120, 100%, 40%);">+                ),</span><br><span style="color: hsl(120, 100%, 40%);">+            target_lchan=dict(</span><br><span style="color: hsl(120, 100%, 40%);">+                    not_expected=('1-0-2-0',),</span><br><span style="color: hsl(120, 100%, 40%);">+                ),</span><br><span style="color: hsl(120, 100%, 40%);">+            vty_cmd='bts 0 trx 0 timeslot 2 sub-slot 0 handover 1',</span><br><span style="color: hsl(120, 100%, 40%);">+            final_lchans=dict(</span><br><span style="color: hsl(120, 100%, 40%);">+                    expected=('0-0-3-0 TCH/F ESTABLISHED',</span><br><span style="color: hsl(120, 100%, 40%);">+                              '1-0-2-0 TCH/F ESTABLISHED',),</span><br><span style="color: hsl(120, 100%, 40%);">+                    not_expected=('0-0-2-0 TCH/F ESTABLISHED',),</span><br><span style="color: hsl(120, 100%, 40%);">+                ),</span><br><span style="color: hsl(120, 100%, 40%);">+            )</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    with test.report_fragment('05.2_handover'):</span><br><span style="color: hsl(120, 100%, 40%);">+        assert do_handover(</span><br><span style="color: hsl(120, 100%, 40%);">+            initial_lchans=dict(</span><br><span style="color: hsl(120, 100%, 40%);">+                    expected=('0-0-3-0 TCH/F ESTABLISHED',</span><br><span style="color: hsl(120, 100%, 40%);">+                              '1-0-2-0 TCH/F ESTABLISHED'),</span><br><span style="color: hsl(120, 100%, 40%);">+                ),</span><br><span style="color: hsl(120, 100%, 40%);">+            target_lchan=dict(</span><br><span style="color: hsl(120, 100%, 40%);">+                    not_expected=('1-0-3-0',),</span><br><span style="color: hsl(120, 100%, 40%);">+                ),</span><br><span style="color: hsl(120, 100%, 40%);">+            vty_cmd='bts 0 trx 0 timeslot 3 sub-slot 0 handover 1',</span><br><span style="color: hsl(120, 100%, 40%);">+            final_lchans=dict(</span><br><span style="color: hsl(120, 100%, 40%);">+                    expected=('1-0-2-0 TCH/F ESTABLISHED',</span><br><span style="color: hsl(120, 100%, 40%);">+                              '1-0-3-0 TCH/F ESTABLISHED',),</span><br><span style="color: hsl(120, 100%, 40%);">+                    not_expected=('0-0-2-0 TCH/F ESTABLISHED',</span><br><span style="color: hsl(120, 100%, 40%);">+                                  '0-0-3-0 TCH/F ESTABLISHED',),</span><br><span style="color: hsl(120, 100%, 40%);">+                ),</span><br><span style="color: hsl(120, 100%, 40%);">+            )</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    with test.report_fragment('06_call_stable'):</span><br><span style="color: hsl(120, 100%, 40%);">+        print('expect the call to continue for a while, to ensure the new lchan is functional')</span><br><span style="color: hsl(120, 100%, 40%);">+        for i in range(5):</span><br><span style="color: hsl(120, 100%, 40%);">+                sleep(5)</span><br><span style="color: hsl(120, 100%, 40%);">+                assert bsc.active_lchans_match(</span><br><span style="color: hsl(120, 100%, 40%);">+                        expected=('1-0-2-0 TCH/F ESTABLISHED',</span><br><span style="color: hsl(120, 100%, 40%);">+                                  '1-0-3-0 TCH/F ESTABLISHED',))</span><br><span style="color: hsl(120, 100%, 40%);">+                print('call is still fine')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    print('handover back (test the other BTS model)')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    with test.report_fragment('07.1_handover'):</span><br><span style="color: hsl(120, 100%, 40%);">+        assert do_handover(</span><br><span style="color: hsl(120, 100%, 40%);">+            initial_lchans=dict(</span><br><span style="color: hsl(120, 100%, 40%);">+                    expected=('1-0-2-0 TCH/F ESTABLISHED',</span><br><span style="color: hsl(120, 100%, 40%);">+                              '1-0-3-0 TCH/F ESTABLISHED'),</span><br><span style="color: hsl(120, 100%, 40%);">+                ),</span><br><span style="color: hsl(120, 100%, 40%);">+            target_lchan=dict(</span><br><span style="color: hsl(120, 100%, 40%);">+                    not_expected=('0-0-2-0',),</span><br><span style="color: hsl(120, 100%, 40%);">+                ),</span><br><span style="color: hsl(120, 100%, 40%);">+            vty_cmd='bts 1 trx 0 timeslot 3 sub-slot 0 handover 0',</span><br><span style="color: hsl(120, 100%, 40%);">+            final_lchans=dict(</span><br><span style="color: hsl(120, 100%, 40%);">+                    expected=('0-0-2-0 TCH/F ESTABLISHED',</span><br><span style="color: hsl(120, 100%, 40%);">+                              '1-0-2-0 TCH/F ESTABLISHED',),</span><br><span style="color: hsl(120, 100%, 40%);">+                    not_expected=('1-0-3-0 TCH/F ESTABLISHED',),</span><br><span style="color: hsl(120, 100%, 40%);">+                ),</span><br><span style="color: hsl(120, 100%, 40%);">+            )</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    with test.report_fragment('07.2_handover'):</span><br><span style="color: hsl(120, 100%, 40%);">+        assert do_handover(</span><br><span style="color: hsl(120, 100%, 40%);">+            initial_lchans=dict(</span><br><span style="color: hsl(120, 100%, 40%);">+                    expected=('0-0-2-0 TCH/F ESTABLISHED',</span><br><span style="color: hsl(120, 100%, 40%);">+                              '1-0-2-0 TCH/F ESTABLISHED'),</span><br><span style="color: hsl(120, 100%, 40%);">+                ),</span><br><span style="color: hsl(120, 100%, 40%);">+            target_lchan=dict(</span><br><span style="color: hsl(120, 100%, 40%);">+                    not_expected=('0-0-3-0',),</span><br><span style="color: hsl(120, 100%, 40%);">+                ),</span><br><span style="color: hsl(120, 100%, 40%);">+            vty_cmd='bts 1 trx 0 timeslot 2 sub-slot 0 handover 0',</span><br><span style="color: hsl(120, 100%, 40%);">+            final_lchans=dict(</span><br><span style="color: hsl(120, 100%, 40%);">+                    expected=('0-0-2-0 TCH/F ESTABLISHED',</span><br><span style="color: hsl(120, 100%, 40%);">+                              '0-0-3-0 TCH/F ESTABLISHED',),</span><br><span style="color: hsl(120, 100%, 40%);">+                    not_expected=('1-0-2-0 TCH/F ESTABLISHED',</span><br><span style="color: hsl(120, 100%, 40%);">+                                  '1-0-3-0 TCH/F ESTABLISHED',),</span><br><span style="color: hsl(120, 100%, 40%);">+                ),</span><br><span style="color: hsl(120, 100%, 40%);">+            )</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    with test.report_fragment('08_call_stable'):</span><br><span style="color: hsl(120, 100%, 40%);">+        print('expect the call to continue for a while, to ensure the new lchan is functional')</span><br><span style="color: hsl(120, 100%, 40%);">+        for i in range(5):</span><br><span style="color: hsl(120, 100%, 40%);">+                sleep(5)</span><br><span style="color: hsl(120, 100%, 40%);">+                assert bsc.active_lchans_match(</span><br><span style="color: hsl(120, 100%, 40%);">+                        expected=('0-0-2-0 TCH/F ESTABLISHED',</span><br><span style="color: hsl(120, 100%, 40%);">+                                  '0-0-3-0 TCH/F ESTABLISHED',))</span><br><span style="color: hsl(120, 100%, 40%);">+                print('call is still fine')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    assert ms_mo.call_is_active(mo_cid) and ms_mt.call_is_active(mt_cid)</span><br><span style="color: hsl(120, 100%, 40%);">+    ms_mt.call_hangup(mt_cid)</span><br><span style="color: hsl(120, 100%, 40%);">+    wait(lambda: len(ms_mo.call_id_list()) == 0 and len(ms_mt.call_id_list()) == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+    print('hangup success')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# vim: tabstop=4 shiftwidth=4 expandtab</span><br><span>diff --git a/sysmocom/suites/handover_2G/suite.conf b/sysmocom/suites/handover_2G/suite.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..00d3fca</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/suites/handover_2G/suite.conf</span><br><span>@@ -0,0 +1,9 @@</span><br><span style="color: hsl(120, 100%, 40%);">+resources:</span><br><span style="color: hsl(120, 100%, 40%);">+  ip_address:</span><br><span style="color: hsl(120, 100%, 40%);">+  - times: 6 # msc, bsc, hlr, stp, mgw*2</span><br><span style="color: hsl(120, 100%, 40%);">+  bts:</span><br><span style="color: hsl(120, 100%, 40%);">+  - times: 2</span><br><span style="color: hsl(120, 100%, 40%);">+  modem:</span><br><span style="color: hsl(120, 100%, 40%);">+  - times: 2</span><br><span style="color: hsl(120, 100%, 40%);">+    features:</span><br><span style="color: hsl(120, 100%, 40%);">+    - voice</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/21523">change 21523</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/+/21523"/><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: I0b2671304165a1aaae2b386af46fbd8b098e3bd8 </div>
<div style="display:none"> Gerrit-Change-Number: 21523 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>