dia2gsup: Introduce new error scenario tests

Related: OS#5757
Change-Id: Ic870a2c1de74bee3f7d8e26874635d58469ccbea
diff --git a/dia2gsup/DIA2GSUP_Tests.ttcn b/dia2gsup/DIA2GSUP_Tests.ttcn
index 6a3f85c..673038c 100644
--- a/dia2gsup/DIA2GSUP_Tests.ttcn
+++ b/dia2gsup/DIA2GSUP_Tests.ttcn
@@ -214,8 +214,145 @@
 	setverdict(pass);
 }
 
+private function f_DIA_AI_gsup_error(integer gsup_cause, template (present) GenericAVP err_avp) runs on D2G_ConnHdlr {
+	var PDU_DIAMETER rx_dia;
+	var UINT32 hbh_id := f_rnd_octstring(4);
+	var UINT32 ete_id := f_rnd_octstring(4);
+	var octetstring sess_id := char2oct("foobar");
+	var OCT3 vplmn := '00F110'O;
+
+	/* Unlike AIR, AIA contains no IMSI. Register ete_id in DIAMETER_Emulation,
+	 * so AIA is forwarded back to us in DIAMETER port instead of MTC_CT.DIAMETER_UNIT.
+	 */
+	f_diameter_expect_eteid(ete_id);
+
+	/* Send AIR to translator; expect it to show up on GSUP side */
+	DIAMETER.send(ts_DIA_AIR(g_pars.imsi, vplmn, sess_id, hbh_id := hbh_id, ete_id := ete_id));
+	GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
+
+	/* Send an error response back to the translator; expect AIA */
+	GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, gsup_cause));
+
+	alt {
+	/* Unlike AIR, AIA contains no IMSI, hence it is received in DIAMETER_UNIT: */
+	[] DIAMETER.receive(tr_DIA_AIA_ERR(err_avp)) {
+		setverdict(pass);
+		}
+	[] DIAMETER.receive(PDU_DIAMETER:?) -> value rx_dia {
+		Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, log2str("Unexpected Diameter msg rx: ", rx_dia));
+		}
+	}
+}
+
+private function f_TC_authinfo_gsup_err_imsi_unknown(charstring id) runs on D2G_ConnHdlr {
+	var DIAMETER_ExperimentalResultcode res_code := DIAMETER_ERROR_USER_UNKNOWN;
+	f_DIA_AI_gsup_error(2, tr_AVP_ExperimentalResult(vendor_id_3GPP, int2oct(enum2int(res_code), 4)));
+}
+testcase TC_authinfo_gsup_err_imsi_unknown() runs on MTC_CT {
+	var D2G_ConnHdlrPars pars := f_init_pars();
+	var D2G_ConnHdlr vc_conn;
+	f_init();
+	vc_conn := f_start_handler(refers(f_TC_authinfo_gsup_err_imsi_unknown), pars);
+	vc_conn.done;
+	setverdict(pass);
+}
+
+private function f_TC_authinfo_gsup_err_illegal_ms(charstring id) runs on D2G_ConnHdlr {
+	var DIAMETER_ExperimentalResultcode res_code := DIAMETER_ERROR_USER_UNKNOWN;
+	f_DIA_AI_gsup_error(3, tr_AVP_ExperimentalResult(vendor_id_3GPP, int2oct(enum2int(res_code), 4)));
+}
+testcase TC_authinfo_gsup_err_illegal_ms() runs on MTC_CT {
+	var D2G_ConnHdlrPars pars := f_init_pars();
+	var D2G_ConnHdlr vc_conn;
+	f_init();
+	vc_conn := f_start_handler(refers(f_TC_authinfo_gsup_err_illegal_ms), pars);
+	vc_conn.done;
+	setverdict(pass);
+}
+
+private function f_TC_authinfo_gsup_err_plmn_not_allowed(charstring id) runs on D2G_ConnHdlr {
+	f_DIA_AI_gsup_error(11, tr_AVP_ResultCode(DIAMETER_UNABLE_TO_COMPLY));
+}
+testcase TC_authinfo_gsup_err_plmn_not_allowed() runs on MTC_CT {
+	var D2G_ConnHdlrPars pars := f_init_pars();
+	var D2G_ConnHdlr vc_conn;
+	f_init();
+	vc_conn := f_start_handler(refers(f_TC_authinfo_gsup_err_plmn_not_allowed), pars);
+	vc_conn.done;
+	setverdict(pass);
+}
+
+private function f_TC_authinfo_gsup_err_romaning_not_allowed(charstring id) runs on D2G_ConnHdlr {
+	var DIAMETER_ExperimentalResultcode res_code := DIAMETER_ERROR_ROAMING_NOT_ALLOWED;
+	f_DIA_AI_gsup_error(12, tr_AVP_ExperimentalResult(vendor_id_3GPP, int2oct(enum2int(res_code), 4)));
+}
+testcase TC_authinfo_gsup_err_romaning_not_allowed() runs on MTC_CT {
+	var D2G_ConnHdlrPars pars := f_init_pars();
+	var D2G_ConnHdlr vc_conn;
+	f_init();
+	vc_conn := f_start_handler(refers(f_TC_authinfo_gsup_err_romaning_not_allowed), pars);
+	vc_conn.done;
+	setverdict(pass);
+}
+
+private function f_TC_authinfo_gsup_err_net_fail(charstring id) runs on D2G_ConnHdlr {
+	f_DIA_AI_gsup_error(17, tr_AVP_ResultCode(DIAMETER_UNABLE_TO_COMPLY));
+}
+testcase TC_authinfo_gsup_err_net_fail() runs on MTC_CT {
+	var D2G_ConnHdlrPars pars := f_init_pars();
+	var D2G_ConnHdlr vc_conn;
+	f_init();
+	vc_conn := f_start_handler(refers(f_TC_authinfo_gsup_err_net_fail), pars);
+	vc_conn.done;
+	setverdict(pass);
+}
+
+private function f_TC_authinfo_gsup_err_congestion(charstring id) runs on D2G_ConnHdlr {
+	f_DIA_AI_gsup_error(22, tr_AVP_ResultCode(DIAMETER_UNABLE_TO_COMPLY));
+}
+testcase TC_authinfo_gsup_err_congestion() runs on MTC_CT {
+	var D2G_ConnHdlrPars pars := f_init_pars();
+	var D2G_ConnHdlr vc_conn;
+	f_init();
+	vc_conn := f_start_handler(refers(f_TC_authinfo_gsup_err_congestion), pars);
+	vc_conn.done;
+	setverdict(pass);
+}
+
+private function f_TC_authinfo_gsup_err_auth_unacceptable(charstring id) runs on D2G_ConnHdlr {
+	f_DIA_AI_gsup_error(23, tr_AVP_ResultCode(DIAMETER_UNABLE_TO_COMPLY));
+}
+testcase TC_authinfo_gsup_err_auth_unacceptable() runs on MTC_CT {
+	var D2G_ConnHdlrPars pars := f_init_pars();
+	var D2G_ConnHdlr vc_conn;
+	f_init();
+	vc_conn := f_start_handler(refers(f_TC_authinfo_gsup_err_auth_unacceptable), pars);
+	vc_conn.done;
+	setverdict(pass);
+}
+
+private function f_TC_authinfo_gsup_err_proto_unspec(charstring id) runs on D2G_ConnHdlr {
+	f_DIA_AI_gsup_error(23, tr_AVP_ResultCode(DIAMETER_UNABLE_TO_COMPLY));
+}
+testcase TC_authinfo_gsup_err_proto_unspec() runs on MTC_CT {
+	var D2G_ConnHdlrPars pars := f_init_pars();
+	var D2G_ConnHdlr vc_conn;
+	f_init();
+	vc_conn := f_start_handler(refers(f_TC_authinfo_gsup_err_proto_unspec), pars);
+	vc_conn.done;
+	setverdict(pass);
+}
+
 control {
 	execute ( TC_authinfo_normal() );
+	execute ( TC_authinfo_gsup_err_imsi_unknown() );
+	execute ( TC_authinfo_gsup_err_illegal_ms() );
+	execute ( TC_authinfo_gsup_err_plmn_not_allowed() );
+	execute ( TC_authinfo_gsup_err_romaning_not_allowed() );
+	execute ( TC_authinfo_gsup_err_net_fail() );
+	execute ( TC_authinfo_gsup_err_congestion() );
+	execute ( TC_authinfo_gsup_err_auth_unacceptable() );
+	execute ( TC_authinfo_gsup_err_proto_unspec() );
 }
 
 }