pespin has submitted this change. ( 
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/37476?usp=email )

Change subject: asterisk: TC_ims_call_mo_2nd_mo_rejected
......................................................................

asterisk: TC_ims_call_mo_2nd_mo_rejected

Related: SYS#7003
Change-Id: I7764e29e8df11ad65366642f83ebe922488bf128
---
M asterisk/Asterisk_Tests.ttcn
M asterisk/SIP_ConnectionHandler.ttcn
M asterisk/expected-results.xml
3 files changed, 87 insertions(+), 23 deletions(-)

Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, but someone else must approve
  pespin: Looks good to me, approved




diff --git a/asterisk/Asterisk_Tests.ttcn b/asterisk/Asterisk_Tests.ttcn
index c6ac698..00b6edb 100644
--- a/asterisk/Asterisk_Tests.ttcn
+++ b/asterisk/Asterisk_Tests.ttcn
@@ -237,6 +237,18 @@
        f_TC_internal_hangup_call_mo_unregister();
        setverdict(pass);
 }
+private function f_TC_internal_call_mo_rejected(charstring id) runs on 
SIPConnHdlr {
+       f_SIP_register();
+       COORD.send(COORD_CMD_REGISTERED);
+
+       COORD.receive(COORD_CMD_START);
+       f_SIP_mo_call_setup(503, "Service Unavailable");
+       COORD.send(COORD_CMD_CALL_FINISHED);
+
+       COORD.receive(COORD_CMD_UNREGISTER);
+       f_SIP_unregister();
+       setverdict(pass);
+}

 private function f_TC_internal_call_mt(charstring id) runs on SIPConnHdlr {

@@ -702,15 +714,15 @@
        f_shutdown();
 }

-private function f_ims_call_mo_configure(inout SIPConnHdlrPars sip_pars, inout 
IMS_ConnHdlrPars ims_pars) runs on test_CT  {
-       const charstring c_ext_msisdn := "90829";
+private function f_ims_call_mo_configure(inout SIPConnHdlrPars sip_pars, inout 
IMS_ConnHdlrPars ims_pars,
+                                        charstring tgt_ext_msisdn := "90829") 
runs on test_CT  {
        sip_pars.cp.calling := sip_pars.registrar_sip_record;
        sip_pars.cp.called := 
valueof(ts_SipAddr(ts_HostPort(sip_pars.remote_sip_host),
-                                                ts_UserInfo(c_ext_msisdn)));
+                                                ts_UserInfo(tgt_ext_msisdn)));
        ims_pars.subscr.cp.calling := 
valueof(ts_SipAddr(ts_HostPort(ims_pars.realm),
                                                         
ts_UserInfo(ims_pars.subscr.msisdn)));
        ims_pars.subscr.cp.called := 
valueof(ts_SipAddr(ts_HostPort(ims_pars.realm),
-                                                       
ts_UserInfo(c_ext_msisdn)));
+                                                       
ts_UserInfo(tgt_ext_msisdn)));
 }

 private function f_ims_call_mo_establish(inout SIPConnHdlr vc_conn_sip, inout 
IMS_ConnHdlr vc_conn_ims) runs on test_CT  {
@@ -776,7 +788,13 @@
        f_TC_ims_call_mo_IMS_ConnHdlr_hangup_call_unregister();
 }

+type function call_established_fn(SIPConnHdlrPars sip_pars, IMS_ConnHdlrPars 
ims_pars) runs on test_CT;
+private function call_established_fn_sleep(SIPConnHdlrPars sip_pars, 
IMS_ConnHdlrPars ims_pars) runs on test_CT {
+       f_sleep(1.0);
+}
+
 private function f_TC_ims_call_mo(boolean use_precondition_ext := true, 
boolean use_session_timer := false,
+                                 call_established_fn call_established_cb := 
refers(call_established_fn_sleep),
                                  void_fn sip_fn := 
refers(f_TC_internal_call_mo),
                                  ims_void_fn ims_fn := 
refers(f_TC_ims_call_mo_IMS_ConnHdlr)) runs on test_CT {
        var SIPConnHdlrPars sip_pars;
@@ -815,7 +833,7 @@
        if (use_session_timer) {
                IMS_COORD.receive(IMS_COORD_CMD_CALL_SESSION_REFRESH);
        }
-       f_sleep(1.0);
+       call_established_cb.apply(sip_pars, ims_pars);

        COORD.send(COORD_CMD_HANGUP) to vc_conn_sip;
        IMS_COORD.receive(IMS_COORD_CMD_CALL_FINISHED) from vc_conn_ims;
@@ -850,6 +868,25 @@
                         ims_fn := 
refers(f_TC_ims_call_mo_IMS_ConnHdlr_with_holdresume));
 }

