dia2gsup: Introduce new error scenario tests

Related: OS#5757
Change-Id: Ic870a2c1de74bee3f7d8e26874635d58469ccbea
diff --git a/library/DIAMETER_Templates.ttcn b/library/DIAMETER_Templates.ttcn
index 63db7fc..8bb53e0 100644
--- a/library/DIAMETER_Templates.ttcn
+++ b/library/DIAMETER_Templates.ttcn
@@ -101,6 +101,22 @@
 	DIAMETER_ERROR_EAP_CODE_UNKNOWN			(5048)
 };
 
+/* 3GPP TS 29.272 section 7.4. Errors in Experimental-Result-Code */
+type enumerated DIAMETER_ExperimentalResultcode {
+	/* transient */
+	DIAMETER_AUTHENTICATION_DATA_UNAVAILABLE 	(4181),
+	DIAMETER_ERROR_CAMEL_SUBSCRIPTION_PRESENT 	(4182),
+	/* permanent */
+	DIAMETER_ERROR_USER_UNKNOWN			(5001),
+	DIAMETER_AUTHORIZATION_REJECTED			(5003),
+	DIAMETER_ERROR_ROAMING_NOT_ALLOWED		(5004),
+	DIAMETER_MISSING_AVP				(5005),
+	DIAMETER_ERROR_UNKNOWN_EPS_SUBSCRIPTION		(5420),
+	DIAMETER_ERROR_RAT_NOT_ALLOWED			(5421),
+	DIAMETER_ERROR_EQUIPMENT_UNKNOWN		(5422),
+	DIAMETER_ERROR_UNKOWN_SERVING_NODE		(5423)
+}
+
 /* Gy : 3GPP TS 32.299 7.1.6, RFC4006 3.1 */
 const uint32_t c_DIAMETER_CREDIT_CONTROL_AID := 4;
 /* 3GPP TS 29.272 Section 7.1.8 */
@@ -338,6 +354,24 @@
 		}
 	}
 }
+private function f_tr_AVP_VendorId(template (present) Vendor_Id vendor_id)
+return template (present) BASE_NONE_Vendor_Id {
+	if (istemplatekind(vendor_id, "?")) {
+		return ?;
+	} else {
+		var template (present) BASE_NONE_Vendor_Id c;
+		c := int2oct(enum2int(valueof(vendor_id)), 4);
+		return c;
+	}
+}
+template (present) GenericAVP tr_AVP_VendorId(template (present) Vendor_Id vendor_id) := {
+	avp := {
+		avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Vendor_Id),
+		avp_data := {
+			avp_BASE_NONE_Vendor_Id := f_tr_AVP_VendorId(vendor_id)
+		}
+	}
+}
 
 template (value) GenericAVP ts_AVP_ProductName(charstring name) := {
 	avp := {
@@ -451,6 +485,28 @@
 	}
 }
 
+template (present) GenericAVP tr_AVP_ExperimentalResultCode(template (present) AVP_Unsigned32 n := ?) := {
+	avp := {
+		avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Experimental_Result_Code),
+		avp_data := {
+			avp_BASE_NONE_Experimental_Result_Code := n
+		}
+	}
+}
+
+template (present) GenericAVP tr_AVP_ExperimentalResult(template (present) Vendor_Id vendor_id := ?,
+							template (present) AVP_Unsigned32 err_code := ?
+							) := {
+	avp := {
+		avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Experimental_Result),
+		avp_data := {
+			avp_BASE_NONE_Experimental_Result := {
+				tr_AVP_VendorId(vendor_id),
+				tr_AVP_ExperimentalResultCode(err_code)
+			}
+		}
+	}
+}
 
 template (value) GenericAVP ts_AVP_SuppVendorIdRaw(uint32_t vendor_id) := {
 	avp := {
@@ -471,11 +527,21 @@
 		}
 	}
 }
-template (present) GenericAVP tr_AVP_ResultCode(DIAMETER_Resultcode res_code) := {
+private function f_tr_DIAMETER_Resultcode(template (present) DIAMETER_Resultcode res_code)
+return template (present) BASE_NONE_Result_Code {
+	if (istemplatekind(res_code, "?")) {
+		return ?;
+	} else {
+		var template (present) BASE_NONE_Result_Code c;
+		c := int2oct(enum2int(valueof(res_code)), 4);
+		return c;
+	}
+}
+template (present) GenericAVP tr_AVP_ResultCode(template (present) DIAMETER_Resultcode res_code) := {
 	avp := {
 		avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Result_Code),
 		avp_data := {
-			avp_BASE_NONE_Result_Code := int2oct(enum2int(res_code), 4)
+			avp_BASE_NONE_Result_Code := f_tr_DIAMETER_Resultcode(res_code)
 		}
 	}
 }
@@ -1414,6 +1480,25 @@
 			tr_AVP_ResultCode(DIAMETER_SUCCESS),
 			tr_AVP_3GPP_AuthInfo(auth_info_contents)
 	));
+template (present) PDU_DIAMETER
+tr_DIA_AIA_ERR(template (present) GenericAVP err_avp := ?,
+	   template (present) octetstring sess_id := ?,
+	   template (present) charstring orig_host := ?,
+	   template (present) charstring orig_realm := ?,
+	   template (present) UINT32 hbh_id := ?,
+	   template (present) UINT32 ete_id := ?) :=
+	tr_DIAMETER(flags := '0???????'B,
+		    cmd_code := Authentication_Information,
+		    app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4),
+		    hbh_id := hbh_id,
+		    ete_id := ete_id,
+		    avps := superset(
+			tr_AVP_SessionId(sess_id),
+			tr_AVP_AuthSessionState(NO_STATE_MAINTAINED),
+			tr_AVP_OriginHost(orig_host),
+			tr_AVP_OriginRealm(orig_realm),
+			err_avp
+	));
 
 
 /* TS 29.272 7.2.3 Update Location Request */