From cceba47aabe840743f3bfeea67fd2e2fde04273f Mon Sep 17 00:00:00 2001
From: balaskoa <Jeno.Balasko@ericsson.com>
Date: Mon, 6 Jan 2020 08:27:34 +0100
Subject: [PATCH] OER_EncDec test speed up (script elimination)

Signed-off-by: balaskoa <Jeno.Balasko@ericsson.com>
Change-Id: I7ebbc43a0dc8257a1fd0efe323730e41b5a54c67
---
 function_test/Makefile                        |   5 +-
 function_test/OER_EncDec/.gitignore           |   7 +
 function_test/OER_EncDec/ETSITS103097v131.asn |  14 +
 ...pt => ETSI_TS_103_097_v131_Testcases.ttcn} | 167 ++---
 function_test/OER_EncDec/ISOIEC8825.asn       |  24 +
 .../OER_EncDec/ISOIEC8825_Testcases.ttcn      | 138 +++++
 function_test/OER_EncDec/ITSPKI.asn           | 152 +++++
 .../OER_EncDec/ITSPKI_Testcases.ttcn          | 578 ++++++++++++++++++
 function_test/OER_EncDec/Makefile             |  16 +-
 function_test/OER_EncDec/OER_EncDec.cfg       |  22 +
 function_test/README.txt                      |   4 +-
 11 files changed, 989 insertions(+), 138 deletions(-)
 create mode 100755 function_test/OER_EncDec/.gitignore
 create mode 100755 function_test/OER_EncDec/ETSITS103097v131.asn
 rename function_test/OER_EncDec/{OER_EncDec_ETSI_TS_103_097_v131.script => ETSI_TS_103_097_v131_Testcases.ttcn} (70%)
 mode change 100644 => 100755
 create mode 100755 function_test/OER_EncDec/ISOIEC8825.asn
 create mode 100755 function_test/OER_EncDec/ISOIEC8825_Testcases.ttcn
 create mode 100755 function_test/OER_EncDec/ITSPKI.asn
 create mode 100755 function_test/OER_EncDec/ITSPKI_Testcases.ttcn
 create mode 100755 function_test/OER_EncDec/OER_EncDec.cfg

diff --git a/function_test/Makefile b/function_test/Makefile
index 33d609dd7..445e01ac3 100644
--- a/function_test/Makefile
+++ b/function_test/Makefile
@@ -17,7 +17,7 @@
 #
 ##############################################################################
 # Makefile to run the non-interactive tests
-DIRS := BER_EncDec RAW_EncDec Text_EncDec XER_EncDec Semantic_Analyser Semantic_Analyser_Csaba Config_Parser
+DIRS := BER_EncDec RAW_EncDec Text_EncDec XER_EncDec OER_EncDec Semantic_Analyser Semantic_Analyser_Csaba Config_Parser
 
 SCRIPTFLAGS :=
 
@@ -81,6 +81,9 @@ Text_EncDec:
 
 XER_EncDec:
 	cd $@; make -j; make run
+	
+OER_EncDec:
+	cd $@; make -j; make run
 
 Semantic_Analyser:
 	cd $@; if [ ! -f perl ] ; then ln -s `which perl` perl; fi; ./run_test_all $(SCRIPTFLAGS)