+/* Test a 2nd call initiated from a local SIP UA towards IMS is rejected with
+ * 503 Service Unavailable if IMS endpoint is already busy in a call. */
+private function call_established_fn_2ndrejected(SIPConnHdlrPars sip_pars, 
IMS_ConnHdlrPars ims_pars) runs on test_CT {
+       var SIPConnHdlrPars sip_pars2;
+       var SIPConnHdlr vc_conn_sip2;
+       sip_pars2 := f_init_ConnHdlrPars(idx := 2);
+       f_ims_call_mo_configure(sip_pars2, ims_pars, tgt_ext_msisdn := 
"88888888");
+       vc_conn_sip2 := f_start_handler(refers(f_TC_internal_call_mo_rejected), 
sip_pars2);
+
+       COORD.receive(COORD_CMD_REGISTERED) from vc_conn_sip2;
+       COORD.send(COORD_CMD_START) to vc_conn_sip2;
+       COORD.receive(COORD_CMD_CALL_FINISHED) from vc_conn_sip2;
+       COORD.send(COORD_CMD_UNREGISTER) to vc_conn_sip2;
+       vc_conn_sip2.done;
+}
+testcase TC_ims_call_mo_2nd_mo_rejected() runs on test_CT {
+       f_TC_ims_call_mo(call_established_cb := 
refers(call_established_fn_2ndrejected));
+}
+
 /* Test SIP registration of local clients */
 private function f_TC_ims_call_mt_IMS_ConnHdlr(charstring id) runs on 
IMS_ConnHdlr {
        
f_create_sip_expect(valueof(ts_SipUrl_from_Addr_Union(g_pars.subscr.registrar_sip_record.addr)));
@@ -967,6 +1004,7 @@
        execute( TC_ims_call_mo_session_timer() );
        execute( TC_ims_call_mo_noprecondition() );
        execute( TC_ims_call_mo_holdresume_mo() );
+       execute( TC_ims_call_mo_2nd_mo_rejected() );
        execute( TC_ims_call_mt() );
        execute( TC_ims_call_mt_noprecondition() );
 }
diff --git a/asterisk/SIP_ConnectionHandler.ttcn 
b/asterisk/SIP_ConnectionHandler.ttcn
index ad76296..49fa04c 100644
--- a/asterisk/SIP_ConnectionHandler.ttcn
+++ b/asterisk/SIP_ConnectionHandler.ttcn
@@ -423,29 +423,16 @@
        return g_rx_sip_resp;
 }

