asterisk: Introduce test TC_ims_call_mt

This test validates scenario where a call for Asterisk
from IMS Core comes in, Asterisk forwards it to the only
local SIP UA registered, the call becomes established and
then finally IMS Core hangs up after one second.

Change-Id: I2af846f92b6ebca21d1286f5137cb004b6284ddf
diff --git a/asterisk/Asterisk_Tests.ttcn b/asterisk/Asterisk_Tests.ttcn
index c4cad38..75c51e1 100644
--- a/asterisk/Asterisk_Tests.ttcn
+++ b/asterisk/Asterisk_Tests.ttcn
@@ -225,11 +225,13 @@
 		return;
 	}
 
-	as_SIP_mt_call_accept();
+	as_SIP_mt_call_accept(exp_update_to_direct_rtp := g_pars.cp.exp_update_to_direct_rtp);
 	COORD.send(COORD_CMD_CALL_ESTABLISHED);
 
-	/* Once MO hangs up, Asterisk updates us to point RTP to it: */
-	as_SIP_exp_call_update(g_pars.cp.sip_seq_nr + 1);
+	if (g_pars.cp.exp_update_to_direct_rtp) {
+		/* Once MO hangs up, Asterisk updates us to point RTP to it: */
+		as_SIP_exp_call_update(g_pars.cp.sip_seq_nr + 1);
+	}
 	as_SIP_exp_call_hangup(g_pars.cp.sip_seq_nr + 1);
 
 	setverdict(pass);
@@ -491,6 +493,74 @@
 	f_shutdown();
 }
 
+/* Test SIP registration of local clients */
+private function f_TC_ims_call_mt(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();
+	COORD.send(IMS_COORD_CMD_REGISTERED);
+	setverdict(pass);
+
+	COORD.receive(IMS_COORD_CMD_START);
+	f_IMS_mt_call_setup();
+	setverdict(pass);
+	COORD.send(IMS_COORD_CMD_CALL_ESTABLISHED);
+
+	COORD.receive(IMS_COORD_CMD_HANGUP);
+	f_IMS_do_call_hangup();
+	setverdict(pass);
+
+	as_IMS_unregister();
+}
+testcase TC_ims_call_mt() runs on test_CT {
+	var SIPConnHdlrPars sip_pars;
+	var IMS_ConnHdlrPars ims_pars;
+	var SIPConnHdlr vc_conn_sip;
+	var IMS_ConnHdlr vc_conn_ims;
+	const charstring c_ext_msisdn := "90829";
+
+	f_init();
+
+	sip_pars := f_init_ConnHdlrPars(idx := 1);
+	ims_pars := f_init_IMS_ConnHdlrPars();
+
+	sip_pars.cp.exp_update_to_direct_rtp := false;
+	sip_pars.cp.calling := valueof(ts_SipAddr(ts_HostPort(sip_pars.remote_sip_host),
+						 ts_UserInfo(c_ext_msisdn)));
+	sip_pars.cp.called := sip_pars.local_sip_record;
+	ims_pars.subscr.cp.calling := valueof(ts_SipAddr(ts_HostPort(ims_pars.realm),
+							ts_UserInfo(c_ext_msisdn)));
+	ims_pars.subscr.cp.called := valueof(ts_SipAddr(ts_HostPort(ims_pars.realm),
+							 ts_UserInfo(ims_pars.subscr.msisdn)));
+
+	vc_conn_ims := f_start_handler_IMS(refers(f_TC_ims_call_mt), ims_pars);
+	vc_conn_sip := f_start_handler(refers(f_TC_internal_call_mt), sip_pars);
+
+	COORD.receive(COORD_CMD_REGISTERED) from vc_conn_sip;
+
+	f_AMI_IMS_register(ims_pars);
+	IMS_COORD.receive(IMS_COORD_CMD_REGISTERED) from vc_conn_ims;
+
+	IMS_COORD.send(IMS_COORD_CMD_START) to vc_conn_ims;
+	IMS_COORD.receive(IMS_COORD_CMD_CALL_ESTABLISHED) from vc_conn_ims;
+	COORD.receive(COORD_CMD_CALL_ESTABLISHED) from vc_conn_sip;
+
+	/* TODO: "Action: DedicatedBearerStatus" */
+
+	/* Call on-going */
+	f_sleep(1.0);
+
+	IMS_COORD.send(IMS_COORD_CMD_HANGUP) to vc_conn_ims;
+
+	/* Trigger unregistration: */
+	f_sleep(1.0);
+	AMI_CLIENT.clear;
+	f_AMI_IMS_unregister(ims_pars);
+
+	vc_conn_sip.done;
+	vc_conn_ims.done;
+	f_shutdown();
+}
+
 control {
 	execute( TC_internal_registration() );
 	execute( TC_internal_call_momt() );
@@ -499,6 +569,7 @@
 	execute( TC_internal_call_all_4registered() );
 	execute( TC_ims_registration() );
 	execute( TC_ims_call_mo() );
+	execute( TC_ims_call_mt() );
 }
 
 }