epdg: Introduce test TC_authinfo_fail_resync

Related: OS#6396
Change-Id: I2769d331740324200b4512a154e1321bd5825b04
diff --git a/epdg/EPDG_Tests.ttcn b/epdg/EPDG_Tests.ttcn
index 164f14b..d8112e8 100644
--- a/epdg/EPDG_Tests.ttcn
+++ b/epdg/EPDG_Tests.ttcn
@@ -422,9 +422,24 @@
 }
 
 /* Diameter SWx MAR + MAA. */
-private altstep as_DIA_SWx_MA_success() runs on EPDG_ConnHdlr {
+private altstep as_DIA_SWx_MA_success(boolean exp_req_resync := false) runs on EPDG_ConnHdlr {
 	var PDU_DIAMETER rx_dia;
 	[] SWx.receive(tr_DIA_SWx_MAR(g_pars.imsi)) -> value rx_dia {
+		if (exp_req_resync) {
+			var octetstring rand_autn_concatenated := g_pars.vec.rand & g_pars.vec.auts;
+			var AVP avp_grp;
+			var GenericAVP sip_auth_avp;
+
+			avp_grp := f_DIAMETER_get_avp_or_fail(rx_dia, c_AVP_Code_CxDx_3GPP_SIP_Auth_Data_Item);
+			sip_auth_avp.avp := f_AVP_Grouped_get_avp_or_fail(avp_grp.avp_data.avp_CxDx_3GPP_SIP_Auth_Data_Item,
+									  c_AVP_Code_CxDx_3GPP_SIP_Authorization);
+
+			if (not match(sip_auth_avp, tr_AVP_3GPP_SIPAuthorization(rand_autn_concatenated))) {
+				Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+							log2str("Unexpected Diameter AVP SIP-Authorization: ", sip_auth_avp,
+								" vs exp ", tr_AVP_3GPP_SIPAuthorization(rand_autn_concatenated)));
+			}
+		}
 		f_DIA_SWx_tx_MAA_success(rx_dia);
 		setverdict(pass);
 	}
@@ -754,13 +769,19 @@
 	}
 }
 
-private function f_GSUP_tx_SAI_REQ() runs on EPDG_ConnHdlr {
+private function f_GSUP_tx_SAI_REQ(boolean req_resync := false) runs on EPDG_ConnHdlr {
 	var GSUP_PDU rx_gsup;
 	var template (value) GSUP_IEs pdp_info;
 	pdp_info := { ts_GSUP_IE_PDP_CONTEXT_ID('00'O),
 		      ts_GSUP_IE_PDP_ADDRESS(ts_EuaIPv4Dyn),
 		      ts_GSUP_IE_APN(f_enc_dns_hostname(g_pars.apn)) };
-	GSUP.send(ts_GSUP_SAI_REQ_PDP_INFO(g_pars.imsi, pdp_info));
+	if (req_resync) {
+		GSUP.send(ts_GSUP_SAI_REQ_PDP_INFO_UMTS_AKA_RESYNC(
+				g_pars.imsi, pdp_info,
+				g_pars.vec.auts, g_pars.vec.rand));
+	} else {
+		GSUP.send(ts_GSUP_SAI_REQ_PDP_INFO(g_pars.imsi, pdp_info));
+	}
 }
 
 
@@ -791,9 +812,9 @@
 }
 
 /* GSUP AuthInfo Req + Resp, triggers SWx MAR + MAA. */
-private function f_GSUP_AI_success() runs on EPDG_ConnHdlr {
-	f_GSUP_tx_SAI_REQ();
-	as_DIA_SWx_MA_success();
+private function f_GSUP_AI_success(boolean req_resync := false) runs on EPDG_ConnHdlr {
+	f_GSUP_tx_SAI_REQ(req_resync);
+	as_DIA_SWx_MA_success(req_resync);
 	as_GSUP_rx_SAI_RES();
 	setverdict(pass);
 }
@@ -942,6 +963,23 @@
 	setverdict(pass);
 }
 
+/* Emulate UE doing MAR+MAA, then UE requesting again due to resync needed */
+private function f_TC_authinfo_fail_resync(charstring id) runs on EPDG_ConnHdlr {
+	f_GSUP_AI_success(false);
+	f_GSUP_AI_success(true);
+	f_GSUP_LU_success();
+	f_GSUP_EPDGTunnel_success();
+	f_GSUP_PurgeMS_success();
+}
+testcase TC_authinfo_fail_resync() runs on MTC_CT {
+	var EPDG_ConnHdlrPars pars := f_init_pars();
+	var EPDG_ConnHdlr vc_conn;
+	f_init();
+	vc_conn := f_start_handler(refers(f_TC_authinfo_fail_resync), pars);
+	vc_conn.done;
+	setverdict(pass);
+}
+
 private function f_TC_ho_lte_to_wifi(charstring id) runs on EPDG_ConnHdlr {
 	f_initial_attach();
 	/* Whenever UE comes from 3GPP, PGW may activate a dedicated S2b bearer
@@ -1079,6 +1117,7 @@
 	execute ( TC_authinfo_normal() );
 	execute ( TC_authinfo_MAA_unknown_user() );
 	execute ( TC_authinfo_twice() );
+	execute ( TC_authinfo_fail_resync() );
 	execute ( TC_ho_lte_to_wifi() );
 	execute ( TC_ho_wifi_to_lte() );
 	execute ( TC_s2b_CreateSession_rejected() );
diff --git a/library/GSUP_Templates.ttcn b/library/GSUP_Templates.ttcn
index dcf086d..403af74 100644
--- a/library/GSUP_Templates.ttcn
+++ b/library/GSUP_Templates.ttcn
@@ -356,6 +356,18 @@
 			valueof(ts_GSUP_IE_PdpInfo_ie(pdp_info))
 			});
 
+template GSUP_PDU ts_GSUP_SAI_REQ_PDP_INFO_UMTS_AKA_RESYNC(
+		template (value) hexstring imsi,
+		template (value) GSUP_IEs pdp_info,
+		template (value) octetstring auts,
+		template (value) octetstring rand) :=
+	ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, {
+			valueof(ts_GSUP_IE_IMSI(imsi)),
+			valueof(ts_GSUP_IE_PdpInfo_ie(pdp_info)),
+			valueof(ts_GSUP_IE_AUTS(auts)),
+			valueof(ts_GSUP_IE_RAND(rand))
+			});
+
 template GSUP_PDU tr_GSUP_SAI_REQ(template hexstring imsi) :=
 	tr_GSUP_IMSI(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, imsi);
 
@@ -644,7 +656,7 @@
 	}
 }
 
-template (value) GSUP_IE ts_GSUP_IE_AUTS(octetstring auts) := {
+template (value) GSUP_IE ts_GSUP_IE_AUTS(template (value) octetstring auts) := {
 	tag := OSMO_GSUP_AUTS_IE,
 	len := 0, /* overwritten */
 	val := {
@@ -660,7 +672,7 @@
 	}
 }
 
-template (value) GSUP_IE ts_GSUP_IE_RAND(octetstring rand) := {
+template (value) GSUP_IE ts_GSUP_IE_RAND(template (value) octetstring rand) := {
 	tag := OSMO_GSUP_RAND_IE,
 	len := 0, /* overwritten */
 	val := {