pespin has uploaded this change for review. ( 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(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/76/37476/1
diff --git a/asterisk/Asterisk_Tests.ttcn b/asterisk/Asterisk_Tests.ttcn index c6ac698..2d3f2f1 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(IMS_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(IMS_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>