-function f_SIP_mo_call_setup() runs on SIPConnHdlr
+private function f_SIP_mo_call_tx_invite(Via via) runs on SIPConnHdlr
 {
        var template (value) PDU_SIP_Request req;
+       var charstring tx_sdp := f_gen_sdp();
        var template (present) PDU_SIP_Response exp;
        var template (present) From from_addr_exp;
        var template (present) To to_addr_exp;
-       var Via via;
-       var charstring tx_sdp := f_gen_sdp();
-       var default d_trying, d_ringing, d_sessprog;
-       var charstring branch_value;

-       /* RFC 3261 8.1.1.3 From */
-       g_pars.cp.from_addr := valueof(ts_From(g_pars.cp.calling.addr, 
g_pars.cp.calling.params));
-       g_pars.cp.from_addr.fromParams := 
f_sip_param_set(g_pars.cp.from_addr.fromParams, "tag", f_sip_rand_tag());
-       g_pars.cp.to_addr := valueof(ts_To(g_pars.cp.called.addr, 
g_pars.cp.called.params));
        from_addr_exp := 
tr_From(tr_Addr_Union_from_val(g_pars.cp.from_addr.addressField), *);
        to_addr_exp := 
tr_To(tr_Addr_Union_from_val(g_pars.cp.to_addr.addressField), *);
-       branch_value := 
f_sip_gen_branch(f_sip_Addr_Union_to_str(g_pars.cp.from_addr.addressField),
-                                        
f_sip_Addr_Union_to_str(valueof(g_pars.cp.to_addr.addressField)),
-                                        g_pars.cp.sip_call_id,
-                                        g_pars.cp.sip_seq_nr);
-       via := g_pars.local_via;
-       via.viaBody[0].viaParams := f_sip_param_set(via.viaBody[0].viaParams, 
"branch", branch_value);

        req := ts_SIP_INVITE(g_pars.cp.sip_call_id,
                             g_pars.cp.from_addr,
@@ -477,6 +464,34 @@
        g_pars.cp.sip_seq_nr := g_pars.cp.sip_seq_nr + 1;
        f_sip_Request_inc_seq_nr(req);
        SIP.send(req);
+}
+
+function f_SIP_mo_call_setup(template (present) integer exp_status_code := 200,
+                            template (present) charstring exp_reason := "OK") 
runs on SIPConnHdlr
+{
+       var template (value) PDU_SIP_Request req;
+       var template (present) PDU_SIP_Response exp;
+       var template (present) From from_addr_exp;
+       var template (present) To to_addr_exp;
+       var Via via;
+       var charstring tx_sdp := f_gen_sdp();
+       var default d_trying, d_ringing, d_sessprog;
+       var charstring branch_value;
+
+       /* RFC 3261 8.1.1.3 From */
+       g_pars.cp.from_addr := valueof(ts_From(g_pars.cp.calling.addr, 
g_pars.cp.calling.params));
+       g_pars.cp.from_addr.fromParams := 
f_sip_param_set(g_pars.cp.from_addr.fromParams, "tag", f_sip_rand_tag());
+       g_pars.cp.to_addr := valueof(ts_To(g_pars.cp.called.addr, 
g_pars.cp.called.params));
+       from_addr_exp := 
tr_From(tr_Addr_Union_from_val(g_pars.cp.from_addr.addressField), *);
+       to_addr_exp := 
tr_To(tr_Addr_Union_from_val(g_pars.cp.to_addr.addressField), *);
+       branch_value := 
f_sip_gen_branch(f_sip_Addr_Union_to_str(g_pars.cp.from_addr.addressField),
+                                        
f_sip_Addr_Union_to_str(valueof(g_pars.cp.to_addr.addressField)),
+                                        g_pars.cp.sip_call_id,
+                                        g_pars.cp.sip_seq_nr);
+       via := g_pars.local_via;
+       via.viaBody[0].viaParams := f_sip_param_set(via.viaBody[0].viaParams, 
"branch", branch_value);
+
+       f_SIP_mo_call_tx_invite(via);

        /* Conditionally match and accept 100 Trying. */
        exp := tr_SIP_Response_Trying(g_pars.cp.sip_call_id,
@@ -509,9 +524,9 @@
                        to_addr_exp,
                        f_tr_Via_response(via),
                        *,
-                       "INVITE", 200,
-                       g_pars.cp.sip_seq_nr, "OK",
-                       body := ?);
+                       "INVITE", exp_status_code,
+                       g_pars.cp.sip_seq_nr, exp_reason,
+                       body := *);
        as_SIP_expect_resp(exp, fail_others := false);

        deactivate(d_trying);
diff --git a/asterisk/expected-results.xml b/asterisk/expected-results.xml
index 1819072..21f0ed4 100644
--- a/asterisk/expected-results.xml
+++ b/asterisk/expected-results.xml
@@ -18,6 +18,7 @@
   <testcase classname='Asterisk_Tests' name='TC_ims_call_mo_session_timer' 
time='MASKED'/>
   <testcase classname='Asterisk_Tests' name='TC_ims_call_mo_noprecondition' 
time='MASKED'/>
   <testcase classname='Asterisk_Tests' name='TC_ims_call_mo_holdresume_mo' 
time='MASKED'/>
+  <testcase classname='Asterisk_Tests' name='TC_ims_call_mo_2nd_mo_rejected' 
time='MASKED'/>
   <testcase classname='Asterisk_Tests' name='TC_ims_call_mt' time='MASKED'/>
   <testcase classname='Asterisk_Tests' name='TC_ims_call_mt_noprecondition' 
time='MASKED'/>
 </testsuite>

--
To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/37476?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: I7764e29e8df11ad65366642f83ebe922488bf128
Gerrit-Change-Number: 37476
Gerrit-PatchSet: 3
Gerrit-Owner: pespin <[email protected]>
Gerrit-Reviewer: Hoernchen <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: jolly <[email protected]>
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-Reviewer: pespin <[email protected]>
Gerrit-MessageType: merged

Reply via email to