<p>neels <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/21523">View Change</a></p><div style="white-space:pre-wrap"></div><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/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>13 files changed, 309 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo_gsm_tester/testenv.py b/src/osmo_gsm_tester/testenv.py</span><br><span>index dc7aee0..e1d3a0a 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..a65b56f</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/suites/handover_2G/handover.py</span><br><span>@@ -0,0 +1,222 @@</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%);">+ms0 = tenv.modem()</span><br><span style="color: hsl(120, 100%, 40%);">+ms1 = 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%);">+         'end')</span><br><span style="color: hsl(120, 100%, 40%);">+# now back on the 'enable' node.</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(ms0)</span><br><span style="color: hsl(120, 100%, 40%);">+hlr.subscriber_add(ms1)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ms0.connect(msc.mcc_mnc())</span><br><span style="color: hsl(120, 100%, 40%);">+ms1.connect(msc.mcc_mnc())</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ms0.log_info()</span><br><span style="color: hsl(120, 100%, 40%);">+ms1.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(ms0.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(ms1.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, ms0, ms1)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+assert len(ms0.call_id_list()) == 0 and len(ms1.call_id_list()) == 0</span><br><span style="color: hsl(120, 100%, 40%);">+mo_cid = ms0.call_dial(ms1)</span><br><span style="color: hsl(120, 100%, 40%);">+mt_cid = ms1.call_wait_incoming(ms0)</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 ms0.call_is_active(mo_cid) and not ms1.call_is_active(mt_cid)</span><br><span style="color: hsl(120, 100%, 40%);">+    ms1.call_answer(mt_cid)</span><br><span style="color: hsl(120, 100%, 40%);">+    wait(ms0.call_is_active, mo_cid)</span><br><span style="color: hsl(120, 100%, 40%);">+    wait(ms1.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.vty.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%);">+# TODO evaluate measurement reports instead?</span><br><span style="color: hsl(120, 100%, 40%);">+</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.vty.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.vty.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.cmd(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(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.vty.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_ms0'):</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_ms1'):</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.vty.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_ms1_back'):</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_ms0_back'):</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.vty.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 ms0.call_is_active(mo_cid) and ms1.call_is_active(mt_cid)</span><br><span style="color: hsl(120, 100%, 40%);">+ms1.call_hangup(mt_cid)</span><br><span style="color: hsl(120, 100%, 40%);">+wait(lambda: len(ms0.call_id_list()) == 0 and len(ms1.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: 4 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-CC: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>