diff --git a/function_test/OER_EncDec/.gitignore b/function_test/OER_EncDec/.gitignore
new file mode 100755
index 000000000..4e23998bc
--- /dev/null
+++ b/function_test/OER_EncDec/.gitignore
@@ -0,0 +1,7 @@
+compile
+*.hh
+*.cc
+*.o
+*.gcda
+*.gcno
+result.txt
\ No newline at end of file
diff --git a/function_test/OER_EncDec/ETSITS103097v131.asn b/function_test/OER_EncDec/ETSITS103097v131.asn
new file mode 100755
index 000000000..6ee0e5108
--- /dev/null
+++ b/function_test/OER_EncDec/ETSITS103097v131.asn
@@ -0,0 +1,14 @@
+ETSITS103097v131 DEFINITIONS ::=
+
+BEGIN
+
+IMPORTS
+  Certificate, Ieee1609Dot2Data FROM IEEE1609dot2 {
+    iso(1) identified-organization(3) ieee(111)
+    standards-association-numbered-series-standards(2) wave-stds(1609)
+    dot2(2) base(1) schema(1) major-version-2(2)
+  };
+
+  TestIeee1609Dot2Data ::= Ieee1609Dot2Data
+  TestCertificate ::= Certificate
+END
diff --git a/function_test/OER_EncDec/OER_EncDec_ETSI_TS_103_097_v131.script b/function_test/OER_EncDec/ETSI_TS_103_097_v131_Testcases.ttcn
old mode 100644
new mode 100755
similarity index 70%
rename from function_test/OER_EncDec/OER_EncDec_ETSI_TS_103_097_v131.script
rename to function_test/OER_EncDec/ETSI_TS_103_097_v131_Testcases.ttcn
index d3ae1b688..ceeb2c67d
--- a/function_test/OER_EncDec/OER_EncDec_ETSI_TS_103_097_v131.script
+++ b/function_test/OER_EncDec/ETSI_TS_103_097_v131_Testcases.ttcn
@@ -1,128 +1,40 @@
-.******************************************************************************
-.* Copyright (c) 2000-2019 Ericsson Telecom AB
-.* All rights reserved. This program and the accompanying materials
-.* are made available under the terms of the Eclipse Public License v2.0
-.* which accompanies this distribution, and is available at
-.* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
-.*
-.* Contributors:
-.*   Balasko, Jeno
-.*   Beres, Szabolcs
-.*   Delic, Adam
-.*   Kovacs, Ferenc
-.*   Szabados, Kristof
-.*
-.******************************************************************************/
-:text.
-:lang eng.
-.*
-:docname.Test Description
-:docno.8/152 91-CRL 113 200/5 Uen
-:rev.C
-:date.2015-04-27
-.*
-:prep.ETH/XZR Kristof Szabados (+36 1 437 7256)
-:appr.ETH/XZ (Roland Gecse)
-:checked.ETHBAAT
-.*
-:title.Test Description - OER coder
-:contents level=3.
-.*---------------------------------------------------------------------*
-:h1.PREREQUISITES AND PREPARATIONS
-.*---------------------------------------------------------------------*
-.*---------------------------------------------------------------------*
-:h2.Scope of the Test Object
-.*---------------------------------------------------------------------*
-:xmp tab=1 nokeep.
-
-This TD contains unified test cases related to TTCN3 Executor's OER coder function.
-
-The target of these test cases are the basic data types from specification
-'ISO/IEC 8825-7:2015 -- Information technology – ASN.1 encoding rules:
-Specification of Octet Encoding Rules'
-
-The target data types are used in the following technical specification:
- 'ETSI TS 103 097 V1.3.1 (2017-10)'
-Intelligent Transport Systems (ITS); Security;
-Security header and certificate formats and certificate formats 
-
- 'IEEE Std 1609.2-2016 IEEE Standard'
-Wireless Access in Vehicular Environments—Security Services for
-Applications and Management Messages
-
-:exmp.
-
-:p.:us.Revision Information:eus.
-
-:xmp nokeep.
-:us.History:eus.
-
-REV   DATE         PREPARED   CHANGE
-===   ==========   ========   ======
-A     2003-10-31   ETHEKR     New document
-B     2007-03-06   EDMDELI    Implicit message encoding
-C     2007-03-21   EJNOSZA    Bugfix in a testcase for implicit msg. enc.
-D     2008-10-01   EFERKOV    Big integers
-E     2010-01-18   EKRISZA    Updated for TITAN R8C
-F     2011-06-18   EKRISZA    Added tests for errors
-A     2011-12-12   EKRISZA     Updated for release
-PB1   2011-01-30   ETHBAAT    Editorial changes
-
-:exmp.
-
-
-.*---------------------------------------------------------------------*
-:h2.Test Tools
-.*---------------------------------------------------------------------*
-:p.:us.Software Tools:eus.
-:xmp tab=2 nokeep.
-
-	SAtester
-
-:exmp.
-:np.
-.*---------------------------------------------------------------------*
-:h1.REQUIREMENT-BASED TESTS
-.*---------------------------------------------------------------------*
-.*---------------------------------------------------------------------*
-:h2.Testing OER encoding of the basic types
-.*---------------------------------------------------------------------*
-.*---------------------------------------------------------------------*
-:h3. OER encoding
-.*---------------------------------------------------------------------*
-:xmp tab=0.
-
-<TC - OER encoding (unified tests)>
-
-<STATIC:ASN>
-
-TempA
-
-DEFINITIONS ::=
-
-BEGIN
-
-IMPORTS
-  Certificate, Ieee1609Dot2Data FROM IEEE1609dot2 {
-    iso(1) identified-organization(3) ieee(111)
-    standards-association-numbered-series-standards(2) wave-stds(1609)
-    dot2(2) base(1) schema(1) major-version-2(2)
-  };
-
-  TestIeee1609Dot2Data ::= Ieee1609Dot2Data
-  TestCertificate ::= Certificate
-
-END
-
-<STATIC>
-
-
+/******************************************************************************
+ * Copyright (c) 2000-2019 Ericsson Telecom AB
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
+ *
+ * Contributors:
+ *   Balasko, Jeno
+ *   Beres, Szabolcs
+ *   Delic, Adam
+ *   Kovacs, Ferenc
+ *   Szabados, Kristof
+ *
+ ******************************************************************************/
+//The target of these test cases are the basic data types from specification
+//'ISO/IEC 8825-7:2015 -- Information technology – ASN.1 encoding rules:
+//Specification of Octet Encoding Rules'
+//
+//The target data types are used in the following technical specification:
+// 'ETSI TS 103 097 V1.3.1 (2017-10)'
+//Intelligent Transport Systems (ITS); Security;
+//Security header and certificate formats and certificate formats 
+//
+// 'IEEE Std 1609.2-2016 IEEE Standard'
+//Wireless Access in Vehicular Environments—Security Services for
+//Applications and Management Messages
+module ETSI_TS_103_097_v131_Testcases {
+
+import from ETSITS103097v131 all;
 type component Test_CT {}
-
-<TTCN_TC:PURE_EXEC>
-
-import from TempA all;
-
+//---------------------------------------------------------------------*
+// Testing OER encoding of the basic types
+//---------------------------------------------------------------------*
+//---------------------------------------------------------------------*
+// OER encoding
+//---------------------------------------------------------------------*
 external function enc_Ieee1609Dot2Data(in TestIeee1609Dot2Data pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
 external function dec_Ieee1609Dot2Data(in octetstring stream) return TestIeee1609Dot2Data with { extension "prototype(convert) decode(OER)" }
 
@@ -349,9 +261,4 @@ control {
   execute(tc_Ieee1609Dot2Data_SignedWithCertificate());
 }
 
-<RESULT>
-
-Overall verdict: pass
-
-<END_TC>
-
+}
diff --git a/function_test/OER_EncDec/ISOIEC8825.asn b/function_test/OER_EncDec/ISOIEC8825.asn
new file mode 100755
index 000000000..9c2e8dd61
--- /dev/null
+++ b/function_test/OER_EncDec/ISOIEC8825.asn
@@ -0,0 +1,24 @@
+ISOIEC8825 DEFINITIONS ::=
+
+BEGIN
+
+  IMPORTS;
+
+  Date ::= [APPLICATION 3] IMPLICIT VisibleString -- YYYYMMDD
+  EmployeeNumber ::= [APPLICATION 2] IMPLICIT INTEGER
+  Name ::= [APPLICATION 1] IMPLICIT SEQUENCE   {
+	givenName VisibleString,
+	initial VisibleString,
+	familyName VisibleString }
+  ChildInformation ::= SET {
+	name Name,
+	dateOfBirth [0] Date}
+  Record ::= [APPLICATION 0] IMPLICIT SET {
+	name Name,
+	title [0] VisibleString,
+	number EmployeeNumber,
+	dateOfHire [1] Date,
+	nameOfSpouse [2] Name,
+	children [3] IMPLICIT SEQUENCE OF ChildInformation DEFAULT {} }
+END
+
diff --git a/function_test/OER_EncDec/ISOIEC8825_Testcases.ttcn b/function_test/OER_EncDec/ISOIEC8825_Testcases.ttcn
new file mode 100755
index 000000000..7e8fd8ab7
--- /dev/null
+++ b/function_test/OER_EncDec/ISOIEC8825_Testcases.ttcn
@@ -0,0 +1,138 @@
+/******************************************************************************
+* Copyright (c) 2000-2019 Ericsson Telecom AB
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v2.0
+* which accompanies this distribution, and is available at
+* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
+*
+* Contributors:
+*   Balasko, Jeno
+*   Beres, Szabolcs
+*   Delic, Adam
+*   Kovacs, Ferenc
+*   Szabados, Kristof
+*   Tarasov, Victor
+*
+******************************************************************************/
+//This file replaces ISOIEC-8825-7-2015-AnnexA-PersonnelRecord.script
+
+//This file contains unified test case related to TTCN3 Executor's OER coder function.
+//Test case implement the OER codings example from specification ISO/IEC 8825-7:2015 
+//(https://www.itu.int/rec/T-REC-X.696-201508-I)
+
+//---------------------------------------------------------------------
+//Testing OER encodings
+//---------------------------------------------------------------------
+//ISOIEC_8825_7_2015_AnnexA_PersonnelRecord
+module ISOIEC8825_Testcases {
+
+import from ISOIEC8825 all;
+type component Test_CT {}
+//import from TempA all;
+
+external function enc_OER_Date(in Date pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Date(in octetstring stream) return Date with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_EmployeeNumber(in EmployeeNumber pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_EmployeeNumber(in octetstring stream) return EmployeeNumber with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_Name(in Name pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Name(in octetstring stream) return Name with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_ChildInformation(in ChildInformation pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_ChildInformation(in octetstring stream) return ChildInformation with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_Record(in Record pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Record(in octetstring stream) return Record with { extension "prototype(convert) decode(OER)" }
+
+//*********************************************
+// TESTCASES
+//*********************************************
+
+testcase tc_OER_encoding_of_Date() runs on Test_CT {
+  const Date date :=  "19710917"
+  const octetstring raw_encoded := '083139373130393137'O; 
+
+  if (enc_OER_Date(date) == raw_encoded) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Date(raw_encoded) == date) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_encoding_of_EmployeeNumber() runs on Test_CT {
+  const EmployeeNumber empl_num :=  51
+  if (enc_OER_EmployeeNumber(empl_num) == '0133'O) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_encoding_of_Name() runs on Test_CT {
+  const Name name :=  {
+	givenName := "John",
+	initial := "P",
+	familyName := "Smith"
+  }
+  const octetstring raw_encoded := '044A6F686E015005536D697468'O; 
+
+  if (enc_OER_Name(name) == raw_encoded) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Name(raw_encoded) == name) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_ChildInformation() runs on Test_CT {
+  const ChildInformation child := {
+	name := {
+		givenName := "Ralph",
+		initial := "T",
+		familyName := "Smith"
+	},
+	dateOfBirth := "19571111"
+  }
+  const octetstring raw_encoded := '0552616C7068015405536D697468083139353731313131'O;
+
+  if (enc_OER_ChildInformation(child) == raw_encoded) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_ChildInformation(raw_encoded) == child) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Record() runs on Test_CT {
+  const octetstring raw_encoded := 
+	'80044A6F686E015005536D6974680133084469726563746F72083139373130393137044D617279015405536D69746801020552616C7068015405536D69746808313935373131313105537573616E0142054A6F6E6573083139353930373137'O;
+  const Record rec := {
+	name := {
+		givenName := "John",
+		initial := "P",
+		familyName := "Smith"},
+	title := "Director",
+	number := 51,
+	dateOfHire := "19710917",
+	nameOfSpouse := {
+		givenName := "Mary",
+		initial := "T",
+		familyName := "Smith"},
+	children := {
+		{ name := {
+			givenName := "Ralph",
+			initial := "T",
+			familyName := "Smith"},
+		dateOfBirth := "19571111" },
+		{ name := {
+			givenName := "Susan",
+			initial := "B",
+			familyName := "Jones"},
+		dateOfBirth := "19590717"}
+	}
+  }
+
+  if (enc_OER_Record(rec) == raw_encoded) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Record(raw_encoded) == rec) {setverdict(pass);} else {setverdict(fail);}
+}
+
+//*********************************************
+// CONTROL PART
+//*********************************************
+
+control {
+  execute(tc_OER_encoding_of_Date());
+  execute(tc_OER_encoding_of_EmployeeNumber());
+  execute(tc_OER_encoding_of_Name());
+  execute(tc_OER_ChildInformation());
+  execute(tc_OER_Record());
+}
+
+
+}
diff --git a/function_test/OER_EncDec/ITSPKI.asn b/function_test/OER_EncDec/ITSPKI.asn
new file mode 100755
index 000000000..8cc693527
--- /dev/null
+++ b/function_test/OER_EncDec/ITSPKI.asn
@@ -0,0 +1,152 @@
+ITSPKI DEFINITIONS ::=
+
+BEGIN
+
+  IMPORTS;
+
+  Null ::= NULL
+
+  Bool ::= BOOLEAN
+
+  Uint   ::= INTEGER (0..MAX)
+  Uint8  ::= INTEGER (0..255)
+  Uint16 ::= INTEGER (0..65535) 
+  Uint32 ::= INTEGER (0..4294967295)
+  Uint64 ::= INTEGER (0..18446744073709551615)
+
+  Int    ::= INTEGER
+  Sint8  ::= INTEGER (-128..127)
+  Sint16 ::= INTEGER (-32768..32767)
+  Sint32 ::= INTEGER (-2147483648..2147483647)
+  Sint64 ::= INTEGER (-9223372036854775808..9223372036854775807)
+
+  Enum ::= ENUMERATED {zero(0), one(1), two(2)}
+  EnumM ::= ENUMERATED {zero(0), one(1), two(2), numM(18)}
+  EnumP ::= ENUMERATED {zero(0), one(1), two(2), numP(1234)}
+  EnumB ::= ENUMERATED {zero(0), one(1), two(2), numB(65261)}
+  EnumNM ::= ENUMERATED {zero(0), one(1), two(2), numNM(-275)}
+  EnumNB ::= ENUMERATED {zero(0), one(1), two(2), numNB(-64302)}
+
+  BitStr ::= BIT STRING
+  BitStrEmpty ::= BIT STRING (SIZE(0))
+  BitStrRandom ::= BIT STRING (SIZE(54))
+  BitStrAligned ::= BIT STRING (SIZE(48))
+
+  OctetStr ::= OCTET STRING
+  OctetStrEmpty ::= OCTET STRING (SIZE(0))
+  OctetStrRandom ::= OCTET STRING (SIZE(6))
+
+  SequenceEmpty ::= SEQUENCE {}
+  SequenceEmptyExtendable ::= SEQUENCE {
+    ... 
+  }
+  SequenceSimple ::= SEQUENCE {
+    f1 OCTET STRING (SIZE (2)),
+    f2 OCTET STRING (SIZE (2)),
+    f3 OCTET STRING (SIZE (2))
+  }
+  SequenceSimpleExtendable ::= SEQUENCE {
+    f1 OCTET STRING (SIZE (2)),
+    f2 OCTET STRING (SIZE (2)),
+    f3 OCTET STRING (SIZE (2)),
+    ...
+  }
+  SequenceSimpleExtended ::= SEQUENCE {
+    f1 OCTET STRING (SIZE (2)),
+    f2 OCTET STRING (SIZE (2)),
+    f3 OCTET STRING (SIZE (2)),
+    ...,
+    e1 OCTET STRING (SIZE (2)),
+    e2 OCTET STRING (SIZE (2)),
+    e3 OCTET STRING (SIZE (2))
+
+  }
+  SequenceSomeOptional ::= SEQUENCE {
+    f1 OCTET STRING (SIZE (2)),
+    f2 [2] OCTET STRING (SIZE (2)) OPTIONAL,
+    f3 [3] OCTET STRING (SIZE (2)) OPTIONAL
+  }
+  SequenceAllOptional ::= SEQUENCE {
+    f1 OCTET STRING (SIZE (2)) OPTIONAL,
+    f2 [2] OCTET STRING (SIZE (2)) OPTIONAL,
+    f3 [3] OCTET STRING (SIZE (2)) OPTIONAL
+  }
+  SequenceOptionalExtendable ::= SEQUENCE {
+    f1 OCTET STRING (SIZE (2)) OPTIONAL,
+    f2 [2] OCTET STRING (SIZE (2)),
+    f3 [3] OCTET STRING (SIZE (2)) OPTIONAL,
+    ...
+  }
+  SequenceLongOptionalExtendable ::= SEQUENCE {
+    f1 OCTET STRING (SIZE (2)) OPTIONAL,
+    f2 [2] OCTET STRING (SIZE (2)) OPTIONAL,
+    f3 [3] OCTET STRING (SIZE (2)) OPTIONAL,
+    f4 [4] OCTET STRING (SIZE (2)) OPTIONAL,
+    f5 [5] OCTET STRING (SIZE (2)) OPTIONAL,
+    f6 [6] OCTET STRING (SIZE (2)) OPTIONAL,
+    f7 [7] OCTET STRING (SIZE (2)) OPTIONAL,
+    f8 [8] OCTET STRING (SIZE (2)) OPTIONAL,
+    f9 [9] OCTET STRING (SIZE (2)) OPTIONAL,
+    f10 [10] OCTET STRING (SIZE (2)) OPTIONAL,
+    ...
+  }
+  SequenceOptionalExtended ::= SEQUENCE {
+    f1 OCTET STRING (SIZE (2)) OPTIONAL,
+    f2 [2] OCTET STRING (SIZE (2)),
+    f3 [3] OCTET STRING (SIZE (2)) OPTIONAL,
+    ...,
+    e1 [4] OCTET STRING (SIZE (2)) OPTIONAL,
+    e2 [5] OCTET STRING (SIZE (2)),
+    e3 [6] OCTET STRING (SIZE (2)) OPTIONAL
+  }
+  SequenceLongOptionalExtended ::= SEQUENCE {
+    f1 OCTET STRING (SIZE (2)) OPTIONAL,
+    f2 [2] OCTET STRING (SIZE (2)),
+    f3 [3] OCTET STRING (SIZE (2)) OPTIONAL,
+    ...,
+    e1 [4] OCTET STRING (SIZE (2)) OPTIONAL,
+    e2 [5] OCTET STRING (SIZE (2)),
+    e3 [6] OCTET STRING (SIZE (2)) OPTIONAL,
+    e4 [7] OCTET STRING (SIZE (2)) OPTIONAL,
+    e5 [8] OCTET STRING (SIZE (2)),
+    e6 [9] OCTET STRING (SIZE (2)) OPTIONAL,
+    e7 [10] OCTET STRING (SIZE (2)) OPTIONAL,
+    e8 [11] OCTET STRING (SIZE (2)),
+    e9 [12] OCTET STRING (SIZE (2)) OPTIONAL
+  }
+  SequenceUnknownExtended ::= SEQUENCE {
+    f1 OCTET STRING (SIZE (2)) OPTIONAL,
+    f2 [2] OCTET STRING (SIZE (2)),
+    f3 [3] OCTET STRING (SIZE (2)) OPTIONAL,
+    ...,
+    e1 [4] OCTET STRING (SIZE (2)) OPTIONAL,
+    e2 [5] OCTET STRING (SIZE (2)),
+    e3 [6] OCTET STRING (SIZE (2)) OPTIONAL,
+    e4 [7] OCTET STRING (SIZE (2)) OPTIONAL
+  }
+
+  SequenceOfOctetString ::= SEQUENCE OF OCTET STRING (SIZE (2))
+
+  Choice ::= CHOICE {
+    f [0] OCTET STRING (SIZE (2)),
+    s [1] NULL
+  }
+  ChoiceBis ::= CHOICE {
+    f [42] OCTET STRING (SIZE (2)),
+    s [99] NULL
+  }
+  ChoiceTer ::= CHOICE {
+    f [123456] OCTET STRING (SIZE (2)),
+    s [999999] NULL
+  }
+  ChoiceQuatro ::= CHOICE {
+    f [0] NULL,
+    ...,
+    s [42] OCTET STRING (SIZE (2)),
+    t [99] NULL
+  }
+
+  Utf8 ::= UTF8String
+
+END
+
diff --git a/function_test/OER_EncDec/ITSPKI_Testcases.ttcn b/function_test/OER_EncDec/ITSPKI_Testcases.ttcn
new file mode 100755
index 000000000..1411c5408
--- /dev/null
+++ b/function_test/OER_EncDec/ITSPKI_Testcases.ttcn
@@ -0,0 +1,578 @@
+/******************************************************************************
+ * Copyright (c) 2000-2019 Ericsson Telecom AB
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
+ *
+ * Contributors:
+ *   Balasko, Jeno
+ *   Beres, Szabolcs
+ *   Delic, Adam
+ *   Kovacs, Ferenc
+ *   Szabados, Kristof
+ *   Tarasov, Victor
+ *
+ ******************************************************************************/
+//This module contains unified test cases related to TTCN3 Executor's OER coder function.
+//
+//The target of these test cases are the basic data types from specification
+//'ISO/IEC 8825-7:2015 -- Information technology – ASN.1 encoding rules:
+//Specification of Octet Encoding Rules'
+//
+//The target data types are used in the following technical specification:
+// 'ETSI TS 103 097 V1.3.1 (2017-10)'
+//Intelligent Transport Systems (ITS); Security;
+//Security header and certificate formats and certificate formats 
+//
+// 'IEEE Std 1609.2-2016 IEEE Standard'
+//Wireless Access in Vehicular Environments—Security Services for
+//Applications and Management Messages
+module ITSPKI_Testcases {
+
+import from ITSPKI all;
+type component Test_CT {}
+
+external function enc_OER_Null(in Null pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Null(in octetstring stream) return Null with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_Bool(in Bool pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Bool(in octetstring stream) return Bool with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_Uint(in Uint pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Uint(in octetstring stream) return Uint with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_Uint8(in Uint8 pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Uint8(in octetstring stream) return Uint8 with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_Uint16(in Uint16 pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Uint16(in octetstring stream) return Uint16 with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_Uint32(in Uint32 pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Uint32(in octetstring stream) return Uint32 with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_Uint64(in Uint64 pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Uint64(in octetstring stream) return Uint64 with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_Int(in Int pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Int(in octetstring stream) return Int with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_Sint8(in Sint8 pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Sint8(in octetstring stream) return Sint8 with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_Sint16(in Sint16 pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Sint16(in octetstring stream) return Sint16 with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_Sint32(in Sint32 pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Sint32(in octetstring stream) return Sint32 with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_Sint64(in Sint64 pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Sint64(in octetstring stream) return Sint64 with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_Enum(in Enum pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Enum(in octetstring stream) return Enum with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_EnumM(in EnumM pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_EnumM(in octetstring stream) return EnumM with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_EnumP(in EnumP pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_EnumP(in octetstring stream) return EnumP with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_EnumB(in EnumB pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_EnumB(in octetstring stream) return EnumB with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_EnumNM(in EnumNM pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_EnumNM(in octetstring stream) return EnumNM with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_EnumNB(in EnumNB pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_EnumNB(in octetstring stream) return EnumNB with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_BitStr(in BitStr pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_BitStr(in octetstring pdu) return BitStr with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_BitStrEmpty(in BitStrEmpty pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_BitStrEmpty(in octetstring pdu) return BitStrEmpty with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_BitStrRandom(in BitStrRandom pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_BitStrRandom(in octetstring pdu) return BitStrRandom with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_BitStrAligned(in BitStrAligned pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_BitStrAligned(in octetstring pdu) return BitStrAligned with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_OctetStr(in OctetStr pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_OctetStr(in octetstring pdu) return OctetStr with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_OctetStrEmpty(in OctetStrEmpty pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_OctetStrEmpty(in octetstring pdu) return OctetStrEmpty with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_OctetStrRandom(in OctetStrRandom pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_OctetStrRandom(in octetstring pdu) return OctetStrRandom with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_SequenceEmpty(in SequenceEmpty pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceEmpty(in octetstring stream) return SequenceEmpty with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_SequenceEmptyExtendable(in SequenceEmptyExtendable pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceEmptyExtendable(in octetstring stream) return SequenceEmptyExtendable with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_SequenceSimple(in SequenceSimple pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceSimple(in octetstring stream) return SequenceSimple with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_SequenceSimpleExtendable(in SequenceSimpleExtendable pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceSimpleExtendable(in octetstring stream) return SequenceSimpleExtendable with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_SequenceSimpleExtended(in SequenceSimpleExtended pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceSimpleExtended(in octetstring stream) return SequenceSimpleExtended with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_SequenceSomeOptional(in SequenceSomeOptional pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceSomeOptional(in octetstring stream) return SequenceSomeOptional with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_SequenceAllOptional(in SequenceAllOptional pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceAllOptional(in octetstring stream) return SequenceAllOptional with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_SequenceOptionalExtendable(in SequenceOptionalExtendable pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceOptionalExtendable(in octetstring stream) return SequenceOptionalExtendable with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_SequenceLongOptionalExtendable(in SequenceLongOptionalExtendable pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceLongOptionalExtendable(in octetstring stream) return SequenceLongOptionalExtendable with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_SequenceOptionalExtended(in SequenceOptionalExtended pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceOptionalExtended(in octetstring stream) return SequenceOptionalExtended with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_SequenceLongOptionalExtended(in SequenceLongOptionalExtended pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceLongOptionalExtended(in octetstring stream) return SequenceLongOptionalExtended with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_SequenceOfOctetString(in SequenceOfOctetString pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceOfOctetString(in octetstring stream) return SequenceOfOctetString with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_Choice(in Choice pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Choice(in octetstring stream) return Choice with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_ChoiceBis(in ChoiceBis pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_ChoiceBis(in octetstring stream) return ChoiceBis with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_ChoiceTer(in ChoiceTer pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_ChoiceTer(in octetstring stream) return ChoiceTer with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_ChoiceQuatro(in ChoiceQuatro pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_ChoiceQuatro(in octetstring stream) return ChoiceQuatro with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_Utf8(in Utf8 pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Utf8(in octetstring stream) return Utf8 with { extension "prototype(convert) decode(OER)" }
+
+//*********************************************
+// TESTCASES
+//*********************************************
+
+testcase tc_OER_Null() runs on Test_CT {
+  const Null nn := NULL
+  
+  if (enc_OER_Null(nn) == ''O) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Null(''O) == nn) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Bool() runs on Test_CT {
+  const Bool b1 := true
+  const Bool b2 := false  
+
+  if (enc_OER_Bool(b1) == 'FF'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Bool(b2) == '00'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Bool('FF'O) == b1){setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Bool('42'O) == b1){setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Bool('00'O) == b2){setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Uint() runs on Test_CT {
+  const Uint u0 := 0
+  const Uint u1 := 1
+  const Uint u254 := 254
+  const Uint uR := 8234104123542484900769178205574010627627573691361805720124810878238590820080
+  const octetstring oR := '20123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0'O
+  const Uint uB := 115307965754428812535861235258289182183752994114051557942764040435498874699501
+  const octetstring oB := '20FEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED'O
+  const octetstring oBB := '280000000000000000FEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED'O
+
+  if (enc_OER_Uint(u0) == '0100'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint(u1) == '0101'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint(u254) == '01FE'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint(uR) == oR) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint(uB) == oB) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Uint('0100'O) == u0) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint('0101'O) == u1) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint('01FE'O) == u254) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint(oR) == uR) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint(oB) == uB) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint(oBB) == uB) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Uint8() runs on Test_CT {
+  const Uint8 u0 := 0
+  const Uint8 u1 := 1  
+  const Uint8 u18 := 18 
+  const Uint8 u254 := 254 
+
+  if (enc_OER_Uint8(u0) == '00'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint8(u1) == '01'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint8(u18) == '12'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint8(u254) == 'FE'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Uint8('00'O) == u0) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint8('01'O) == u1) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint8('12'O) == u18) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint8('FE'O) == u254) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Uint16() runs on Test_CT {
+  const Uint16 u0 := 0
+  const Uint16 u1 := 1
+  const Uint16 u4660 := 4660  
+  const Uint16 u65261 := 65261 
+
+  if (enc_OER_Uint16(u0) == '0000'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint16(u1) == '0001'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint16(u4660) == '1234'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint16(u65261) == 'FEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Uint16('0000'O) == u0) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint16('0001'O) == u1) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint16('1234'O) == u4660) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint16('FEED'O) == u65261) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Uint32() runs on Test_CT {
+  const Uint32 u0 := 0
+  const Uint32 u1 := 1
+  const Uint32 uR := 305419896
+  const Uint32 uB := 4277010157
+
+  if (enc_OER_Uint32(u0) == '00000000'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint32(u1) == '00000001'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint32(uR) == '12345678'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint32(uB) == 'FEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Uint32('00000000'O) == u0) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint32('00000001'O) == u1) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint32('12345678'O) == uR) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint32('FEEDFEED'O) == uB) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Uint64() runs on Test_CT {
+  const Uint64 u0 := 0
+  const Uint64 u1 := 1
+  const Uint64 uR := 1311768467463790320
+  const Uint64 uB := 18369618753251835629
+
+  if (enc_OER_Uint64(u0) == '0000000000000000'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint64(u1) == '0000000000000001'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint64(uR) == '123456789ABCDEF0'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint64(uB) == 'FEEDFEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Uint64('0000000000000000'O) == u0) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint64('0000000000000001'O) == u1) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint64('123456789ABCDEF0'O) == uR) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint64('FEEDFEEDFEEDFEED'O) == uB) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Int() runs on Test_CT {
+  const Int i0 := 0
+  const Int i1 := 1
+  const Int i254 := 254
+  const Int iR := 8234104123542484900769178205574010627627573691361805720124810878238590820080
+  const octetstring oR := '20123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0'O
+  const Int iB := 115307965754428812535861235258289182183752994114051557942764040435498874699501
+  const octetstring oB := '2100FEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED'O
+  const octetstring oBB := '280000000000000000FEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED'O
+  const Int iBn := -484123482887382887709749750398725669516990551589006096693543572414254940435
+  const octetstring oBn := '20FEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED'O
+  const Int iBBn := -107557985113773710522801806803113897225642410974278758319332773129674538819856
+  const octetstring oBBn := '21FF123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0'O
+  const octetstring oBBnn := '28FFFFFFFFFFFFFFFF123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0'O
+
+  if (enc_OER_Int(i0) == '0100'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Int(i1) == '0101'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Int(i254) == '0200FE'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Int(iR) == oR) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Int(iB) == oB) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Int(iBn) == oBn) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Int(iBBn) == oBBn) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Int('0100'O) == i0) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Int('0101'O) == i1) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Int('0200FE'O) == i254) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Int(oR) == iR) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Int(oB) == iB) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Int(oBB) == iB) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Int(oBBn) == iBBn) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Int(oBBnn) == iBBn) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Sint8() runs on Test_CT {
+  const Sint8 s0 := 0
+  const Sint8 s18 := 18
+  const Sint8 sn2 := -2  
+
+  if (enc_OER_Sint8(s0) == '00'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Sint8(s18) == '12'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Sint8(sn2) == 'FE'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Sint8('00'O) == s0) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Sint8('12'O) == s18) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Sint8('FE'O) == sn2) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Sint16() runs on Test_CT {
+  const Sint16 s0 := 0
+  const Sint16 s4660 := 4660
+  const Sint16 sn275 := -275  
+
+  if (enc_OER_Sint16(s0) == '0000'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Sint16(s4660) == '1234'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Sint16(sn275) == 'FEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Sint16('0000'O) == s0) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Sint16('1234'O) == s4660) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Sint16('FEED'O) == sn275) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Sint32() runs on Test_CT {
+  const Sint32 s0 := 0
+  const Sint32 sB := 305419896
+  const Sint32 sN := -17957139
+
+  if (enc_OER_Sint32(s0) == '00000000'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Sint32(sB) == '12345678'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Sint32(sN) == 'FEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Sint32('00000000'O) == s0) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Sint32('12345678'O) == sB) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Sint32('FEEDFEED'O) == sN) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Sint64() runs on Test_CT {
+  const Sint64 s0 := 0
+  const Sint64 sB := 1311768467463790320
+  const Sint64 sN := -77125320457715987
+
+  if (enc_OER_Sint64(s0) == '0000000000000000'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Sint64(sB) == '123456789ABCDEF0'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Sint64(sN) == 'FEEDFEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Sint64('0000000000000000'O) == s0) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Sint64('123456789ABCDEF0'O) == sB) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Sint64('FEEDFEEDFEEDFEED'O) == sN) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Enum() runs on Test_CT {
+  const Enum enum_zero := zero
+  const EnumM enumm_numM := numM
+  const EnumP enumm_numP := numP
+  const EnumB enumm_numB := numB
+  const EnumNM enumm_numNM := numNM
+  const EnumNB enumm_numNB := numNB
+
+  if (enc_OER_Enum(enum_zero) == '00'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_EnumM(enumm_numM) == '12'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_EnumP(enumm_numP) == '8204D2'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_EnumB(enumm_numB) == '8300FEED'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_EnumNM(enumm_numNM) == '82FEED'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_EnumNB(enumm_numNB) == '83FF04D2'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Enum('00'O) == enum_zero) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_EnumM('12'O) == enumm_numM) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_EnumP('8204D2'O) == enumm_numP) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_EnumB('8300FEED'O) == enumm_numB) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_EnumB('840000FEED'O) == enumm_numB) {setverdict(pass);} else {setverdict(fail);}
+  // if (dec_OER_EnumB('85000000FEED'O) == enumm_numB) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_EnumNM('82FEED'O) == enumm_numNM) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_EnumNB('83FF04D2'O) == enumm_numNB) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_EnumNB('84FFFF04D2'O) == enumm_numNB) {setverdict(pass);} else {setverdict(fail);}
+  // if (dec_OER_EnumNB('85FFFFFF04D2'O) == enumm_numNB) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_BitStr() runs on Test_CT {
+  const BitStrEmpty empty := ''B
+  const BitStrRandom random :=   '111111101110110111111110111011011111111011101101111110'B
+  const BitStrAligned aligned := '111111101110110111111110111011011111111011101101'B
+
+  if (enc_OER_BitStrEmpty(empty) == ''O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_BitStrRandom(random) == 'FEEDFEEDFEEDF8'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_BitStrAligned(aligned) == 'FEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (enc_OER_BitStr(empty) == '0100'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_BitStr(random) == '0802FEEDFEEDFEEDF8'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_BitStr(aligned) == '0700FEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_BitStrEmpty(''O) == empty) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_BitStrRandom('FEEDFEEDFEEDF8'O) == random) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_BitStrAligned('FEEDFEEDFEED'O) == aligned) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_BitStr('0100'O) == empty) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_BitStr('0802FEEDFEEDFEEDF8'O) == random) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_BitStr('0700FEEDFEEDFEED'O) == aligned) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_OctetStr() runs on Test_CT {
+  const OctetStrEmpty empty := ''O
+  const OctetStrRandom random :=   'FEEDFEEDFEED'O
+
+  if (enc_OER_OctetStrEmpty(empty) == ''O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_OctetStrRandom(random) == 'FEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (enc_OER_OctetStr(empty) == '00'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_OctetStr(random) == '06FEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+  
+  if (dec_OER_OctetStrEmpty(''O) == empty) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_OctetStrRandom('FEEDFEEDFEED'O) == random) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_OctetStr('00'O) == empty) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_OctetStr('06FEEDFEEDFEED'O) == random) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_SequenceEmpty() runs on Test_CT {
+  const SequenceEmpty empty := {}
+  const SequenceEmptyExtendable empty_extendable := {}
+
+  if (enc_OER_SequenceEmpty(empty) == ''O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceEmptyExtendable(empty_extendable) == '00'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_SequenceEmpty(''O) == empty) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_SequenceSimple() runs on Test_CT {
+  const SequenceSimple s := {f1 := 'AAAA'O,f2 := 'BBBB'O,f3 := 'CCCC'O}
+  const SequenceSimpleExtendable s_ee := {f1:='AAAA'O,f2:='BBBB'O,f3:='CCCC'O}
+  const SequenceSimpleExtended s_ed := {f1:='AAAA'O,f2:='BBBB'O,f3:='CCCC'O,e1:='9999'O,e2:='8888'O,e3:='7777'O}
+  const SequenceSimpleExtended s_ed100 := {f1:='AAAA'O,f2:='BBBB'O,f3:='CCCC'O,e1:='9999'O}
+  const SequenceSimpleExtended s_ed010 := {f1:='AAAA'O,f2:='BBBB'O,f3:='CCCC'O,e2:='8888'O}
+
+  if (enc_OER_SequenceSimple(s) == 'AAAABBBBCCCC'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceSimpleExtendable(s_ee) == '00AAAABBBBCCCC'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceSimpleExtended(s_ed) == '80AAAABBBBCCCC0205E0029999028888027777'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceSimpleExtended(s_ed100) == '80AAAABBBBCCCC020580029999'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceSimpleExtended(s_ed010) == '80AAAABBBBCCCC020540028888'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_SequenceSimple('AAAABBBBCCCC'O) == s) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_SequenceSimpleExtendable('00AAAABBBBCCCC'O) == s_ee) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_SequenceSimpleExtended('80AAAABBBBCCCC0205E0029999028888027777'O) == s_ed) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_SequenceSimpleExtended('80AAAABBBBCCCC020540028888'O).e2 == '8888'O) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_SequenceSomeOptional() runs on Test_CT {
+  const SequenceSomeOptional seqSO111 := {f1 := 'AAAA'O,f2 := 'BBBB'O,f3 := 'CCCC'O}
+  const SequenceSomeOptional seqSO110 := {f1 := 'AAAA'O,f2 := 'BBBB'O,f3 := omit}
+  const SequenceSomeOptional seqSO101 := {f1 := 'AAAA'O,f2 := omit,   f3 := 'CCCC'O}
+  const SequenceSomeOptional seqSO100 := {f1 := 'AAAA'O,f2 := omit,   f3 := omit}
+
+  if (enc_OER_SequenceSomeOptional(seqSO111) == 'C0AAAABBBBCCCC'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceSomeOptional(seqSO110) == '80AAAABBBB'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceSomeOptional(seqSO101) == '40AAAACCCC'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceSomeOptional(seqSO100) == '00AAAA'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_SequenceSomeOptional('C0AAAABBBBCCCC'O) == seqSO111) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_SequenceSomeOptional('80AAAABBBB'O)     == seqSO110) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_SequenceSomeOptional('00AAAA'O)         == seqSO100) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_SequenceAllOptional() runs on Test_CT {
+  const SequenceAllOptional seqSAO000 := {f1:=omit,f2:=omit,f3:=omit}
+  
+  if (enc_OER_SequenceAllOptional(seqSAO000) == '00'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_SequenceAllOptional('00'O) == seqSAO000) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_SequenceOptionalExtendable() runs on Test_CT {
+  const SequenceOptionalExtendable seqSOE110 := {f1:='FEED'O,f2:='FEED'O,f3:=omit}
+  const SequenceOptionalExtendable seqSOE011 := {f1:=omit,f2:='FEED'O,f3:='FEED'O}
+  
+  if (enc_OER_SequenceOptionalExtendable(seqSOE110) == '40FEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceOptionalExtendable(seqSOE011) == '20FEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_SequenceOptionalExtendable('40FEEDFEED'O) == seqSOE110) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_SequenceOptionalExtendable('20FEEDFEED'O) == seqSOE011) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_SequenceLongOptionalExtendable() runs on Test_CT {
+  const SequenceLongOptionalExtendable seq01 := {
+    f1:='FEED'O,f2:='FEED'O,f3:='FEED'O,f4:='FEED'O,f5:='FEED'O,f6:='FEED'O,f7:='FEED'O,f8:='FEED'O,f9:='FEED'O,f10:='FEED'O
+  }
+  const SequenceLongOptionalExtendable seq02 := {
+    f1:='FEED'O,f2:=omit,f3:='FEED'O,f4:=omit,f5:='FEED'O,f6:=omit,f7:='FEED'O,f8:=omit,f9:='FEED'O,f10:=omit
+  }
+  
+  if (enc_OER_SequenceLongOptionalExtendable(seq01) == '7FE0FEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceLongOptionalExtendable(seq02) == '5540FEEDFEEDFEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_SequenceLongOptionalExtendable('7FE0FEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED'O) == seq01) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_SequenceLongOptionalExtendable('5540FEEDFEEDFEEDFEEDFEED'O) == seq02) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_SequenceOptionalExtended() runs on Test_CT {
+  const SequenceOptionalExtended seq01_enc := {f1:='FEED'O,f2:='FEED'O,e1:='FEED'O,e2:='FEED'O}
+  const SequenceOptionalExtended seq01_dec := {f1:='FEED'O,f2:='FEED'O,f3:=omit,e1:='FEED'O,e2:='FEED'O,e3:=omit}
+  const SequenceOptionalExtended seq02_enc := {f2:='FEED'O,f3:='FEED'O,e2:='FEED'O,e3:='FEED'O}
+  const SequenceOptionalExtended seq02_dec := {f1:=omit,f2:='FEED'O,f3:='FEED'O,e1:=omit,e2:='FEED'O,e3:='FEED'O}
+  
+  if (enc_OER_SequenceOptionalExtended(seq01_enc) == 'C0FEEDFEED0205C002FEED02FEED'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceOptionalExtended(seq02_enc) == 'A0FEEDFEED02056002FEED02FEED'O) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_SequenceOptionalExtended('C0FEEDFEED0205C002FEED02FEED'O) == seq01_dec) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_SequenceOptionalExtended('A0FEEDFEED02056002FEED02FEED'O) == seq02_dec) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_SequenceLongOptionalExtended() runs on Test_CT {
+  const SequenceLongOptionalExtended seq01_enc := {
+    f1:='FEED'O,f2:='FEED'O,e1:='FEED'O,e2:='FEED'O,e4:='FEED'O,e5:='FEED'O,e7:='FEED'O,e8:='FEED'O
+  }
+  const SequenceLongOptionalExtended seq01_dec := {
+    f1:='FEED'O,f2:='FEED'O,f3:=omit,e1:='FEED'O,e2:='FEED'O,e3:=omit,e4:='FEED'O,e5:='FEED'O,e6:=omit,e7:='FEED'O,e8:='FEED'O,e9:=omit
+  }
+  
+  if (enc_OER_SequenceLongOptionalExtended(seq01_enc) == 'C0FEEDFEED0307DB0002FEED02FEED02FEED02FEED02FEED02FEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_SequenceLongOptionalExtended('C0FEEDFEED0307DB0002FEED02FEED02FEED02FEED02FEED02FEED'O) == seq01_dec) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_SequenceOfOctetString() runs on Test_CT {
+  const SequenceOfOctetString seqOfEmpty := {}
+  const SequenceOfOctetString seqOf := {'FEED'O,'FEED'O,'FEED'O,'FEED'O,'FEED'O,'FEED'O}
+
+  if (enc_OER_SequenceOfOctetString(seqOfEmpty) == '0100'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceOfOctetString(seqOf) == '0106FEEDFEEDFEEDFEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_SequenceOfOctetString('0100'O) == seqOfEmpty) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_SequenceOfOctetString('0106FEEDFEEDFEEDFEEDFEEDFEED'O) == seqOf) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_SequenceOfOctetString('03000006FEEDFEEDFEEDFEEDFEEDFEED'O) == seqOf) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Choice() runs on Test_CT {
+  const Choice choice := {f:='FEED'O}
+  const ChoiceBis choice_bis := {f:='FEED'O}
+  const ChoiceTer choice_ter := {f:='FEED'O}
+  const ChoiceQuatro choice_quatro := {s:='FEED'O}
+
+  if (enc_OER_Choice(choice) == '80FEED'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_ChoiceBis(choice_bis) == 'AAFEED'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_ChoiceTer(choice_ter) == 'BF87C440FEED'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_ChoiceQuatro(choice_quatro) == 'AA02FEED'O) {setverdict(pass);} else {setverdict(fail);}
+  
+  if (dec_OER_Choice('80FEED'O) == choice) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_ChoiceBis('AAFEED'O) == choice_bis) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_ChoiceTer('BF87C440FEED'O) == choice_ter) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_ChoiceQuatro('AA02FEED'O) == choice_quatro) {setverdict(pass);} else {setverdict(fail);}
+
+}
+
+testcase tc_OER_Utf8() runs on Test_CT {
+  const Utf8 str_empty := "" 
+  const Utf8 str := "May the force be with you." 
+  
+  if (enc_OER_Utf8(str_empty) == '00'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Utf8(str) == '1A4D61792074686520666F726365206265207769746820796F752E'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Utf8('00'O) == str_empty) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Utf8('1A4D61792074686520666F726365206265207769746820796F752E'O) == str) {setverdict(pass);} else {setverdict(fail);}
+}
+
+//*********************************************
+// CONTROL PART
+//*********************************************
+
+control {
+  execute(tc_OER_Null());
+  execute(tc_OER_Bool());
+  execute(tc_OER_Uint());
+  execute(tc_OER_Uint8());
+  execute(tc_OER_Uint16());
+  execute(tc_OER_Uint32());
+  execute(tc_OER_Uint64());
+  execute(tc_OER_Int());
+  execute(tc_OER_Sint8());
+  execute(tc_OER_Sint16());
+  execute(tc_OER_Sint32());
+  execute(tc_OER_Sint64());
+  execute(tc_OER_Enum());
+  execute(tc_OER_BitStr());
+  execute(tc_OER_OctetStr());
+  execute(tc_OER_SequenceEmpty());
+  execute(tc_OER_SequenceSimple());
+  execute(tc_OER_SequenceSomeOptional());
+  execute(tc_OER_SequenceAllOptional());
+  execute(tc_OER_SequenceOptionalExtendable());
+  execute(tc_OER_SequenceLongOptionalExtendable());
+  execute(tc_OER_SequenceOptionalExtended());
+  execute(tc_OER_SequenceLongOptionalExtended());
+  execute(tc_OER_SequenceOfOctetString());
+  execute(tc_OER_Choice());
+  execute(tc_OER_Utf8());
+}
+
+}
diff --git a/function_test/OER_EncDec/Makefile b/function_test/OER_EncDec/Makefile
index d83f6bee6..feadfe0af 100644
--- a/function_test/OER_EncDec/Makefile
+++ b/function_test/OER_EncDec/Makefile
@@ -95,25 +95,24 @@ ARCHIVE_DIR = ./backup
 #
 
 # The TTCN-3 modules needed for this project:
-TTCN3_MODULES = Temp.ttcn
+TTCN3_MODULES = ISOIEC8825_Testcases.ttcn ETSI_TS_103_097_v131_Testcases.ttcn ITSPKI_Testcases.ttcn
 
 # The ASN.1 modules needed for this project:
-ASN1_MODULES = TempA.asn IEEE1609dot2BaseTypes.asn IEEE1609dot2.asn EtsiTs103097Module.asn
+ASN1_MODULES = ISOIEC8825.asn ETSITS103097v131.asn ITSPKI.asn IEEE1609dot2BaseTypes.asn IEEE1609dot2.asn EtsiTs103097Module.asn
 
 # C++ source & header files generated by TTCN-3 & ASN.1 compilers:
-GENERATED_SOURCES = Temp.cc $(ASN1_MODULES:.asn=.cc)
-GENERATED_HEADERS = Temp.hh $(ASN1_MODULES:.asn=.hh)
+GENERATED_SOURCES = $(TTCN3_MODULES:.ttcn=.cc) $(ASN1_MODULES:.asn=.cc)
+GENERATED_HEADERS = $(TTCN3_MODULES:.ttcn=.hh) $(ASN1_MODULES:.asn=.hh)
 
 # Source & header files of Test Ports and your other modules:
 USER_SOURCES =
 USER_HEADERS =
 
 # All object files needed for the executable test suite:
-# OBJECTS = Temp.o TempA.o IEEE1609dot2BaseTypes.o IEEE1609dot2.o
 OBJECTS = $(GENERATED_SOURCES:.cc=.o)
 
 # The name of the executable test suite:
-TARGET = Temp
+TARGET = OER_EncDec.exe
 
 ifeq ($(COVERAGE), yes)
 CPPFLAGS += -fprofile-arcs -ftest-coverage -g
@@ -150,6 +149,11 @@ compile: $(TTCN3_MODULES) $(ASN1_MODULES)
 	$(ASN1_MODULES) $(ASN1_STATIC_MODULES) - $?
 	touch $@
 
+run: $(TARGET) OER_EncDec.cfg
+	./$^ 2> result.txt
+	cat result.txt
+	grep "Overall verdict: pass" result.txt
+
 clean:
 	-$(RM) $(TARGET) $(OBJECTS) $(GENERATED_HEADERS) \
 	$(GENERATED_SOURCES) compile *.log *.gcda *.gcno
diff --git a/function_test/OER_EncDec/OER_EncDec.cfg b/function_test/OER_EncDec/OER_EncDec.cfg
new file mode 100755
index 000000000..c19cc0cfc
--- /dev/null
+++ b/function_test/OER_EncDec/OER_EncDec.cfg
@@ -0,0 +1,22 @@
+###############################################################################
+# Copyright (c) 2000-2019 Ericsson Telecom AB
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
+#
+# Contributors:
+#   Balasko, Jeno
+#   Hanko, Matyas
+#
+###############################################################################
+[MODULE_PARAMETERS]
+[LOGGING]
+LogSourceInfo := Yes
+Logfile := "OER_EncDec.log"
+FileMask := LOG_ALL
+ConsoleMask := WARNING | ERROR | TESTCASE | STATISTICS | DEBUG_ENCDEC
+[EXECUTE]
+ISOIEC8825_Testcases.control
+ETSI_TS_103_097_v131_Testcases.control
+ITSPKI_Testcases.control
\ No newline at end of file
diff --git a/function_test/README.txt b/function_test/README.txt
index 1a14130a5..a65716815 100644
--- a/function_test/README.txt
+++ b/function_test/README.txt
@@ -35,10 +35,12 @@ make clean
 
 4. Which scripts will be executed in the function test?
 
-function_test/Tools/SAtester for:
+Obsolete: function_test/Tools/SAtester for:
 BER_EncDec
 RAW_EncDec
 Text_EncDec
+OER_EncDec
+(These tests do not use any script anymore.)
 
 function_test/Tools/SAtester.pl for:
 Config_Parser
-- 
GitLab