pespin has uploaded this change for review. ( 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(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/81/37481/1
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..d644a75 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", 486, + g_pars.subscr.cp.sip_seq_nr, "Busy Here", + 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>