<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/20670">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">sysmocom: Introduce test to verify emergency call preemption<br><br>Change-Id: I59993e65b3fd34fb2c3e5b002ab9666db9b7bad5<br>---<br>A sysmocom/suites/emergency/emergency_preemptive_call.py<br>M sysmocom/suites/emergency/suite.conf<br>2 files changed, 100 insertions(+), 1 deletion(-)<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/70/20670/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/sysmocom/suites/emergency/emergency_preemptive_call.py b/sysmocom/suites/emergency/emergency_preemptive_call.py</span><br><span>new file mode 100755</span><br><span>index 0000000..b4fba4b</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/suites/emergency/emergency_preemptive_call.py</span><br><span>@@ -0,0 +1,99 @@</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%);">+hlr = tenv.hlr()</span><br><span style="color: hsl(120, 100%, 40%);">+bts = 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%);">+ms_mo_emerg = tenv.modem()</span><br><span style="color: hsl(120, 100%, 40%);">+ms_mt_emerg = tenv.modem()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Configure timeslots so that only 1 concurrent call (MO MT, 2 MS) is allowed</span><br><span style="color: hsl(120, 100%, 40%);">+bts.set_num_trx(1)</span><br><span style="color: hsl(120, 100%, 40%);">+bts.set_trx_phy_channel(0, 0, 'CCCH+SDCCH4')</span><br><span style="color: hsl(120, 100%, 40%);">+bts.set_trx_phy_channel(0, 1, 'TCH/F')</span><br><span style="color: hsl(120, 100%, 40%);">+bts.set_trx_phy_channel(0, 2, 'TCH/F')</span><br><span style="color: hsl(120, 100%, 40%);">+bts.set_trx_phy_channel(0, 3, 'PDCH')</span><br><span style="color: hsl(120, 100%, 40%);">+bts.set_trx_phy_channel(0, 4, 'PDCH')</span><br><span style="color: hsl(120, 100%, 40%);">+bts.set_trx_phy_channel(0, 5, 'PDCH')</span><br><span style="color: hsl(120, 100%, 40%);">+bts.set_trx_phy_channel(0, 6, 'PDCH')</span><br><span style="color: hsl(120, 100%, 40%);">+bts.set_trx_phy_channel(0, 7, 'PDCH')</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Set MSC to route emergency call to ms_mt_emerg:</span><br><span style="color: hsl(120, 100%, 40%);">+msc.set_emergency_call_msisdn(ms_mt_emerg.msisdn())</span><br><span style="color: hsl(120, 100%, 40%);">+msc.start()</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bsc.bts_add(bts)</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%);">+bts.start()</span><br><span style="color: hsl(120, 100%, 40%);">+wait(bsc.bts_is_connected, bts)</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%);">+hlr.subscriber_add(ms_mo_emerg)</span><br><span style="color: hsl(120, 100%, 40%);">+hlr.subscriber_add(ms_mt_emerg)</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%);">+ms_mo_emerg.connect(msc.mcc_mnc())</span><br><span style="color: hsl(120, 100%, 40%);">+ms_mt_emerg.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%);">+ms_mo_emerg.log_info()</span><br><span style="color: hsl(120, 100%, 40%);">+ms_mt_emerg.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%);">+wait(ms_mo.is_registered, msc.mcc_mnc())</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%);">+wait(ms_mo_emerg.is_registered, msc.mcc_mnc())</span><br><span style="color: hsl(120, 100%, 40%);">+wait(ms_mt_emerg.is_registered, msc.mcc_mnc())</span><br><span style="color: hsl(120, 100%, 40%);">+wait(msc.subscriber_attached, ms_mo, ms_mt, ms_mo_emerg, ms_mt_emerg)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Initiating first call between ms_mo and ms_mt. It should be dropped when later an emergency call comes in</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%);">+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%);">+assert len(ms_mo.call_id_list()) == 1 and len(ms_mt.call_id_list()) == 1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+sleep(5) # maintain the normal call active for 5 seconds</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()) == 1 and len(ms_mt.call_id_list()) == 1</span><br><span style="color: hsl(120, 100%, 40%);">+assert len(ms_mo_emerg.call_id_list()) == 0 and len(ms_mt_emerg.call_id_list()) == 0</span><br><span style="color: hsl(120, 100%, 40%);">+# Calling emergency number should be redirected to ms_mt as configured further above:</span><br><span style="color: hsl(120, 100%, 40%);">+emerg_numbers = ms_mo_emerg.emergency_numbers()</span><br><span style="color: hsl(120, 100%, 40%);">+assert len(emerg_numbers) > 0</span><br><span style="color: hsl(120, 100%, 40%);">+print('dialing Emergency Number %s' % (emerg_numbers[0]))</span><br><span style="color: hsl(120, 100%, 40%);">+mo_cid_emerg = ms_mo_emerg.call_dial(emerg_numbers[0])</span><br><span style="color: hsl(120, 100%, 40%);">+mt_cid_emerg = ms_mt_emerg.call_wait_incoming(ms_mo_emerg)</span><br><span style="color: hsl(120, 100%, 40%);">+print('dial success')</span><br><span style="color: hsl(120, 100%, 40%);">+assert not ms_mo_emerg.call_is_active(mo_cid_emerg) and not ms_mt_emerg.call_is_active(mt_cid_emerg)</span><br><span style="color: hsl(120, 100%, 40%);">+ms_mt_emerg.call_answer(mt_cid_emerg)</span><br><span style="color: hsl(120, 100%, 40%);">+wait(ms_mo_emerg.call_is_active, mo_cid_emerg)</span><br><span style="color: hsl(120, 100%, 40%);">+wait(ms_mt_emerg.call_is_active, mt_cid_emerg)</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%);">+# Now the emergency call is ongoing, and the previous one should have been gone:</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+sleep(5) # maintain the emergency call active for 5 seconds</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+assert ms_mo_emerg.call_is_active(mo_cid_emerg) and ms_mt.call_is_active(mt_cid_emerg)</span><br><span style="color: hsl(120, 100%, 40%);">+ms_mt_emerg.call_hangup(mt_cid_emerg)</span><br><span style="color: hsl(120, 100%, 40%);">+wait(lambda: len(ms_mo_emerg.call_id_list()) == 0 and len(ms_mt_emerg.call_id_list()) == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+print('hangup success')</span><br><span>diff --git a/sysmocom/suites/emergency/suite.conf b/sysmocom/suites/emergency/suite.conf</span><br><span>index eb0de71..8b9a712 100644</span><br><span>--- a/sysmocom/suites/emergency/suite.conf</span><br><span>+++ b/sysmocom/suites/emergency/suite.conf</span><br><span>@@ -4,7 +4,7 @@</span><br><span>   bts:</span><br><span>   - times: 1</span><br><span>   modem:</span><br><span style="color: hsl(0, 100%, 40%);">-  - times: 2</span><br><span style="color: hsl(120, 100%, 40%);">+  - times: 4</span><br><span>     features:</span><br><span>     - voice</span><br><span> modifiers:</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/20670">change 20670</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/+/20670"/><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: I59993e65b3fd34fb2c3e5b002ab9666db9b7bad5 </div>
<div style="display:none"> Gerrit-Change-Number: 20670 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>