asterisk: Introduce test TC_ims_reregistration

So far Asterisk seems to be doing "initial registration" during
re-registration, instead of using the existing security context.
This is "OK" afaiu, but not the best pick (TS 24.229 5.1.1.4.1).

Related: SYS#6983
Change-Id: Icaeec6e2be3469b9e49d4361ca2b039ab44683c0
diff --git a/asterisk/Asterisk_Tests.ttcn b/asterisk/Asterisk_Tests.ttcn
index cee7adc..6982146 100644
--- a/asterisk/Asterisk_Tests.ttcn
+++ b/asterisk/Asterisk_Tests.ttcn
@@ -561,6 +561,45 @@
 					      true, false);
 }
 
+/* Test IMS re-registration based on Expires (TS 24.229 5.1.1.4.1, RFC 3261 10.3)*/
+private function f_TC_ims_reregistration(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();
+
+	/* Re-Register: This should optimally be a as_IMS_2nd_register() instead... */
+	timer Trereg;
+	Trereg.start(int2float(g_pars.subscr.registrar_expires) - 5.0);
+	alt {
+	[] as_IMS_register();
+	[] Trereg.timeout {
+		Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, log2str(g_name & ": Timeout waiting for re-registration"));
+	}
+	}
+	Trereg.stop;
+
+	as_IMS_unregister();
+	setverdict(pass);
+}
+testcase TC_ims_reregistration() runs on test_CT {
+	var IMS_ConnHdlrPars pars;
+	var IMS_ConnHdlr vc_conn;
+	f_init();
+	pars := f_init_IMS_ConnHdlrPars();
+	pars.subscr.registrar_expires := 30;
+	vc_conn := f_start_handler_IMS(refers(f_TC_ims_reregistration), pars);
+
+	f_AMI_IMS_register(pars);
+
+	/* Re-Register: if this was a 2nd REGISTER, then reauth shouldn't be needed... */
+	as_AMI_IMS_register_Auth(pars, resync := false);
+
+	/* Trigger unregistration: */
+	f_AMI_IMS_unregister(pars);
+
+	vc_conn.done;
+	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)));
@@ -741,6 +780,7 @@
 	execute( TC_ims_registration_timeout_resync_401Unauthorized() );
 	execute( TC_ims_registration_timeout_protected_100Trying() );
 	execute( TC_ims_registration_timeout_protected_200OK() );
+	execute( TC_ims_reregistration() );
 	execute( TC_ims_call_mo() );
 	execute( TC_ims_call_mo_noprecondition() );
 	execute( TC_ims_call_mt() );
diff --git a/asterisk/expected-results.xml b/asterisk/expected-results.xml
index 31a03e5..65a495b 100644
--- a/asterisk/expected-results.xml
+++ b/asterisk/expected-results.xml
@@ -12,6 +12,7 @@
   <testcase classname='Asterisk_Tests' name='TC_ims_registration_timeout_resync_401Unauthorized' time='MASKED'/>
   <testcase classname='Asterisk_Tests' name='TC_ims_registration_timeout_protected_100Trying' time='MASKED'/>
   <testcase classname='Asterisk_Tests' name='TC_ims_registration_timeout_protected_200OK' 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_noprecondition' time='MASKED'/>
   <testcase classname='Asterisk_Tests' name='TC_ims_call_mt' time='MASKED'/>