<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/10405">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">HLR: Actual USSD test cases<br><br>Change-Id: I74a3419140179b1625e82d1298864e424fb81398<br>---<br>M hlr/HLR_Tests.ttcn<br>1 file changed, 338 insertions(+), 3 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 2bf5e57..29af522 100644</span><br><span>--- a/hlr/HLR_Tests.ttcn</span><br><span>+++ b/hlr/HLR_Tests.ttcn</span><br><span>@@ -8,6 +8,12 @@</span><br><span> import from Osmocom_Types all;</span><br><span> import from Osmocom_CTRL_Adapter all;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+import from TCCEncoding_Functions all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from SS_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from SS_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from MAP_Errors all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from USSD_Helpers all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> import from Osmocom_VTY_Functions all;</span><br><span> import from TELNETasp_PortType all;</span><br><span> </span><br><span>@@ -60,7 +66,12 @@</span><br><span> }</span><br><span> </span><br><span> type record HLR_ConnHdlrPars {</span><br><span style="color: hsl(0, 100%, 40%);">-  HlrSubscriber sub</span><br><span style="color: hsl(120, 100%, 40%);">+     HlrSubscriber sub,</span><br><span style="color: hsl(120, 100%, 40%);">+    HLR_ConnHdlrParsUssd ussd optional</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%);">+type record HLR_ConnHdlrParsUssd {</span><br><span style="color: hsl(120, 100%, 40%);">+   OCT4 sid</span><br><span> }</span><br><span> </span><br><span> template (value) HLR_ConnHdlrPars t_Pars(hexstring imsi, hexstring msisdn := ''H) := {</span><br><span>@@ -69,11 +80,13 @@</span><br><span>            msisdn := msisdn,</span><br><span>            aud2g := omit,</span><br><span>               aud3g := omit</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(120, 100%, 40%);">+     },</span><br><span style="color: hsl(120, 100%, 40%);">+    ussd := omit</span><br><span> }</span><br><span> </span><br><span> template (value) HLR_ConnHdlrPars t_Pars_sub(HlrSubscriber sub) := {</span><br><span style="color: hsl(0, 100%, 40%);">-   sub := sub</span><br><span style="color: hsl(120, 100%, 40%);">+    sub := sub,</span><br><span style="color: hsl(120, 100%, 40%);">+   ussd := omit</span><br><span> }</span><br><span> </span><br><span> type function void_fn() runs on HLR_ConnHdlr;</span><br><span>@@ -450,6 +463,91 @@</span><br><span>        return ret;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+function f_SS_xceive(hexstring imsi, OCT4 sid, GSUP_SessionState state, octetstring ss,</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%);">+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_PROC_SS_REQ(imsi, sid, state, ss)));</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_PROC_SS_ERR(imsi, sid, 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_PROC_SS_ERR(imsi, sid, ?)) -> value ret {</span><br><span style="color: hsl(120, 100%, 40%);">+          setverdict(fail, "Unexpected PROC_SS 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_PROC_SS_RES(imsi, sid, ?, ?)) -> value ret {</span><br><span style="color: hsl(120, 100%, 40%);">+               setverdict(fail, "Unexpected PROC_SS.res for unknown IMSI");</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_PROC_SS_ERR(imsi, sid, ?)) -> value ret {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(fail, "Unexpected PROC_SS 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_PROC_SS_RES(imsi, sid, ?, ?)) -> 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%);">+     [] 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 PROC_SS response");</span><br><span style="color: hsl(120, 100%, 40%);">+           self.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%);">+private function f_SS_expect(hexstring imsi, OCT4 sid, GSUP_SessionState state,</span><br><span style="color: hsl(120, 100%, 40%);">+                          template SS_FacilityInformation facility := *)</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_ss := true;</span><br><span style="color: hsl(120, 100%, 40%);">+   if (istemplatekind(facility, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+             exp_ss := false;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</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%);">+ [] GSUP.receive(tr_GSUP_PROC_SS_ERR(imsi, sid, ?)) -> value ret {</span><br><span style="color: hsl(120, 100%, 40%);">+          setverdict(fail, "Unexpected PROC_SS ERROR Cause");</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+     [not exp_ss] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, state, omit)) -> 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_ss] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, state, omit)) -> value ret {</span><br><span style="color: hsl(120, 100%, 40%);">+          setverdict(fail, "Unexpected PROC_SS.res without SS IE");</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%);">+ [exp_ss] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, state, decmatch facility)) -> 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%);">+*/</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       [exp_ss] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, state, ?)) -> value ret {</span><br><span style="color: hsl(120, 100%, 40%);">+             var GSUP_IeValue ss_ie;</span><br><span style="color: hsl(120, 100%, 40%);">+               f_gsup_find_ie(ret, OSMO_GSUP_SS_INFO_IE, ss_ie);</span><br><span style="color: hsl(120, 100%, 40%);">+             var SS_FacilityInformation dec_fac := dec_SS_FacilityInformation(ss_ie.ss_info);</span><br><span style="color: hsl(120, 100%, 40%);">+              log("pattern: ", facility);</span><br><span style="color: hsl(120, 100%, 40%);">+         if (match(dec_fac, facility)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      setverdict(fail, "Unexpected PROC_SS.res with non-matching facility IE");</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.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 PROC_SS response");</span><br><span style="color: hsl(120, 100%, 40%);">+           self.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%);">+   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>  * Testcases</span><br><span>@@ -675,6 +773,235 @@</span><br><span>   setverdict(pass);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+import from HLR_EUSE all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test for USSD request to undefined/unrouted short-code. Expect ss-NotAvailable(18) */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_mo_ussd_unknown() 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%);">+     var octetstring ss := f_USSD_FACILITY_IE_INVOKE(</span><br><span style="color: hsl(120, 100%, 40%);">+                                      op_code := SS_OP_CODE_PROCESS_USS_REQ,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        ussd_string := "*#200#");</span><br><span style="color: hsl(120, 100%, 40%);">+   GSUP.send(valueof(ts_GSUP_PROC_SS_REQ(g_pars.sub.imsi, g_pars.ussd.sid,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               OSMO_GSUP_SESSION_STATE_BEGIN, ss)));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_SS_expect(g_pars.sub.imsi, g_pars.ussd.sid, OSMO_GSUP_SESSION_STATE_END,</span><br><span style="color: hsl(120, 100%, 40%);">+                tr_SS_FACILITY_RETURN_ERROR(1, 18));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mo_ussd_unknown() 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 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%);">+        sl := f_gen_subs();</span><br><span style="color: hsl(120, 100%, 40%);">+   for (var integer i := 0; i < sizeof(sl); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               var HLR_ConnHdlrPars pars := valueof(t_Pars_sub(sl[i]));</span><br><span style="color: hsl(120, 100%, 40%);">+              pars.ussd.sid := f_rnd_octstring(4);</span><br><span style="color: hsl(120, 100%, 40%);">+          f_vty_subscr_create(VTY, pars.sub);</span><br><span style="color: hsl(120, 100%, 40%);">+           vc_conn := f_start_handler(refers(f_TC_mo_ussd_unknown), 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 style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test for USSD request to currently disconnected EUSE. Expect ss-SystemFailure(34) */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_mo_ussd_euse_disc() 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%);">+     var octetstring ss := f_USSD_FACILITY_IE_INVOKE(</span><br><span style="color: hsl(120, 100%, 40%);">+                                      op_code := SS_OP_CODE_PROCESS_USS_REQ,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        ussd_string := "*100#");</span><br><span style="color: hsl(120, 100%, 40%);">+    GSUP.send(valueof(ts_GSUP_PROC_SS_REQ(g_pars.sub.imsi, g_pars.ussd.sid,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               OSMO_GSUP_SESSION_STATE_BEGIN, ss)));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_SS_expect(g_pars.sub.imsi, g_pars.ussd.sid, OSMO_GSUP_SESSION_STATE_END,</span><br><span style="color: hsl(120, 100%, 40%);">+                tr_SS_FACILITY_RETURN_ERROR(1, 34));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mo_ussd_euse_disc() 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 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%);">+        sl := f_gen_subs();</span><br><span style="color: hsl(120, 100%, 40%);">+   for (var integer i := 0; i < sizeof(sl); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               var HLR_ConnHdlrPars pars := valueof(t_Pars_sub(sl[i]));</span><br><span style="color: hsl(120, 100%, 40%);">+              pars.ussd.sid := f_rnd_octstring(4);</span><br><span style="color: hsl(120, 100%, 40%);">+          f_vty_subscr_create(VTY, pars.sub);</span><br><span style="color: hsl(120, 100%, 40%);">+           vc_conn := f_start_handler(refers(f_TC_mo_ussd_euse_disc), 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 style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test for USSD request to internal own-imsi IUSE. */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_mo_ussd_iuse_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%);">+     var charstring resp_str;</span><br><span style="color: hsl(120, 100%, 40%);">+      var octetstring ss := f_USSD_FACILITY_IE_INVOKE(</span><br><span style="color: hsl(120, 100%, 40%);">+                                      op_code := SS_OP_CODE_PROCESS_USS_REQ,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        ussd_string := "*#101#");</span><br><span style="color: hsl(120, 100%, 40%);">+   GSUP.send(valueof(ts_GSUP_PROC_SS_REQ(g_pars.sub.imsi, g_pars.ussd.sid,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               OSMO_GSUP_SESSION_STATE_BEGIN, ss)));</span><br><span style="color: hsl(120, 100%, 40%);">+ resp_str := "Your IMSI is " & hex2str(g_pars.sub.imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_SS_expect(g_pars.sub.imsi, g_pars.ussd.sid, OSMO_GSUP_SESSION_STATE_END,</span><br><span style="color: hsl(120, 100%, 40%);">+                tr_SS_USSD_FACILITY_RETURN_RESULT(1, 59, SS_USSD_DEFAULT_DCS, f_encGSM7bit(resp_str)));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mo_ussd_iuse_imsi() 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 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%);">+        sl := f_gen_subs();</span><br><span style="color: hsl(120, 100%, 40%);">+   for (var integer i := 0; i < sizeof(sl); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               var HLR_ConnHdlrPars pars := valueof(t_Pars_sub(sl[i]));</span><br><span style="color: hsl(120, 100%, 40%);">+              pars.ussd.sid := f_rnd_octstring(4);</span><br><span style="color: hsl(120, 100%, 40%);">+          f_vty_subscr_create(VTY, pars.sub);</span><br><span style="color: hsl(120, 100%, 40%);">+           vc_conn := f_start_handler(refers(f_TC_mo_ussd_iuse_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 style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test for USSD request to internal own-msisdn IUSE. */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_mo_ussd_iuse_msisdn() 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%);">+     var charstring resp_str;</span><br><span style="color: hsl(120, 100%, 40%);">+      var octetstring ss := f_USSD_FACILITY_IE_INVOKE(</span><br><span style="color: hsl(120, 100%, 40%);">+                                      op_code := SS_OP_CODE_PROCESS_USS_REQ,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        ussd_string := "*#100#");</span><br><span style="color: hsl(120, 100%, 40%);">+   GSUP.send(valueof(ts_GSUP_PROC_SS_REQ(g_pars.sub.imsi, g_pars.ussd.sid,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               OSMO_GSUP_SESSION_STATE_BEGIN, ss)));</span><br><span style="color: hsl(120, 100%, 40%);">+ resp_str := "Your extension is " & hex2str(g_pars.sub.msisdn);</span><br><span style="color: hsl(120, 100%, 40%);">+  f_SS_expect(g_pars.sub.imsi, g_pars.ussd.sid, OSMO_GSUP_SESSION_STATE_END,</span><br><span style="color: hsl(120, 100%, 40%);">+                tr_SS_USSD_FACILITY_RETURN_RESULT(1, 59, SS_USSD_DEFAULT_DCS, f_encGSM7bit(resp_str)));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mo_ussd_iuse_msisdn() 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 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%);">+        sl := f_gen_subs();</span><br><span style="color: hsl(120, 100%, 40%);">+   for (var integer i := 0; i < sizeof(sl); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               var HLR_ConnHdlrPars pars := valueof(t_Pars_sub(sl[i]));</span><br><span style="color: hsl(120, 100%, 40%);">+              pars.ussd.sid := f_rnd_octstring(4);</span><br><span style="color: hsl(120, 100%, 40%);">+          f_vty_subscr_create(VTY, pars.sub);</span><br><span style="color: hsl(120, 100%, 40%);">+           vc_conn := f_start_handler(refers(f_TC_mo_ussd_iuse_msisdn), 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 style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test routing of USSD to EUSE by a specific route */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_mo_ussd_100() 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%);">+     /* invoke / invoke id 1 / processUSS-req */</span><br><span style="color: hsl(120, 100%, 40%);">+   //var octetstring ss := 'a11202010102013b300a04010f0405aa180c3602'O;</span><br><span style="color: hsl(120, 100%, 40%);">+  var octetstring ss := f_USSD_FACILITY_IE_INVOKE(</span><br><span style="color: hsl(120, 100%, 40%);">+                                      op_code := SS_OP_CODE_PROCESS_USS_REQ,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        ussd_string := "*100#");</span><br><span style="color: hsl(120, 100%, 40%);">+    GSUP.send(valueof(ts_GSUP_PROC_SS_REQ(g_pars.sub.imsi, g_pars.ussd.sid,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               OSMO_GSUP_SESSION_STATE_BEGIN, ss)));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_SS_expect(g_pars.sub.imsi, g_pars.ussd.sid, OSMO_GSUP_SESSION_STATE_END,</span><br><span style="color: hsl(120, 100%, 40%);">+                tr_SS_USSD_FACILITY_RETURN_RESULT(1, 59, SS_USSD_DEFAULT_DCS, f_encGSM7bit("*100#")));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mo_ussd_euse() 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 HLR_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   var HLR_EUSE_CT vc_EUSE := HLR_EUSE_CT.create("EUSE-" & testcasename());</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_EUSE.start(HLR_EUSE.f_main_mo(mp_hlr_ip, mp_hlr_gsup_port, "foobar", refers(f_ss_echo)));</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%);">+   for (var integer i := 0; i < sizeof(sl); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               var HLR_ConnHdlrPars pars := valueof(t_Pars_sub(sl[i]));</span><br><span style="color: hsl(120, 100%, 40%);">+              pars.ussd.sid := f_rnd_octstring(4);</span><br><span style="color: hsl(120, 100%, 40%);">+          f_vty_subscr_create(VTY, pars.sub);</span><br><span style="color: hsl(120, 100%, 40%);">+           vc_conn := f_start_handler(refers(f_TC_mo_ussd_100), 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 style="color: hsl(120, 100%, 40%);">+   vc_EUSE.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%);">+/* Test routing of USSD to EUSE by a specific route, with CONTINUE */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_mo_ussd_100_continue() 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%);">+     /* Simulate BEGIN from MS/MSC */</span><br><span style="color: hsl(120, 100%, 40%);">+      var octetstring ss := f_USSD_FACILITY_IE_INVOKE(op_code := SS_OP_CODE_PROCESS_USS_REQ,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                        ussd_string := "*100#");</span><br><span style="color: hsl(120, 100%, 40%);">+    GSUP.send(valueof(ts_GSUP_PROC_SS_REQ(g_pars.sub.imsi, g_pars.ussd.sid,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               OSMO_GSUP_SESSION_STATE_BEGIN, ss)));</span><br><span style="color: hsl(120, 100%, 40%);">+ /* expect echo response from EUSE */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_SS_expect(g_pars.sub.imsi, g_pars.ussd.sid, OSMO_GSUP_SESSION_STATE_CONTINUE,</span><br><span style="color: hsl(120, 100%, 40%);">+                   tr_SS_USSD_FACILITY_RETURN_RESULT(1, 59, SS_USSD_DEFAULT_DCS, f_encGSM7bit("*100#")));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Simulate CONTINUE from MS/MSC */</span><br><span style="color: hsl(120, 100%, 40%);">+   ss := f_USSD_FACILITY_IE_INVOKE(op_code := SS_OP_CODE_PROCESS_USS_REQ,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        ussd_string := "mahlzeit");</span><br><span style="color: hsl(120, 100%, 40%);">+ GSUP.send(valueof(ts_GSUP_PROC_SS_REQ(g_pars.sub.imsi, g_pars.ussd.sid,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               OSMO_GSUP_SESSION_STATE_CONTINUE, ss)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* expect echo response from EUSE */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_SS_expect(g_pars.sub.imsi, g_pars.ussd.sid, OSMO_GSUP_SESSION_STATE_END,</span><br><span style="color: hsl(120, 100%, 40%);">+                tr_SS_USSD_FACILITY_RETURN_RESULT(1, 59, SS_USSD_DEFAULT_DCS,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   f_encGSM7bit("mahlzeit")));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mo_ussd_euse_continue() 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 HLR_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   var HLR_EUSE_CT vc_EUSE := HLR_EUSE_CT.create("EUSE-" & testcasename());</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_EUSE.start(HLR_EUSE.f_main_mo(mp_hlr_ip, mp_hlr_gsup_port, "foobar",</span><br><span style="color: hsl(120, 100%, 40%);">+                                      refers(f_ss_echo_continue)));</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%);">+   for (var integer i := 0; i < sizeof(sl); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               var HLR_ConnHdlrPars pars := valueof(t_Pars_sub(sl[i]));</span><br><span style="color: hsl(120, 100%, 40%);">+              pars.ussd.sid := f_rnd_octstring(4);</span><br><span style="color: hsl(120, 100%, 40%);">+          f_vty_subscr_create(VTY, pars.sub);</span><br><span style="color: hsl(120, 100%, 40%);">+           vc_conn := f_start_handler(refers(f_TC_mo_ussd_100_continue), 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 style="color: hsl(120, 100%, 40%);">+   vc_EUSE.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%);">+/* Test routing of USSD to EUSE by default-route */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_mo_ussd_999() 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%);">+     var octetstring ss := f_USSD_FACILITY_IE_INVOKE(</span><br><span style="color: hsl(120, 100%, 40%);">+                                      op_code := SS_OP_CODE_PROCESS_USS_REQ,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        ussd_string := "*999#");</span><br><span style="color: hsl(120, 100%, 40%);">+    GSUP.send(valueof(ts_GSUP_PROC_SS_REQ(g_pars.sub.imsi, g_pars.ussd.sid,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               OSMO_GSUP_SESSION_STATE_BEGIN, ss)));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_SS_expect(g_pars.sub.imsi, g_pars.ussd.sid, OSMO_GSUP_SESSION_STATE_END,</span><br><span style="color: hsl(120, 100%, 40%);">+                tr_SS_USSD_FACILITY_RETURN_RESULT(1, 59, SS_USSD_DEFAULT_DCS, f_encGSM7bit("*999#")));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mo_ussd_euse_defaultroute() 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 HLR_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   var HLR_EUSE_CT vc_EUSE := HLR_EUSE_CT.create("EUSE-" & testcasename());</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_EUSE.start(HLR_EUSE.f_main_mo(mp_hlr_ip, mp_hlr_gsup_port, "foobar", refers(f_ss_echo)));</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%);">+        f_vty_config(VTY, "hlr", "ussd default-route external foobar");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ sl := f_gen_subs();</span><br><span style="color: hsl(120, 100%, 40%);">+   for (var integer i := 0; i < sizeof(sl); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               var HLR_ConnHdlrPars pars := valueof(t_Pars_sub(sl[i]));</span><br><span style="color: hsl(120, 100%, 40%);">+              pars.ussd.sid := f_rnd_octstring(4);</span><br><span style="color: hsl(120, 100%, 40%);">+          f_vty_subscr_create(VTY, pars.sub);</span><br><span style="color: hsl(120, 100%, 40%);">+           vc_conn := f_start_handler(refers(f_TC_mo_ussd_999), 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 style="color: hsl(120, 100%, 40%);">+   f_vty_config(VTY, "hlr", "no ussd default-route");</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_EUSE.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%);">+/* TODO USSD:</span><br><span style="color: hsl(120, 100%, 40%);">+   * MO USSD for IMSI of non-existant subscriber</span><br><span style="color: hsl(120, 100%, 40%);">+   * MT USSD from EUSE</span><br><span style="color: hsl(120, 100%, 40%);">+   * timeout cases</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>@@ -700,6 +1027,14 @@</span><br><span>     execute( TC_gsup_purge_cs() );</span><br><span>       execute( TC_gsup_purge_ps() );</span><br><span>       execute( TC_gsup_purge_unknown() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_mo_ussd_unknown() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_mo_ussd_euse_disc() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_mo_ussd_iuse_imsi() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_mo_ussd_iuse_msisdn() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_mo_ussd_euse() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_mo_ussd_euse_continue() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_mo_ussd_euse_defaultroute() );</span><br><span> };</span><br><span> </span><br><span> };</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10405">change 10405</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/10405"/><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-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I74a3419140179b1625e82d1298864e424fb81398 </div>
<div style="display:none"> Gerrit-Change-Number: 10405 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>