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

Change subject: ttcn3-asterisk: Introduce test TC_ims_call_mo_2nd_mt_rejected
......................................................................

ttcn3-asterisk: Introduce test TC_ims_call_mo_2nd_mt_rejected

Change-Id: Id6577d0e9137c86855469904d347e95b5bcfa4a7
---
M asterisk/Asterisk_Tests.ttcn
M asterisk/IMS_ConnectionHandler.ttcn
M asterisk/expected-results.xml
3 files changed, 101 insertions(+), 3 deletions(-)

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




diff --git a/asterisk/Asterisk_Tests.ttcn b/asterisk/Asterisk_Tests.ttcn
index 00b6edb..9b5bb11 100644
--- a/asterisk/Asterisk_Tests.ttcn
+++ b/asterisk/Asterisk_Tests.ttcn
@@ -787,14 +787,37 @@
        as_IMS_exp_call_resume();
        f_TC_ims_call_mo_IMS_ConnHdlr_hangup_call_unregister();
 }
+private function f_TC_ims_call_mo_IMS_ConnHdlr_2nd_mt_rejected(charstring id) 
runs on IMS_ConnHdlr {
+       var IMS_ConnHdlrSubscrPars subscr0;
+       var default d_trying, d_ringing, d_sessprog;
+       var Via via;
+
+       /* Establish 1st (MO) call */
+       f_TC_ims_call_mo_IMS_ConnHdlr_register_establish_call();
+
+       /* Backup state of 1st call subscriber: */
+       subscr0 := g_pars.subscr;
+       /* Initiate second (MT) call: */
+       f_IMS_mt_call_rejected(486, "Busy Here");
+       /* Leave some time for last ACK from IMS to arrive to Asterisk */
+       f_sleep(1.0);
+       /* Restore 1s call metadata before hanging it up here: */
+       g_pars.subscr := subscr0;
+       COORD.send(IMS_COORD_CMD_CALL_REJECTED);
+
+       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 {
+private function call_established_fn_sleep1(SIPConnHdlrPars sip_pars, 
IMS_ConnHdlrPars ims_pars) runs on test_CT {
        f_sleep(1.0);
 }
+private function 
call_established_fn_wait_ims_coord_cmd_call_rejected(SIPConnHdlrPars sip_pars, 
IMS_ConnHdlrPars ims_pars) runs on test_CT {
+       IMS_COORD.receive(IMS_COORD_CMD_CALL_REJECTED);
+}

 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),
+                                 call_established_fn call_established_cb := 
refers(call_established_fn_sleep1),
                                  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;
@@ -887,7 +910,14 @@
        f_TC_ims_call_mo(call_established_cb := 
refers(call_established_fn_2ndrejected));
 }

-/* Test SIP registration of local clients */
+/* Test a 2nd call initiated from IMS towards Astierisk is rejected with
+ * 486 Busy Here if IMS endpoint is already busy in a call. */
+testcase TC_ims_call_mo_2nd_mt_rejected() runs on test_CT {
+       f_TC_ims_call_mo(call_established_cb := 
refers(call_established_fn_wait_ims_coord_cmd_call_rejected),
+                        ims_fn := 
refers(f_TC_ims_call_mo_IMS_ConnHdlr_2nd_mt_rejected));
+}
+
+/* Test MT call initiated by IMS */
 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)));
        as_IMS_register();
@@ -1005,6 +1035,7 @@
        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_mo_2nd_mt_rejected() );
        execute( TC_ims_call_mt() );
        execute( TC_ims_call_mt_noprecondition() );
 }
diff --git a/asterisk/IMS_ConnectionHandler.ttcn 
b/asterisk/IMS_ConnectionHandler.ttcn
index d4c9da2..878b44e 100644
--- a/asterisk/IMS_ConnectionHandler.ttcn
+++ b/asterisk/IMS_ConnectionHandler.ttcn
@@ -48,6 +48,7 @@
 const charstring IMS_COORD_CMD_CALL_ESTABLISHED := 
"IMS_COORD_CMD_CALL_ESTABLISHED";
 const charstring IMS_COORD_CMD_HANGUP := "IMS_COORD_CMD_HANGUP";
 const charstring IMS_COORD_CMD_CALL_FINISHED := "IMS_COORD_CMD_CALL_FINISHED";
