<p>osmith has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/14402">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">hlr: add Check IMEI tests<br><br>Create tests for all 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, 165 insertions(+), 6 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/02/14402/1</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 21089dd..fd246fd 100644</span><br><span>--- a/hlr/HLR_Tests.ttcn</span><br><span>+++ b/hlr/HLR_Tests.ttcn</span><br><span>@@ -356,6 +356,21 @@</span><br><span>        f_vty_transceive_match(VTY, prefix & "show", exp, invert);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/***********************************************************************</span><br><span style="color: hsl(120, 100%, 40%);">+ * VTY Configuration</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%);">+function f_vty_config_store_imei(TELNETasp_PT VTY, boolean enable) {</span><br><span style="color: hsl(120, 100%, 40%);">+  f_vty_transceive(VTY, "configure terminal");</span><br><span style="color: hsl(120, 100%, 40%);">+        f_vty_transceive(VTY, "hlr");</span><br><span style="color: hsl(120, 100%, 40%);">+       if (enable) {</span><br><span style="color: hsl(120, 100%, 40%);">+         f_vty_transceive(VTY, "store-imei");</span><br><span style="color: hsl(120, 100%, 40%);">+        } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              f_vty_transceive(VTY, "no store-imei");</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_transceive(VTY, "exit");</span><br><span style="color: hsl(120, 100%, 40%);">+      f_vty_transceive(VTY, "exit");</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> /***********************************************************************</span><br><span>  * Helper functions for ConnHdlr</span><br><span>@@ -566,6 +581,48 @@</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 return GSUP_PDU {</span><br><span style="color: hsl(120, 100%, 40%);">+ var GSUP_PDU ret;</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 ret {</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 ret {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Unexpected CHECK IMEI ERROR Cause");</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 ret {</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 ret {</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 ret {</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 ret {</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%);">+     return ret;</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>@@ -1082,6 +1139,81 @@</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%);">+     var GSUP_PDU res;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* store-imei disabled */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_config_store_imei(VTY, false);</span><br><span style="color: hsl(120, 100%, 40%);">+  res := f_perform_CHECK_IMEI(g_pars.sub.imsi, '12345678901234'H,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   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*", invert := true);</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_store_imei(VTY, true);</span><br><span style="color: hsl(120, 100%, 40%);">+   res := f_perform_CHECK_IMEI(g_pars.sub.imsi, '12345678901234'H,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   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%);">+     var GSUP_PDU res;</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%);">+    var GSUP_PDU res;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* IMEI too long */</span><br><span style="color: hsl(120, 100%, 40%);">+   res := f_perform_CHECK_IMEI(g_pars.sub.imsi, '111456789012345F'H, 96 /* Invalid Mandatory Information */);</span><br><span style="color: hsl(120, 100%, 40%);">+    res := 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%);">+  res := f_perform_CHECK_IMEI(g_pars.sub.imsi, '3334567890123F'H, 96 /* Invalid Mandatory Information */);</span><br><span style="color: hsl(120, 100%, 40%);">+      res := f_perform_CHECK_IMEI(g_pars.sub.imsi, '444456789012'H, 96 /* Invalid Mandatory Information */);</span><br><span style="color: hsl(120, 100%, 40%);">+        res := 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%);">+     var GSUP_PDU res;</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%);">+  var GSUP_PDU res;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_vty_config_store_imei(VTY, false);</span><br><span style="color: hsl(120, 100%, 40%);">+  res := 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_store_imei(VTY, true);</span><br><span style="color: hsl(120, 100%, 40%);">+   res := 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>@@ -1116,6 +1248,10 @@</span><br><span>  execute( TC_mo_ussd_euse_continue() );</span><br><span>       execute( TC_mo_ussd_euse_defaultroute() );</span><br><span> </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 style="color: hsl(120, 100%, 40%);">+</span><br><span>      /* "Structured" Supplementary Services */</span><br><span>  execute( TC_mo_sss_reject() );</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: 1 </div>
<div style="display:none"> Gerrit-Owner: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>