laforge has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/39824?usp=email )
Change subject: asterisk: Rework test TC_ims_call_mo_after_tcp_conn_closed with new expectancies ......................................................................
asterisk: Rework test TC_ims_call_mo_after_tcp_conn_closed with new expectancies
Previous expected behavior (and Asterisk-UE implementation) was wrong. Since recently, Asterisk behaves better, that is, whenever the TCP conn is dropped by the peer, it will attempt re-connecting and re-registering.
Related: SYS#7398 Change-Id: I7ec1e8e30c4d72be96c8e300e0d038e63ba0e600 --- M asterisk/Asterisk_Tests.ttcn M asterisk/IMS_ConnectionHandler.ttcn 2 files changed, 65 insertions(+), 15 deletions(-)
Approvals: laforge: Looks good to me, but someone else must approve jolly: Looks good to me, approved Jenkins Builder: Verified
diff --git a/asterisk/Asterisk_Tests.ttcn b/asterisk/Asterisk_Tests.ttcn index dccf9fa..84ccb76 100644 --- a/asterisk/Asterisk_Tests.ttcn +++ b/asterisk/Asterisk_Tests.ttcn @@ -870,8 +870,7 @@ IMS_COORD.receive(IMS_COORD_CMD_CALL_REJECTED); }
-private function f_TC_ims_call_mo(boolean close_tcp_after_registration := false, - boolean use_precondition_ext := true, +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_sleep1), void_fn sip_fn := refers(f_TC_internal_call_mo), @@ -885,7 +884,6 @@
sip_pars := f_init_ConnHdlrPars(idx := 1); ims_pars := f_init_IMS_ConnHdlrPars(); - ims_pars.subscr.close_tcp_after_registration := close_tcp_after_registration;
f_ims_call_mo_configure(sip_pars, ims_pars); ims_pars.subscr.cp.support_precondition_ext := use_precondition_ext; @@ -947,13 +945,6 @@ f_TC_ims_call_mo(sip_fn := refers(f_TC_internal_call_mo_with_holdresume), ims_fn := refers(f_TC_ims_call_mo_IMS_ConnHdlr_with_holdresume)); } -/* TC_ims_call_mo, but IMS server closes the TCP conn used during 2nd register after ACKing it. - * Asterisk should consider it is still registered even if that TCP conn was closed, - * and MO call should work the same. - */ -testcase TC_ims_call_mo_after_tcp_conn_closed() runs on test_CT { - f_TC_ims_call_mo(close_tcp_after_registration := true); -}
/* Test a 2nd call initiated from a local SIP UA towards IMS after having HOLD the 1st one. */ private function call_established_fn_holdswitchresume(SIPConnHdlrPars sip_pars, IMS_ConnHdlrPars ims_pars) runs on test_CT { @@ -1019,6 +1010,70 @@ ims_fn := refers(f_TC_ims_call_mo_IMS_ConnHdlr_2nd_mt_rejected)); }
+/* TC_ims_call_mo, but IMS server closes the TCP conn used during 2nd register after ACKing it. + * Asterisk should then re-connect and re-register before placing a call towards IMS. */ +private function f_TC_ims_call_mo_after_tcp_conn_closed_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))); + /* First full register at the IMS: */ + as_IMS_register(); + f_sleep(1.0); + /* IMS closes TCP conn (TCP FIN/ACK): */ + f_IMS_tcp_close(); + /* Proceed similar to TC_ims_call_mo: expect new full register + MO call: */ + f_TC_ims_call_mo_IMS_ConnHdlr(id); +} +testcase TC_ims_call_mo_after_tcp_conn_closed() 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 := true; + ims_pars.subscr.cp.require_precondition_ext := true; + ims_pars.subscr.cp.mo.tx_coord_cmd_invite_trying := true; + ims_pars.subscr.cp.mo.support_timer_enable := false; + + vc_conn_ims := f_start_handler_IMS(refers(f_TC_ims_call_mo_after_tcp_conn_closed_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); + /* Here IMS_ConnHdlr will have dropped the TCP conn from IMS. */ + as_AMI_IMS_register_Auth(ims_pars); + + f_ims_call_mo_establish(vc_conn_sip, vc_conn_ims); + + /* Call on-going */ + var call_established_fn call_established_cb := refers(call_established_fn_sleep1); + 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; + + /* Notify network released dedicated bearer: */ + AMI_CLIENT.clear; + f_ami_action_DedicatedBearerStatus(AMI_CLIENT, + g_asterisk_chan_name, + "Down", fail_others := false); + + /* Trigger unregistration: */ + f_sleep(1.0); + COORD.send(COORD_CMD_UNREGISTER) to vc_conn_sip; + AMI_CLIENT.clear; + f_AMI_IMS_unregister(ims_pars); + + vc_conn_sip.done; + vc_conn_ims.done; + f_shutdown(); +} + /* 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))); diff --git a/asterisk/IMS_ConnectionHandler.ttcn b/asterisk/IMS_ConnectionHandler.ttcn index 39abc59..2f4168a 100644 --- a/asterisk/IMS_ConnectionHandler.ttcn +++ b/asterisk/IMS_ConnectionHandler.ttcn @@ -84,7 +84,6 @@ charstring msisdn, boolean support_video, boolean support_smsip, - boolean close_tcp_after_registration, /* Expected User-Location-Info in P-Access-Network-Info */ charstring uli_str, IMS_AuthVector auth, @@ -211,7 +210,6 @@ msisdn := msisdn, support_video := false, support_smsip := false, - close_tcp_after_registration := false, uli_str := "2380100010000101", auth := { /* The Nonce field is the Base64 encoded version of the RAND value and concatenated with the AUTN: */ @@ -1022,9 +1020,6 @@ supported := supported, userAgent := omit); SIP.send(tx_resp); - if (g_pars.subscr.close_tcp_after_registration) { - f_IMS_tcp_close(); - } } [fail_others] as_SIP_fail_resp(sip_expect_str); [fail_others] as_SIP_fail_req(sip_expect_str);