+const charstring IMS_COORD_CMD_CALL_REJECTED := "IMS_COORD_CMD_CALL_REJECTED";
 const charstring IMS_COORD_CMD_CALL_TRYING := "IMS_COORD_CMD_CALL_TRYING";
 const charstring IMS_COORD_CMD_CALL_SESSION_PROGRESS := 
"IMS_COORD_CMD_CALL_SESSION_PROGRESS";
 const charstring IMS_COORD_CMD_CALL_SESSION_REFRESH := 
"IMS_COORD_CMD_CALL_SESSION_REFRESH";
@@ -1379,6 +1380,62 @@
        g_pars.subscr.cp.sip_seq_nr := g_pars.subscr.cp.sip_seq_nr + 1;
 }

+/* IMS Core starts a call towards the peer and gets rejected. */
+function f_IMS_mt_call_rejected(template (present) integer exp_status_code := 
486,
+                               template (present) charstring exp_reason := 
"Busy Here") runs on IMS_ConnHdlr
+{
+       var template (value) PDU_SIP_Request req;
+       var template (present) PDU_SIP_Response exp;
+       var default d_trying, d_ringing, d_sessprog;
+       var Via via;
+
+       g_pars.subscr.cp.from_addr := 
valueof(ts_From(g_pars.subscr.cp.calling.addr, 
g_pars.subscr.cp.calling.params));
+       g_pars.subscr.cp.from_addr.fromParams := 
f_sip_param_set(g_pars.subscr.cp.from_addr.fromParams, "tag", f_sip_rand_tag());
+       g_pars.subscr.cp.to_addr := valueof(ts_To(g_pars.subscr.cp.called.addr, 
g_pars.subscr.cp.called.params));
+       via := f_IMS_gen_new_Via();
+       f_IMS_mt_call_tx_invite(via);
+
+       /* Conditionally match and accept 100 Trying. */
+       exp := tr_SIP_Response_Trying(g_pars.subscr.cp.sip_call_id,
+                                     ?, ?,
+                                     f_tr_Via_response(via),
+                                     g_pars.subscr.cp.sip_seq_nr, "INVITE");
+       d_trying := activate(as_SIP_ignore_resp(exp));
+       /* Conditionally match and accept 183 Session Progress. */
+       exp := tr_SIP_Response_SessionProgress(g_pars.subscr.cp.sip_call_id,
+                                              ?, ?,
+                                              f_tr_Via_response(via),
+                                              g_pars.subscr.cp.sip_seq_nr, 
"INVITE");
+       d_sessprog := activate(as_SIP_ignore_resp(exp));
+
+       /* Wait for 486 Busy Here (INVITE) answer */
+       exp := tr_SIP_Response(g_pars.subscr.cp.sip_call_id,
+                              ?, ?,
+                              f_tr_Via_response(via),
+                              *,
+                              "INVITE", exp_status_code,
+                              g_pars.subscr.cp.sip_seq_nr, exp_reason,
+                              body := omit);
+       as_SIP_expect_resp(exp, fail_others := false);
+
+       deactivate(d_sessprog);
+       deactivate(d_trying);
+
+       /* Update To with the tags received from peer: */
+       g_pars.subscr.cp.to_addr := g_rx_sip_resp.msgHeader.toField;
+
+       /* Transmit ACK */
+       req := 
ts_SIP_ACK(ts_SipUrl_from_Addr_Union(g_pars.subscr.cp.called.addr),
+                         g_pars.subscr.cp.sip_call_id,
+                         g_pars.subscr.cp.from_addr,
+                         g_pars.subscr.cp.to_addr,
+                         via,
+                         g_pars.subscr.cp.sip_seq_nr,
+                         omit);
+       SIP.send(req);
+       g_pars.subscr.cp.sip_seq_nr := g_pars.subscr.cp.sip_seq_nr + 1;
+}
+
 /* Tx BYE: */
 function f_IMS_do_call_hangup() runs on IMS_ConnHdlr
 {
diff --git a/asterisk/expected-results.xml b/asterisk/expected-results.xml
index 21f0ed4..ddc50a5 100644
--- a/asterisk/expected-results.xml
+++ b/asterisk/expected-results.xml
@@ -19,6 +19,7 @@
   <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_mo_2nd_mt_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/+/37481?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: Id6577d0e9137c86855469904d347e95b5bcfa4a7
Gerrit-Change-Number: 37481
Gerrit-PatchSet: 3
Gerrit-Owner: pespin <[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