asterisk: Test auth resync procedure

A new test is added to validate the procedure, plus all refactoring
needed to accomodate for the new procedure.

Related: SYS#6961
Change-Id: I2c654c270aa908859ec0bbb4d1da30d58de99be4
diff --git a/asterisk/Asterisk_Tests.ttcn b/asterisk/Asterisk_Tests.ttcn
index 75c51e1..bb1ed90 100644
--- a/asterisk/Asterisk_Tests.ttcn
+++ b/asterisk/Asterisk_Tests.ttcn
@@ -364,7 +364,7 @@
 	setverdict(pass);
 }
 
-private function f_AMI_IMS_register(IMS_ConnHdlrPars pars) runs on test_CT
+private function f_AMI_IMS_start_register(IMS_ConnHdlrPars pars) runs on test_CT
 {
 	/* Give some time for IMS_ConnHdlr to register SIP expect. This could be done through IMS_COORD. */
 	f_sleep(1.0);
@@ -378,22 +378,38 @@
 
 	/* Trigger registration: */
 	f_ami_action_PJSIPRegister(AMI_CLIENT, mp_volte_ims_outbound_registration);
+}
 
+private altstep as_AMI_IMS_register_Auth(IMS_ConnHdlrPars pars, boolean resync := false) runs on test_CT
+{
 	var charstring rand_str := oct2str(pars.subscr.auth.rand);
 	var charstring autn_str := oct2str(pars.subscr.auth.autn);
-	AMI_CLIENT.receive(tr_AMI_Event_AuthRequest(mp_volte_ims_outbound_registration,
+	[not resync] AMI_CLIENT.receive(tr_AMI_Event_AuthRequest(mp_volte_ims_outbound_registration,
 						    rand := pattern @nocase rand_str,
-						    autn := pattern @nocase autn_str));
+						    autn := pattern @nocase autn_str)) {
+		f_ami_action_AuthResponse_RES(AMI_CLIENT,
+					mp_volte_ims_outbound_registration,
+					f_str_tolower(oct2str(pars.subscr.auth.res)),
+					f_str_tolower(oct2str(pars.subscr.auth.ck)),
+					f_str_tolower(oct2str(pars.subscr.auth.ik)));
 
-	f_ami_action_AuthResponse_RES(AMI_CLIENT,
-				      mp_volte_ims_outbound_registration,
-				      f_str_tolower(oct2str(pars.subscr.auth.res)),
-				      f_str_tolower(oct2str(pars.subscr.auth.ck)),
-				      f_str_tolower(oct2str(pars.subscr.auth.ik)));
+		AMI_CLIENT.receive(tr_AMI_Event_Registry(f_sip_SipAddr_to_str(pars.subscr.local_sip_record),
+							"sip:" & mp_ims_domain,
+							"Registered"));
+	}
+	[resync] AMI_CLIENT.receive(tr_AMI_Event_AuthRequest(mp_volte_ims_outbound_registration,
+						    rand := pattern @nocase rand_str,
+						    autn := pattern @nocase autn_str)) {
+		f_ami_action_AuthResponse_AUTS(AMI_CLIENT,
+				mp_volte_ims_outbound_registration,
+				f_str_tolower(oct2str(pars.subscr.auth.auts)));
+	}
+}
 
-	AMI_CLIENT.receive(tr_AMI_Event_Registry(f_sip_SipAddr_to_str(pars.subscr.local_sip_record),
-						 "sip:" & mp_ims_domain,
-						 "Registered"));
+private function f_AMI_IMS_register(IMS_ConnHdlrPars pars, boolean resync := false) runs on test_CT
+{
+	f_AMI_IMS_start_register(pars);
+	as_AMI_IMS_register_Auth(pars, resync := resync);
 }
 
 private function f_AMI_IMS_unregister(IMS_ConnHdlrPars pars) runs on test_CT
@@ -404,7 +420,7 @@
 						"Unregistered"));
 }
 
-/* Test SIP registration of local clients */
+/* Test IMS registration of VoLTE UE */
 private function f_TC_ims_registration(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();
@@ -430,6 +446,34 @@
 	f_shutdown();
 }
 
+/* Test IMS registration of VoLTE UE. ISIM Resync case. */
+private function f_TC_ims_registration_resync(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(exp_auth_resync := true);
+	as_IMS_unregister();
+	setverdict(pass);
+}
+testcase TC_ims_registration_resync() 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_resync), pars);
+
+	/* Emulate first Auth sync failure: */
+	f_AMI_IMS_register(pars, resync := true);
+	/* Second auth goes well: */
+	as_AMI_IMS_register_Auth(pars, resync := false);
+	/* Stay registered for one second */
+	f_sleep(1.0);
+
+	/* Trigger unregistration: */
+	f_AMI_IMS_unregister(pars);
+
+	vc_conn.done;
+	f_shutdown();
+}
+
 /* Test SIP registration of local clients */
 private function f_TC_ims_call_mo(charstring id) runs on IMS_ConnHdlr {
 	f_create_sip_expect(valueof(ts_SipUrl_from_Addr_Union(g_pars.subscr.registrar_sip_record.addr)));
@@ -568,6 +612,7 @@
 	execute( TC_internal_call_all_3registered() );
 	execute( TC_internal_call_all_4registered() );
 	execute( TC_ims_registration() );
+	execute( TC_ims_registration_resync() );
 	execute( TC_ims_call_mo() );
 	execute( TC_ims_call_mt() );
 }