pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/37305?usp=email )
Change subject: WIP: asterisk: Introduce test TC_ims_call_mo_session_timer ......................................................................
WIP: asterisk: Introduce test TC_ims_call_mo_session_timer
Related: SYS#6987 Change-Id: Ia628c602df2f85b4e58a085353776e6c11914bcd --- M asterisk/Asterisk_Tests.ttcn M asterisk/IMS_ConnectionHandler.ttcn M asterisk/expected-results.xml 3 files changed, 105 insertions(+), 38 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/05/37305/1
diff --git a/asterisk/Asterisk_Tests.ttcn b/asterisk/Asterisk_Tests.ttcn index b7981eb..33d802d 100644 --- a/asterisk/Asterisk_Tests.ttcn +++ b/asterisk/Asterisk_Tests.ttcn @@ -654,34 +654,8 @@ f_shutdown(); }
-/* Test IMS MO call emulating an MT which doesn't support precondition */ -private function f_TC_ims_call_mo_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))); - if (ispresent(g_pars.subscr.cp.called)) { - f_create_sip_expect(valueof(ts_SipUrl_from_Addr_Union(g_pars.subscr.cp.called.addr))); - } - as_IMS_register(); - setverdict(pass); - as_IMS_mo_call_accept(); - setverdict(pass); - COORD.send(COORD_CMD_CALL_ESTABLISHED); - as_IMS_exp_call_hangup(g_pars.subscr.cp.sip_seq_nr + 1); - setverdict(pass); - as_IMS_unregister(); -} -private function f_TC_ims_call_mo(boolean use_precondition_ext) runs on test_CT { - var SIPConnHdlrPars sip_pars; - var IMS_ConnHdlrPars ims_pars; - var SIPConnHdlr vc_conn_sip; - var IMS_ConnHdlr vc_conn_ims; - var AMI_Msg ami_msg; +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"; - - f_init(); - - sip_pars := f_init_ConnHdlrPars(idx := 1); - ims_pars := f_init_IMS_ConnHdlrPars(); - 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))); @@ -689,16 +663,10 @@ ts_UserInfo(ims_pars.subscr.msisdn))); ims_pars.subscr.cp.called := valueof(ts_SipAddr(ts_HostPort(ims_pars.realm), ts_UserInfo(c_ext_msisdn))); - ims_pars.subscr.cp.support_precondition_ext := use_precondition_ext; - ims_pars.subscr.cp.require_precondition_ext := use_precondition_ext; - ims_pars.subscr.cp.mo.tx_coord_cmd_invite_trying := true; +}
- vc_conn_ims := f_start_handler_IMS(refers(f_TC_ims_call_mo_IMS_ConnHdlr), ims_pars); - vc_conn_sip := f_start_handler(refers(f_TC_internal_call_mo), sip_pars); - - COORD.receive(COORD_CMD_REGISTERED) from vc_conn_sip; - - f_AMI_IMS_register(ims_pars); +private function f_ims_call_mo_establish(inout SIPConnHdlr vc_conn_sip, inout IMS_ConnHdlr vc_conn_ims) runs on test_CT { + var AMI_Msg ami_msg;
COORD.send(COORD_CMD_START) to vc_conn_sip;
@@ -712,8 +680,91 @@
COORD.receive(COORD_CMD_CALL_ESTABLISHED) from vc_conn_sip; IMS_COORD.receive(COORD_CMD_CALL_ESTABLISHED) from vc_conn_ims; +} + +/* Test IMS MO call emulating an MT which doesn't support precondition */ +private function f_TC_ims_call_mo_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))); + if (ispresent(g_pars.subscr.cp.called)) { + f_create_sip_expect(valueof(ts_SipUrl_from_Addr_Union(g_pars.subscr.cp.called.addr))); + } + as_IMS_register(); + setverdict(pass); + as_IMS_mo_call_accept(); + setverdict(pass); + COORD.send(COORD_CMD_CALL_ESTABLISHED); + if (g_pars.subscr.cp.mo.support_timer_session_expires > 0) { + /* TODO: recceive(tr_INVITE()) ? + signal something */ + timer Trefresh; + Trefresh.start(int2float(g_pars.subscr.cp.mo.support_timer_session_expires)); + alt { /* RFC4028 section 7.4. It can be either INVITE or UPDATE: */ + [] SIP.receive(tr_SIP_INVITE(f_tr_SipUrl_opt_defport(ts_SipUrl_from_Addr_Union(g_pars.subscr.cp.called.addr)), + ?, + tr_From(tr_Addr_Union_from_val(g_pars.subscr.cp.calling.addr), *), + tr_To(tr_Addr_Union_from_val(g_pars.subscr.cp.called.addr), *), + tr_Via_from(f_tr_HostPort(g_pars.subscr.remote_sip_host, g_pars.subscr.ipsec_remote_port_s)), + ?, + supported := tr_Supported(superset("timer")), + body := ?)) -> value g_rx_sip_req; + [] SIP.receive(tr_SIP_UPDATE(f_tr_SipUrl_opt_defport(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, + tr_Via_from(f_tr_HostPort(g_pars.subscr.remote_sip_host, g_pars.subscr.ipsec_remote_port_s)), + ?, + body := ?)) -> value g_rx_sip_req; + [] Trefresh.timeout { + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, log2str(g_name & ": Timeout waiting for Session Refresh")); + } + } + Trefresh.stop; + /* TODO: send 200 OK response*/ + /* Sleep to make sure response arrives to the peer */ + f_sleep(1.0); + COORD.send(IMS_COORD_CMD_CALL_SESSION_REFRESH); + } + as_IMS_exp_call_hangup(g_pars.subscr.cp.sip_seq_nr + 1); + setverdict(pass); + as_IMS_unregister(); +} + +private function f_TC_ims_call_mo(boolean use_precondition_ext, boolean use_session_timer) runs on test_CT { + var SIPConnHdlrPars sip_pars; + var IMS_ConnHdlrPars ims_pars; + var SIPConnHdlr vc_conn_sip; + var IMS_ConnHdlr vc_conn_ims; + + f_init(); + + sip_pars := f_init_ConnHdlrPars(idx := 1); + ims_pars := f_init_IMS_ConnHdlrPars(); + + f_ims_call_mo_configure(sip_pars, ims_pars); + ims_pars.subscr.cp.support_precondition_ext := use_precondition_ext; + ims_pars.subscr.cp.require_precondition_ext := use_precondition_ext; + ims_pars.subscr.cp.mo.tx_coord_cmd_invite_trying := true; + ims_pars.subscr.cp.mo.support_timer_enable := use_session_timer; + if (use_session_timer) { + sip_pars.t_guard := 120.0; + ims_pars.t_guard := 120.0; + ims_pars.subscr.cp.mo.support_timer_exp_min_se := 90; + ims_pars.subscr.cp.mo.support_timer_session_expires := 90; + + } + + vc_conn_ims := f_start_handler_IMS(refers(f_TC_ims_call_mo_IMS_ConnHdlr), ims_pars); + vc_conn_sip := f_start_handler(refers(f_TC_internal_call_mo), sip_pars); + + COORD.receive(COORD_CMD_REGISTERED) from vc_conn_sip; + + f_AMI_IMS_register(ims_pars); + + f_ims_call_mo_establish(vc_conn_sip, vc_conn_ims);
/* Call on-going */ + if (use_session_timer) { + IMS_COORD.receive(IMS_COORD_CMD_CALL_SESSION_REFRESH); + } f_sleep(1.0);
COORD.send(COORD_CMD_HANGUP) to vc_conn_sip; @@ -728,10 +779,13 @@ f_shutdown(); } testcase TC_ims_call_mo() runs on test_CT { - f_TC_ims_call_mo(true); + f_TC_ims_call_mo(true, false); +} +testcase TC_ims_call_mo_session_timer() runs on test_CT { + f_TC_ims_call_mo(true, true); } testcase TC_ims_call_mo_noprecondition() runs on test_CT { - f_TC_ims_call_mo(false); + f_TC_ims_call_mo(false, false); }
/* Test SIP registration of local clients */ @@ -837,6 +891,7 @@ execute( TC_ims_registration_423_interval_too_brief() ); execute( TC_ims_reregistration() ); execute( TC_ims_call_mo() ); + execute( TC_ims_call_mo_session_timer() ); execute( TC_ims_call_mo_noprecondition() ); execute( TC_ims_call_mt() ); execute( TC_ims_call_mt_noprecondition() ); diff --git a/asterisk/IMS_ConnectionHandler.ttcn b/asterisk/IMS_ConnectionHandler.ttcn index 1f9c083..cb473fc 100644 --- a/asterisk/IMS_ConnectionHandler.ttcn +++ b/asterisk/IMS_ConnectionHandler.ttcn @@ -49,6 +49,7 @@ const charstring IMS_COORD_CMD_HANGUP := "IMS_COORD_CMD_HANGUP"; 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";
type component IMS_ConnHdlr extends SIP_ConnHdlr { var charstring g_name; diff --git a/asterisk/expected-results.xml b/asterisk/expected-results.xml index 26c2fa4..179ee70 100644 --- a/asterisk/expected-results.xml +++ b/asterisk/expected-results.xml @@ -15,6 +15,7 @@ <testcase classname='Asterisk_Tests' name='TC_ims_registration_423_interval_too_brief' time='MASKED'/> <testcase classname='Asterisk_Tests' name='TC_ims_reregistration' time='MASKED'/> <testcase classname='Asterisk_Tests' name='TC_ims_call_mo' time='MASKED'/> + <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_mt' time='MASKED'/> <testcase classname='Asterisk_Tests' name='TC_ims_call_mt_noprecondition' time='MASKED'/>