asterisk: Initial IMS registration

This patch is a step towards testing IMS.
So far only the code infrstrastructure to handle the 1st REGISTER
(outside IPSEC) is provided. It can already be seen how Asterisk
sends the second REGISTER over IPSEC, but there's no means to test it
yet in TTCN-3. This will be done in a follow-up patch, which may take
some work.

Change-Id: Idb3b19ccd82cad25948106b2c72aa424d7f79cd8
diff --git a/asterisk/Asterisk_Tests.ttcn b/asterisk/Asterisk_Tests.ttcn
index 08a5f65..8a124c1 100644
--- a/asterisk/Asterisk_Tests.ttcn
+++ b/asterisk/Asterisk_Tests.ttcn
@@ -37,6 +37,7 @@
 
 	charstring mp_local_ims_host := "127.0.0.3";
 	integer mp_local_ims_port := 5060;
+	charstring mp_ims_imsi := "238010000090828";
 
 	/* Asterisk AMI: */
 	charstring mp_ami_remote_host := "127.0.0.1";
@@ -45,6 +46,7 @@
 	integer mp_ami_local_port := 0;
 	charstring mp_ami_user := "test_user";
 	charstring mp_ami_secret := "1234";
+	charstring mp_volte_ims_outbound_registration := "volte_ims";
 }
 
 type component test_CT {
@@ -74,6 +76,15 @@
 	return valueof(pars);
 }
 
+function f_init_IMS_ConnHdlrPars(integer idx := 1) runs on test_CT return IMS_ConnHdlrPars {
+	var template (value) IMS_CallPars cp := t_IMS_CallPars(mp_local_sip_host, 1234 + 2*idx);
+	var template (value) IMS_ConnHdlrPars pars := t_IMS_Pars(mp_local_ims_host,
+								 mp_local_ims_port,
+								 mp_ims_imsi,
+								 cp := cp);
+	return valueof(pars);
+}
+
 /* Initialize connection towards Asterisk AMI */
 private function f_init_ami() runs on test_CT {
 	var charstring id := "Asterisk_Tests_AMI_EMU";
@@ -139,6 +150,22 @@
 	return vc_conn;
 }
 
+function f_start_handler_IMS(ims_void_fn fn, IMS_ConnHdlrPars pars)
+runs on test_CT return IMS_ConnHdlr {
+	var IMS_ConnHdlr vc_conn;
+	var charstring id := testcasename() & "-IMS_ConnHdlr-" & pars.user;
+
+	vc_conn := IMS_ConnHdlr.create(id) alive;
+
+	connect(vc_conn:SIP, vc_IMS:CLIENT);
+	connect(vc_conn:SIP_PROC, vc_IMS:CLIENT_PROC);
+
+	connect(vc_conn:COORD, self:IMS_COORD);
+
+	vc_conn.start(f_ims_handler_init(fn, id, pars));
+	return vc_conn;
+}
+
 /* Test SIP registration of local clients */
 private function f_TC_internal_registration(charstring id) runs on SIPConnHdlr {
 
@@ -322,12 +349,51 @@
 	setverdict(pass);
 }
 
+/* Test SIP registration of local clients */
+private function f_TC_ims_registration(charstring id) runs on IMS_ConnHdlr {
+	f_create_sip_expect(valueof(ts_SipUrl_from_Addr_Union(g_pars.registrar_sip_record.addr)));
+	as_IMS_register();
+	setverdict(pass);
+}
+testcase TC_ims_registration() runs on test_CT {
+	var IMS_ConnHdlrPars pars;
+	var IMS_ConnHdlr vc_conn;
+	f_init();
+	pars := f_init_IMS_ConnHdlrPars();
+	vc_conn := f_start_handler_IMS(refers(f_TC_ims_registration), pars);
+
+	/* Give some time for IMS_ConnHdlr to register SIP expect. This could be done through IMS_COORD. */
+	f_sleep(1.0);
+	/* Clear events: */
+	AMI_CLIENT.clear;
+	/* Trigger registration: */
+	f_ami_action_PJSIPRegister(AMI_CLIENT, mp_volte_ims_outbound_registration);
+	/* TODO: Rx "Event: AuthRequest" */
+	/* TODO: Tx "Action: AuthResponse" */
+	/* TODO: Rx "Response: Success" */
+	/* TODO: once registration is successful, rx:
+	 * Event: Registry
+	 * ChannelType: pjsip
+	 * Username: <value>
+	 * Domain: <value>
+	 * Status: <value>
+	 * Cause: <value> */
+
+	 /* TODO: test "Action: PJSIPUnregister" */
+
+	 /* TODO: in another test emulating a call, test "Action: DedicatedBearerStatus" */
+
+	vc_conn.done;
+	f_shutdown();
+}
+
 control {
 	execute( TC_internal_registration() );
 	execute( TC_internal_call_momt() );
 	execute( TC_internal_call_all_2registered() );
 	execute( TC_internal_call_all_3registered() );
 	execute( TC_internal_call_all_4registered() );
+	execute( TC_ims_registration() );
 }
 
 }