<p>laforge <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/14402">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  fixeria: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">hlr: add Check IMEI tests<br><br>Create tests for most code paths of rx_check_imei_req() in hlr.c (except<br>for subscriber create on demand, this will be in an upcoming patch).<br><br>Add missing message types to GSUP_Types.ttcn, and adjust the IMEI and<br>IMEI_Result IEs for consistency with the existing IEs, and to make the<br>tests compile.<br><br>Related: OS#2541<br>Change-Id: I97c8462f0817149feadd0c4865e3df6c2af92a80<br>---<br>M hlr/HLR_Tests.ttcn<br>M library/GSUP_Types.ttcn<br>2 files changed, 139 insertions(+), 6 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/hlr/HLR_Tests.ttcn b/hlr/HLR_Tests.ttcn</span><br><span>index e58515b..4c158fd 100644</span><br><span>--- a/hlr/HLR_Tests.ttcn</span><br><span>+++ b/hlr/HLR_Tests.ttcn</span><br><span>@@ -574,6 +574,47 @@</span><br><span>        return ret;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+function f_perform_CHECK_IMEI(hexstring imsi, hexstring imei,</span><br><span style="color: hsl(120, 100%, 40%);">+                         template (omit) integer exp_err_cause := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                        template (omit) GSUP_IMEIResult result := omit)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on HLR_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ var GSUP_PDU pdu;</span><br><span style="color: hsl(120, 100%, 40%);">+     timer T := 3.0;</span><br><span style="color: hsl(120, 100%, 40%);">+       var boolean exp_fail := false;</span><br><span style="color: hsl(120, 100%, 40%);">+        if (not istemplatekind(exp_err_cause, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+            exp_fail := true;</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%);">+   GSUP.send(valueof(ts_GSUP_CHECK_IMEI_REQ(imsi, imei)));</span><br><span style="color: hsl(120, 100%, 40%);">+       T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_ERR(imsi, exp_err_cause)) -> value pdu {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_ERR(imsi, ?)) -> value pdu {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Unexpected CHECK IMEI ERROR Cause: ", pdu);</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_RES(imsi, ?)) -> value pdu {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Unexpected CHECK IMEI RES instead of ERR");</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [not exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_ERR(imsi, ?)) -> value pdu {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Unexpected CHECK IMEI ERROR");</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+     [not exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_RES(imsi, result)) -> value pdu {</span><br><span style="color: hsl(120, 100%, 40%);">+           setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [not exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_RES(imsi, ?)) -> value pdu {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Unexpected CHECK IMEI RES");</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] GSUP.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+   [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Timeout waiting for CHECK IMEI response");</span><br><span style="color: hsl(120, 100%, 40%);">+                mtc.stop;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> </span><br><span> /***********************************************************************</span><br><span>@@ -1090,6 +1131,71 @@</span><br><span>    * timeout cases</span><br><span>  */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test Check IMEI */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_gsup_check_imei() runs on HLR_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+       /* store-imei disabled */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_config(VTY, "hlr", "no store-imei");</span><br><span style="color: hsl(120, 100%, 40%);">+        f_perform_CHECK_IMEI(g_pars.sub.imsi, '12345678901234'H, result := OSMO_GSUP_IMEI_RESULT_ACK);</span><br><span style="color: hsl(120, 100%, 40%);">+        f_vty_subscr_show_nomatch(VTY, g_pars.sub, pattern "*IMEI: *12345678901234*");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* store-imei enabled */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_vty_config(VTY, "hlr", "store-imei");</span><br><span style="color: hsl(120, 100%, 40%);">+   f_perform_CHECK_IMEI(g_pars.sub.imsi, '12345678901234'H, result := OSMO_GSUP_IMEI_RESULT_ACK);</span><br><span style="color: hsl(120, 100%, 40%);">+        f_vty_subscr_show(VTY, g_pars.sub, pattern "*IMEI: *12345678901234*");</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_gsup_check_imei() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  var HlrSubscriberList sl;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init(false);</span><br><span style="color: hsl(120, 100%, 40%);">+        sl := f_gen_subs();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_start_handler_per_sub(refers(f_TC_gsup_check_imei), sl);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  setverdict(pass);</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%);">+/* Test Check IMEI with invalid IMEI length */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_gsup_check_imei_invalid_len() runs on HLR_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+    /* IMEI too long */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_perform_CHECK_IMEI(g_pars.sub.imsi, '111456789012345F'H, 96 /* Invalid Mandatory Information */);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_perform_CHECK_IMEI(g_pars.sub.imsi, '2224567890123456'H, 96 /* Invalid Mandatory Information */);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* IMEI too short */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_perform_CHECK_IMEI(g_pars.sub.imsi, '3334567890123F'H, 96 /* Invalid Mandatory Information */);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_perform_CHECK_IMEI(g_pars.sub.imsi, '444456789012'H, 96 /* Invalid Mandatory Information */);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_perform_CHECK_IMEI(g_pars.sub.imsi, ''H, 96 /* Invalid Mandatory Information */);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_gsup_check_imei_invalid_len() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var HlrSubscriberList sl;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init(false);</span><br><span style="color: hsl(120, 100%, 40%);">+        sl := f_gen_subs();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_start_handler_per_sub(refers(f_TC_gsup_check_imei_invalid_len), sl);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      setverdict(pass);</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%);">+/* Test Check IMEI with unknown IMSI */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_gsup_check_imei_unknown_imsi() runs on HLR_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+  f_vty_config(VTY, "hlr", "no store-imei");</span><br><span style="color: hsl(120, 100%, 40%);">+        f_perform_CHECK_IMEI(g_pars.sub.imsi, '22245678901234'H, 96 /* Invalid Mandatory Information */);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Check again with store-imei set (different code path) */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_vty_config(VTY, "hlr", "store-imei");</span><br><span style="color: hsl(120, 100%, 40%);">+   f_perform_CHECK_IMEI(g_pars.sub.imsi, '22245678901234'H, 96 /* Invalid Mandatory Information */);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_gsup_check_imei_unknown_imsi() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var hexstring imsi := f_rnd_imsi('26242'H);</span><br><span style="color: hsl(120, 100%, 40%);">+   var HLR_ConnHdlrPars pars := valueof(t_Pars(imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+   var HLR_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init(false);</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_conn := f_start_handler(refers(f_TC_gsup_check_imei_unknown_imsi), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+  vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* TODO:</span><br><span>   * UL with ISD error</span><br><span>   * UL with ISD timeout</span><br><span>@@ -1126,6 +1232,10 @@</span><br><span> </span><br><span>      /* "Structured" Supplementary Services */</span><br><span>  execute( TC_mo_sss_reject() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_gsup_check_imei() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_gsup_check_imei_invalid_len() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_gsup_check_imei_unknown_imsi() );</span><br><span> };</span><br><span> </span><br><span> };</span><br><span>diff --git a/library/GSUP_Types.ttcn b/library/GSUP_Types.ttcn</span><br><span>index 10cf1b8..8081347 100644</span><br><span>--- a/library/GSUP_Types.ttcn</span><br><span>+++ b/library/GSUP_Types.ttcn</span><br><span>@@ -419,6 +419,17 @@</span><br><span>        ies := ies</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+template (value) GSUP_IMEI ts_GSUP_IMEI(hexstring digits) := {</span><br><span style="color: hsl(120, 100%, 40%);">+   len := 0, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+   digits := digits</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%);">+template GSUP_IMEI tr_GSUP_IMEI(template hexstring digits) := {</span><br><span style="color: hsl(120, 100%, 40%);">+        len := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+     digits := digits</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> template (value) GSUP_PDU ts_GSUP_SAI_REQ(hexstring imsi) :=</span><br><span>      ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, { valueof(ts_GSUP_IE_IMSI(imsi)) });</span><br><span> </span><br><span>@@ -523,6 +534,18 @@</span><br><span>       tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_ERROR, {</span><br><span>             tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+template (value) GSUP_PDU ts_GSUP_CHECK_IMEI_REQ(hexstring imsi, hexstring imei) :=</span><br><span style="color: hsl(120, 100%, 40%);">+   ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_REQUEST, {</span><br><span style="color: hsl(120, 100%, 40%);">+                  valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_IMEI(imei)) });</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template GSUP_PDU tr_GSUP_CHECK_IMEI_RES(template hexstring imsi, template GSUP_IMEIResult result) :=</span><br><span style="color: hsl(120, 100%, 40%);">+   tr_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_RESULT, {</span><br><span style="color: hsl(120, 100%, 40%);">+           tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_IMEI_Result(result) });</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template GSUP_PDU tr_GSUP_CHECK_IMEI_ERR(template hexstring imsi, template integer cause) :=</span><br><span style="color: hsl(120, 100%, 40%);">+     tr_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_ERROR, {</span><br><span style="color: hsl(120, 100%, 40%);">+            tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> template (value) GSUP_IE ts_GSUP_IE_CancelType(GSUP_CancelType ctype) := {</span><br><span>       tag := OSMO_GSUP_CANCEL_TYPE_IE,</span><br><span>@@ -764,29 +787,29 @@</span><br><span>     }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template (value) GSUP_IE ts_GSUP_IE_IMEI_IE(GSUP_IMEI imei) := {</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) GSUP_IE ts_GSUP_IE_IMEI(hexstring imei) := {</span><br><span>    tag := OSMO_GSUP_IMEI_IE,</span><br><span>    len := 0, /* overwritten */</span><br><span>  val := {</span><br><span style="color: hsl(0, 100%, 40%);">-                imei := imei</span><br><span style="color: hsl(120, 100%, 40%);">+          imei := ts_GSUP_IMEI(imei)</span><br><span>   }</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-template GSUP_IE tr_GSUP_IE_IMEI_IE(template GSUP_IMEI imei) := {</span><br><span style="color: hsl(120, 100%, 40%);">+template GSUP_IE tr_GSUP_IE_IMEI(template hexstring imei) := {</span><br><span>      tag := OSMO_GSUP_IMEI_IE,</span><br><span>    len := ?,</span><br><span>    val := {</span><br><span style="color: hsl(0, 100%, 40%);">-                imei := imei</span><br><span style="color: hsl(120, 100%, 40%);">+          imei := tr_GSUP_IMEI(imei)</span><br><span>   }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template (value) GSUP_IE ts_GSUP_IE_IMEI_RESULT_IE(GSUP_IMEIResult result) := {</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) GSUP_IE ts_GSUP_IE_IMEI_Result(GSUP_IMEIResult result) := {</span><br><span>      tag := OSMO_GSUP_IMEI_RESULT_IE,</span><br><span>     len := 0, /* overwritten */</span><br><span>  val := {</span><br><span>             imei_result := result</span><br><span>        }</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-template GSUP_IE tr_GSUP_IE_IMEI_RESULT_IE(template GSUP_IMEIResult result) := {</span><br><span style="color: hsl(120, 100%, 40%);">+template GSUP_IE tr_GSUP_IE_IMEI_Result(template GSUP_IMEIResult result) := {</span><br><span>        tag := OSMO_GSUP_IMEI_RESULT_IE,</span><br><span>     len := ?,</span><br><span>    val := {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/14402">change 14402</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-ttcn3-hacks/+/14402"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ttcn3-hacks </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I97c8462f0817149feadd0c4865e3df6c2af92a80 </div>
<div style="display:none"> Gerrit-Change-Number: 14402 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>