From 1e609cfbdacab2b6732c248865ccdd20f5af9fdd Mon Sep 17 00:00:00 2001
From: Lev Walkin <vlm@lionet.info>
Date: Mon, 27 Sep 2004 20:50:48 +0000
Subject: [PATCH] ANY/OCTET STRING/BIT STRING testing, plus numerous test cases

---
 asn1c/tests/Makefile.am              |   9 +-
 asn1c/tests/Makefile.in              |  10 +-
 asn1c/tests/check-62.c               | 193 +++++++++++++++++++++++++++
 asn1c/tests/data-62/data-62-01.ber   |   1 +
 asn1c/tests/data-62/data-62-01.xbr   |   6 +
 asn1c/tests/data-62/data-62-02-B.ber |   2 +
 asn1c/tests/data-62/data-62-02-B.xbr |   6 +
 asn1c/tests/data-62/data-62-03-B.ber |   1 +
 asn1c/tests/data-62/data-62-03-B.xbr |   6 +
 asn1c/tests/data-62/data-62-04-B.ber |   1 +
 asn1c/tests/data-62/data-62-04-B.xbr |   6 +
 asn1c/tests/data-62/data-62-05-B.ber |   1 +
 asn1c/tests/data-62/data-62-05-B.xbr |   6 +
 asn1c/tests/data-62/data-62-06-B.ber |   1 +
 asn1c/tests/data-62/data-62-06-B.xbr |   6 +
 asn1c/tests/data-62/data-62-07-B.ber |   1 +
 asn1c/tests/data-62/data-62-07-B.xbr |   6 +
 asn1c/tests/data-62/data-62-08-L.ber | Bin 0 -> 15 bytes
 asn1c/tests/data-62/data-62-08-L.xbr |   7 +
 asn1c/tests/data-62/data-62-09-L.ber | Bin 0 -> 18 bytes
 asn1c/tests/data-62/data-62-09-L.xbr |   8 ++
 asn1c/tests/data-62/data-62-10.ber   | Bin 0 -> 9 bytes
 asn1c/tests/data-62/data-62-10.xbr   |   6 +
 asn1c/tests/data-62/data-62-11.ber   | Bin 0 -> 12 bytes
 asn1c/tests/data-62/data-62-11.xbr   |   8 ++
 asn1c/tests/data-62/data-62-12-B.ber |   1 +
 asn1c/tests/data-62/data-62-12-B.xbr |   6 +
 asn1c/tests/data-62/data-62-13-B.ber | Bin 0 -> 10 bytes
 asn1c/tests/data-62/data-62-13-B.xbr |   8 ++
 asn1c/tests/data-62/data-62-14.ber   | Bin 0 -> 16 bytes
 asn1c/tests/data-62/data-62-14.xbr   |  10 ++
 asn1c/tests/data-62/data-62-15-B.ber | Bin 0 -> 14 bytes
 asn1c/tests/data-62/data-62-15-B.xbr |  10 ++
 asn1c/tests/data-62/data-62-16.ber   | Bin 0 -> 14 bytes
 asn1c/tests/data-62/data-62-16.xbr   |   7 +
 asn1c/tests/data-62/data-62-17-B.ber | Bin 0 -> 15 bytes
 asn1c/tests/data-62/data-62-17-B.xbr |   7 +
 asn1c/tests/data-62/data-62-18-B.ber | Bin 0 -> 14 bytes
 asn1c/tests/data-62/data-62-18-B.xbr |   7 +
 asn1c/tests/data-62/data-62-19-B.ber | Bin 0 -> 14 bytes
 asn1c/tests/data-62/data-62-19-B.xbr |   7 +
 asn1c/tests/data-62/data-62-20.ber   | Bin 0 -> 11 bytes
 asn1c/tests/data-62/data-62-20.xbr   |   8 ++
 asn1c/tests/data-62/data-62-21-B.ber | Bin 0 -> 15 bytes
 asn1c/tests/data-62/data-62-21-B.xbr |  11 ++
 asn1c/tests/data-62/data-62-22.ber   | Bin 0 -> 15 bytes
 asn1c/tests/data-62/data-62-22.xbr   |  11 ++
 asn1c/tests/data-62/data-62-23-B.ber | Bin 0 -> 15 bytes
 asn1c/tests/data-62/data-62-23-B.xbr |  11 ++
 asn1c/tests/data-62/data-62-24-L.ber | Bin 0 -> 20 bytes
 asn1c/tests/data-62/data-62-24-L.xbr |  12 ++
 asn1c/tests/data-62/data-62-25.ber   | Bin 0 -> 16 bytes
 asn1c/tests/data-62/data-62-25.xbr   |  11 ++
 asn1c/tests/data-62/data-62-26-B.ber | Bin 0 -> 18 bytes
 asn1c/tests/data-62/data-62-26-B.xbr |  11 ++
 asn1c/tests/data-62/data-62-27.ber   | Bin 0 -> 4 bytes
 asn1c/tests/data-62/data-62-27.xbr   |   4 +
 57 files changed, 429 insertions(+), 4 deletions(-)
 create mode 100644 asn1c/tests/check-62.c
 create mode 100644 asn1c/tests/data-62/data-62-01.ber
 create mode 100644 asn1c/tests/data-62/data-62-01.xbr
 create mode 100644 asn1c/tests/data-62/data-62-02-B.ber
 create mode 100644 asn1c/tests/data-62/data-62-02-B.xbr
 create mode 100644 asn1c/tests/data-62/data-62-03-B.ber
 create mode 100644 asn1c/tests/data-62/data-62-03-B.xbr
 create mode 100644 asn1c/tests/data-62/data-62-04-B.ber
 create mode 100644 asn1c/tests/data-62/data-62-04-B.xbr
 create mode 100644 asn1c/tests/data-62/data-62-05-B.ber
 create mode 100644 asn1c/tests/data-62/data-62-05-B.xbr
 create mode 100644 asn1c/tests/data-62/data-62-06-B.ber
 create mode 100644 asn1c/tests/data-62/data-62-06-B.xbr
 create mode 100644 asn1c/tests/data-62/data-62-07-B.ber
 create mode 100644 asn1c/tests/data-62/data-62-07-B.xbr
 create mode 100644 asn1c/tests/data-62/data-62-08-L.ber
 create mode 100644 asn1c/tests/data-62/data-62-08-L.xbr
 create mode 100644 asn1c/tests/data-62/data-62-09-L.ber
 create mode 100644 asn1c/tests/data-62/data-62-09-L.xbr
 create mode 100644 asn1c/tests/data-62/data-62-10.ber
 create mode 100644 asn1c/tests/data-62/data-62-10.xbr
 create mode 100644 asn1c/tests/data-62/data-62-11.ber
 create mode 100644 asn1c/tests/data-62/data-62-11.xbr
 create mode 100644 asn1c/tests/data-62/data-62-12-B.ber
 create mode 100644 asn1c/tests/data-62/data-62-12-B.xbr
 create mode 100644 asn1c/tests/data-62/data-62-13-B.ber
 create mode 100644 asn1c/tests/data-62/data-62-13-B.xbr
 create mode 100644 asn1c/tests/data-62/data-62-14.ber
 create mode 100644 asn1c/tests/data-62/data-62-14.xbr
 create mode 100644 asn1c/tests/data-62/data-62-15-B.ber
 create mode 100644 asn1c/tests/data-62/data-62-15-B.xbr
 create mode 100644 asn1c/tests/data-62/data-62-16.ber
 create mode 100644 asn1c/tests/data-62/data-62-16.xbr
 create mode 100644 asn1c/tests/data-62/data-62-17-B.ber
 create mode 100644 asn1c/tests/data-62/data-62-17-B.xbr
 create mode 100644 asn1c/tests/data-62/data-62-18-B.ber
 create mode 100644 asn1c/tests/data-62/data-62-18-B.xbr
 create mode 100644 asn1c/tests/data-62/data-62-19-B.ber
 create mode 100644 asn1c/tests/data-62/data-62-19-B.xbr
 create mode 100644 asn1c/tests/data-62/data-62-20.ber
 create mode 100644 asn1c/tests/data-62/data-62-20.xbr
 create mode 100644 asn1c/tests/data-62/data-62-21-B.ber
 create mode 100644 asn1c/tests/data-62/data-62-21-B.xbr
 create mode 100644 asn1c/tests/data-62/data-62-22.ber
 create mode 100644 asn1c/tests/data-62/data-62-22.xbr
 create mode 100644 asn1c/tests/data-62/data-62-23-B.ber
 create mode 100644 asn1c/tests/data-62/data-62-23-B.xbr
 create mode 100644 asn1c/tests/data-62/data-62-24-L.ber
 create mode 100644 asn1c/tests/data-62/data-62-24-L.xbr
 create mode 100644 asn1c/tests/data-62/data-62-25.ber
 create mode 100644 asn1c/tests/data-62/data-62-25.xbr
 create mode 100644 asn1c/tests/data-62/data-62-26-B.ber
 create mode 100644 asn1c/tests/data-62/data-62-26-B.xbr
 create mode 100644 asn1c/tests/data-62/data-62-27.ber
 create mode 100644 asn1c/tests/data-62/data-62-27.xbr

diff --git a/asn1c/tests/Makefile.am b/asn1c/tests/Makefile.am
index 24d0a38f..97916139 100644
--- a/asn1c/tests/Makefile.am
+++ b/asn1c/tests/Makefile.am
@@ -11,7 +11,12 @@ else
 TESTS = check-*.c
 endif
 
-EXTRA_DIST = $(check_SCRIPTS) check-*.c*
+EXTRA_DIST = $(check_SCRIPTS) check-*.c* data-*/*.*
 
 clean:
-	for t in test-*; do rm -rf $$t; done
+	rm -rf test-*
+
+SUFFIXES = .xbr .ber
+
+.xbr.ber:
+	../enber $< > $@
diff --git a/asn1c/tests/Makefile.in b/asn1c/tests/Makefile.in
index e4b6b3b1..00336bf2 100644
--- a/asn1c/tests/Makefile.in
+++ b/asn1c/tests/Makefile.in
@@ -160,10 +160,12 @@ check_SCRIPTS = check-assembly.sh
 TESTS_ENVIRONMENT = CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" ./check-assembly.sh
 @CPLUSPLUS_FOUND_FALSE@TESTS = check-*.c
 @CPLUSPLUS_FOUND_TRUE@TESTS = check-*.c check-*.cc	## Include C++ test filed (.cc)
-EXTRA_DIST = $(check_SCRIPTS) check-*.c*
+EXTRA_DIST = $(check_SCRIPTS) check-*.c* data-*/*.*
+SUFFIXES = .xbr .ber
 all: all-am
 
 .SUFFIXES:
+.SUFFIXES: .xbr .ber
 $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
@@ -284,6 +286,7 @@ check-TESTS: $(TESTS)
 	else :; fi
 
 distdir: $(DISTFILES)
+	$(mkdir_p) $(distdir)/data-*
 	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
 	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
 	list='$(DISTFILES)'; for file in $$list; do \
@@ -396,7 +399,10 @@ uninstall-am: uninstall-info-am
 
 
 clean:
-	for t in test-*; do rm -rf $$t; done
+	rm -rf test-*
+
+.xbr.ber:
+	../enber $< > $@
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/asn1c/tests/check-62.c b/asn1c/tests/check-62.c
new file mode 100644
index 00000000..06287a8a
--- /dev/null
+++ b/asn1c/tests/check-62.c
@@ -0,0 +1,193 @@
+#undef	NDEBUG
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <unistd.h>	/* for chdir(2) */
+#include <string.h>
+#include <dirent.h>
+#include <assert.h>
+#include <errno.h>
+
+#include <T.h>
+
+enum expectation {
+	EXP_OK,		/* Encoding/decoding must succeed */
+	EXP_BROKEN,	/* Decoding must fail */
+	EXP_RECLESS,	/* Reconstruction is allowed to yield less data */
+};
+
+static unsigned char buf[4096];
+static int buf_offset;
+
+static int
+_buf_writer(const void *buffer, size_t size, void *app_key) {
+	unsigned char *b, *bend;
+	(void)app_key;
+	assert(buf_offset + size < sizeof(buf));
+	memcpy(buf + buf_offset, buffer, size);
+	b = buf + buf_offset;
+	bend = b + size;
+	printf("=> [");
+	for(; b < bend; b++)
+		printf(" %02X", *b);
+	printf("]:%ld\n", (long)size);
+	buf_offset += size;
+	return 0;
+}
+
+static int
+save_object(T_t *st) {
+	asn_enc_rval_t rval; /* Return value */
+
+	buf_offset = 0;
+	
+	rval = der_encode(&asn1_DEF_T, st, _buf_writer, 0);
+	if (rval.encoded == -1) {
+		fprintf(stderr,
+			"Cannot encode %s: %s\n",
+			rval.failed_type->name, strerror(errno));
+		assert(rval.encoded != -1);
+		return -1;	/* JIC */
+	}
+
+	fprintf(stderr, "SAVED OBJECT IN SIZE %d\n", buf_offset);
+
+	return 0;
+}
+
+static T_t *
+load_object(enum expectation expectation, char *fbuf, int size) {
+	ber_dec_rval_t rval;
+	T_t *st = 0;
+	int csize;
+
+	fprintf(stderr, "LOADING OBJECT OF SIZE %d\n", size);
+
+	/* Perform multiple iterations with multiple chunks sizes */
+	for(csize = 1; csize < 20; csize += 1) {
+		int fbuf_offset = 0;
+		int fbuf_left = size;
+		int fbuf_chunk = csize;
+
+		if(st) asn1_DEF_T.free_struct(&asn1_DEF_T, st, 0);
+		st = 0;
+
+		do {
+			fprintf(stderr, "Decoding from %d with %d (left %d)\n",
+				fbuf_offset, fbuf_chunk, fbuf_left);
+			rval = ber_decode(&asn1_DEF_T, (void **)&st,
+				fbuf + fbuf_offset,
+					fbuf_chunk < fbuf_left 
+						? fbuf_chunk : fbuf_left);
+			fbuf_offset += rval.consumed;
+			fbuf_left -= rval.consumed;
+			if(rval.code == RC_WMORE)
+				fbuf_chunk += 1;	/* Give little more */
+			else
+				fbuf_chunk = csize;	/* Back off */
+		} while(fbuf_left && rval.code == RC_WMORE);
+
+		if(expectation != EXP_BROKEN) {
+			assert(rval.code == RC_OK);
+		} else {
+			assert(rval.code != RC_OK);
+			fprintf(stderr, "Failed, but this was expected\n");
+			asn1_DEF_T.free_struct(&asn1_DEF_T, st, 0);
+			st = 0;	/* ignore leak for now */
+		}
+	}
+
+	if(st) asn_fprint(stderr, &asn1_DEF_T, st);
+	return st;
+}
+
+
+static void
+process_data(enum expectation expectation, char *fbuf, int size) {
+	T_t *st;
+	int ret;
+
+	st = load_object(expectation, fbuf, size);
+	if(!st) return;
+
+	ret = save_object(st);
+	assert(buf_offset < sizeof(buf));
+	assert(ret == 0);
+
+	if(expectation == EXP_RECLESS) {
+		assert(buf_offset > 0 && buf_offset < size);
+		assert(memcmp(buf + 2, fbuf + 2, buf_offset - 2) == 0);
+	} else {
+		assert(buf_offset == size);
+		assert(memcmp(buf, fbuf, buf_offset) == 0);
+	}
+
+	asn1_DEF_T.free_struct(&asn1_DEF_T, st, 0);
+}
+
+/*
+ * Decode the .der files and try to regenerate them.
+ */
+static int
+process(const char *fname) {
+	char fbuf[4096];
+	char *ext = strrchr(fname, '.');
+	enum expectation expectation;
+	int ret;
+	int rd;
+	FILE *fp;
+
+	if(ext == 0 || strcmp(ext, ".ber"))
+		return 0;
+
+	switch(ext[-1]) {
+	case 'B':	/* The file is intentionally broken */
+		expectation = EXP_BROKEN; break;
+	case 'L':	/* Extensions are present */
+		expectation = EXP_RECLESS; break;
+	default:
+		expectation = EXP_OK; break;
+	}
+
+	fprintf(stderr, "\nProcessing file [../%s]\n", fname);
+
+	ret = chdir("../data-62");
+	assert(ret == 0);
+	fp = fopen(fname, "r");
+	ret = chdir("../test-check-62");
+	assert(ret == 0);
+	assert(fp);
+
+	rd = fread(fbuf, 1, sizeof(fbuf), fp);
+	fclose(fp);
+
+	assert(rd < sizeof(fbuf));	/* expect small files */
+
+	process_data(expectation, fbuf, rd);
+
+	return 1;
+}
+
+int
+main() {
+	DIR *dir;
+	struct dirent *dent;
+	int processed_files = 0;
+
+	dir = opendir("../data-62");
+	assert(dir);
+
+	while((dent = readdir(dir))) {
+		if(strncmp(dent->d_name, "data-62-", 8))
+			continue;
+
+		if(process(dent->d_name))
+			processed_files++;
+	}
+
+	assert(processed_files);
+	closedir(dir);
+
+	return 0;
+}
+
diff --git a/asn1c/tests/data-62/data-62-01.ber b/asn1c/tests/data-62/data-62-01.ber
new file mode 100644
index 00000000..9d0cd7d5
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-01.ber
@@ -0,0 +1 @@
+0¡test
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-01.xbr b/asn1c/tests/data-62/data-62-01.xbr
new file mode 100644
index 00000000..18f3e108
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-01.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="11">
+	<P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+	<C T="[1]" TL="2" V="6">
+		<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-02-B.ber b/asn1c/tests/data-62/data-62-02-B.ber
new file mode 100644
index 00000000..288fa2f6
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-02-B.ber
@@ -0,0 +1,2 @@
+0
+¡test
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-02-B.xbr b/asn1c/tests/data-62/data-62-02-B.xbr
new file mode 100644
index 00000000..3d4afbf3
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-02-B.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="10">
+	<P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+	<C T="[1]" TL="2" V="6">
+		<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-03-B.ber b/asn1c/tests/data-62/data-62-03-B.ber
new file mode 100644
index 00000000..35271bcb
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-03-B.ber
@@ -0,0 +1 @@
+0	¡test
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-03-B.xbr b/asn1c/tests/data-62/data-62-03-B.xbr
new file mode 100644
index 00000000..50930a62
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-03-B.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="9">
+	<P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+	<C T="[1]" TL="2" V="6">
+		<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-04-B.ber b/asn1c/tests/data-62/data-62-04-B.ber
new file mode 100644
index 00000000..c65a578c
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-04-B.ber
@@ -0,0 +1 @@
+0¡test
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-04-B.xbr b/asn1c/tests/data-62/data-62-04-B.xbr
new file mode 100644
index 00000000..f5b78c30
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-04-B.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="8">
+	<P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+	<C T="[1]" TL="2" V="6">
+		<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-05-B.ber b/asn1c/tests/data-62/data-62-05-B.ber
new file mode 100644
index 00000000..ff65b202
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-05-B.ber
@@ -0,0 +1 @@
+0¡test
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-05-B.xbr b/asn1c/tests/data-62/data-62-05-B.xbr
new file mode 100644
index 00000000..dd075fc9
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-05-B.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="7">
+	<P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+	<C T="[1]" TL="2" V="6">
+		<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-06-B.ber b/asn1c/tests/data-62/data-62-06-B.ber
new file mode 100644
index 00000000..530d54b2
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-06-B.ber
@@ -0,0 +1 @@
+0¡test
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-06-B.xbr b/asn1c/tests/data-62/data-62-06-B.xbr
new file mode 100644
index 00000000..e5bdfd8b
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-06-B.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="6">
+	<P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+	<C T="[1]" TL="2" V="6">
+		<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-07-B.ber b/asn1c/tests/data-62/data-62-07-B.ber
new file mode 100644
index 00000000..286ca58b
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-07-B.ber
@@ -0,0 +1 @@
+0¡test
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-07-B.xbr b/asn1c/tests/data-62/data-62-07-B.xbr
new file mode 100644
index 00000000..96803092
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-07-B.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="12">
+	<P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+	<C T="[1]" TL="2" V="6">
+		<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-08-L.ber b/asn1c/tests/data-62/data-62-08-L.ber
new file mode 100644
index 0000000000000000000000000000000000000000..d127e0882d89aaac98aa70965cf46e286d7b763f
GIT binary patch
literal 15
WcmXruVq#=n$R^BEl3HBC$^ZZo-vY(}

literal 0
HcmV?d00001

diff --git a/asn1c/tests/data-62/data-62-08-L.xbr b/asn1c/tests/data-62/data-62-08-L.xbr
new file mode 100644
index 00000000..8afad43a
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-08-L.xbr
@@ -0,0 +1,7 @@
+<C T="[UNIVERSAL 16]" TL="2" V="13">
+	<P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+	<C T="[1]" TL="2" V="6">
+		<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+	</C>
+	<P T="[UNIVERSAL 5]" TL="2" V="0"></P>	-- extra component
+</C>
diff --git a/asn1c/tests/data-62/data-62-09-L.ber b/asn1c/tests/data-62/data-62-09-L.ber
new file mode 100644
index 0000000000000000000000000000000000000000..b7856ca024e1c3f1b2048af260626b641234f5df
GIT binary patch
literal 18
ZcmXpIU}9ul$R^BEl3HBC%D~9@9{?Pi1I+*c

literal 0
HcmV?d00001

diff --git a/asn1c/tests/data-62/data-62-09-L.xbr b/asn1c/tests/data-62/data-62-09-L.xbr
new file mode 100644
index 00000000..e24ba2cd
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-09-L.xbr
@@ -0,0 +1,8 @@
+<C T="[UNIVERSAL 16]" TL="2" V="16">
+	<P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+	<C T="[1]" TL="2" V="6">
+		<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+	</C>
+	<P T="[UNIVERSAL 5]" TL="2" V="0"></P>	-- extra component
+	<P T="[UNIVERSAL 1]" TL="2" V="1">&xff;</P>  -- another extra component
+</C>
diff --git a/asn1c/tests/data-62/data-62-10.ber b/asn1c/tests/data-62/data-62-10.ber
new file mode 100644
index 0000000000000000000000000000000000000000..0772c45986479f98ad39844e63a4998014840e04
GIT binary patch
literal 9
QcmXqDU&vZt-N3*A01RCMSO5S3

literal 0
HcmV?d00001

diff --git a/asn1c/tests/data-62/data-62-10.xbr b/asn1c/tests/data-62/data-62-10.xbr
new file mode 100644
index 00000000..7dd86f02
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-10.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="7">
+	<C T="[1]" TL="2" V="5">
+		<I T="[APPLICATION 123]" TL="3" V="Indefinite">
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-11.ber b/asn1c/tests/data-62/data-62-11.ber
new file mode 100644
index 0000000000000000000000000000000000000000..8eeb0d883e62bed9aa49b5380c02b9dc8b1a9c4d
GIT binary patch
literal 12
QcmXruTF9}mfq?;p0TtK-CIA2c

literal 0
HcmV?d00001

diff --git a/asn1c/tests/data-62/data-62-11.xbr b/asn1c/tests/data-62/data-62-11.xbr
new file mode 100644
index 00000000..1ce0695a
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-11.xbr
@@ -0,0 +1,8 @@
+<C T="[UNIVERSAL 16]" TL="2" V="10">
+	<C T="[1]" TL="2" V="8">
+		<I T="[1]" TL="2">
+		</I>
+		<I T="[1]" TL="2">
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-12-B.ber b/asn1c/tests/data-62/data-62-12-B.ber
new file mode 100644
index 00000000..2ea1bdcc
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-12-B.ber
@@ -0,0 +1 @@
+0¡¡€
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-12-B.xbr b/asn1c/tests/data-62/data-62-12-B.xbr
new file mode 100644
index 00000000..b3a370c9
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-12-B.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="6">
+	<C T="[1]" TL="2" V="2">
+		<I T="[1]" TL="2">
+		-- Do not terminate: no end-of-content octets is intended
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-13-B.ber b/asn1c/tests/data-62/data-62-13-B.ber
new file mode 100644
index 0000000000000000000000000000000000000000..47dc2ac027d2b410ccf4c6eb1c67ef8d067f51ff
GIT binary patch
literal 10
RcmXruSjhIUfq~&s0{{_j1ET-{

literal 0
HcmV?d00001

diff --git a/asn1c/tests/data-62/data-62-13-B.xbr b/asn1c/tests/data-62/data-62-13-B.xbr
new file mode 100644
index 00000000..4ee30022
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-13-B.xbr
@@ -0,0 +1,8 @@
+<C T="[UNIVERSAL 16]" TL="2" V="8">
+	<C T="[1]" TL="2" V="6">
+		<I T="[PRIVATE 1]" TL="2">
+		</I>
+		<I T="[PRIVATE 2]" TL="2">
+		-- Do not terminate: no end-of-content octets is intended.
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-14.ber b/asn1c/tests/data-62/data-62-14.ber
new file mode 100644
index 0000000000000000000000000000000000000000..c048f282f50d7255afa45e9b9767513f7eabe5bc
GIT binary patch
literal 16
WcmXruTgdaU;ZXwv!($+3U;qFzegzT$

literal 0
HcmV?d00001

diff --git a/asn1c/tests/data-62/data-62-14.xbr b/asn1c/tests/data-62/data-62-14.xbr
new file mode 100644
index 00000000..0c7da7c6
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-14.xbr
@@ -0,0 +1,10 @@
+<C T="[UNIVERSAL 16]" TL="2" V="14">
+	<C T="[1]" TL="2" V="12">
+		<I T="[PRIVATE 1]" TL="2">
+			<I T="[PRIVATE 2]" TL="2">
+			</I>
+			<I T="[PRIVATE 3]" TL="2">
+			</I>
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-15-B.ber b/asn1c/tests/data-62/data-62-15-B.ber
new file mode 100644
index 0000000000000000000000000000000000000000..f87367fd5203b151630ea52fbaa6a4fc89b11bab
GIT binary patch
literal 14
UcmXruS;+OU;ZXwv!($)@04OR24gdfE

literal 0
HcmV?d00001

diff --git a/asn1c/tests/data-62/data-62-15-B.xbr b/asn1c/tests/data-62/data-62-15-B.xbr
new file mode 100644
index 00000000..c57f270c
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-15-B.xbr
@@ -0,0 +1,10 @@
+<C T="[UNIVERSAL 16]" TL="2" V="12">
+	<C T="[1]" TL="2" V="10">
+		<I T="[PRIVATE 1]" TL="2">
+			<I T="[PRIVATE 2]" TL="2">
+			</I>
+			<I T="[PRIVATE 3]" TL="2">
+			-- missing EOC
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-16.ber b/asn1c/tests/data-62/data-62-16.ber
new file mode 100644
index 0000000000000000000000000000000000000000..799e1e7323f56a54a168bbdc3c4c83b357578b5a
GIT binary patch
literal 14
VcmXruS;+OUL71f^wYY?V0RSNz1Rwwa

literal 0
HcmV?d00001

diff --git a/asn1c/tests/data-62/data-62-16.xbr b/asn1c/tests/data-62/data-62-16.xbr
new file mode 100644
index 00000000..600a6c11
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-16.xbr
@@ -0,0 +1,7 @@
+<C T="[UNIVERSAL 16]" TL="2" V="12">
+	<C T="[1]" TL="2" V="10">
+		<I T="[PRIVATE 1]" TL="2">
+			<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-17-B.ber b/asn1c/tests/data-62/data-62-17-B.ber
new file mode 100644
index 0000000000000000000000000000000000000000..5d98f99696749641627ee67e7a2b4aa562e48052
GIT binary patch
literal 15
WcmXruS;+OUL7259wYbEHfdK#|*#uJn

literal 0
HcmV?d00001

diff --git a/asn1c/tests/data-62/data-62-17-B.xbr b/asn1c/tests/data-62/data-62-17-B.xbr
new file mode 100644
index 00000000..4e49f2b1
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-17-B.xbr
@@ -0,0 +1,7 @@
+<C T="[UNIVERSAL 16]" TL="2" V="12">
+	<C T="[1]" TL="2" V="10">
+		<I T="[PRIVATE 1]" TL="2">
+			<P T="[UNIVERSAL 19]" TL="2" V="5">test2</P>
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-18-B.ber b/asn1c/tests/data-62/data-62-18-B.ber
new file mode 100644
index 0000000000000000000000000000000000000000..8200bcaf8ec907902dc026040a4f41308337f14c
GIT binary patch
literal 14
VcmXruTFCvdL71f^wYY?V0RSNk1RnqZ

literal 0
HcmV?d00001

diff --git a/asn1c/tests/data-62/data-62-18-B.xbr b/asn1c/tests/data-62/data-62-18-B.xbr
new file mode 100644
index 00000000..21778660
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-18-B.xbr
@@ -0,0 +1,7 @@
+<C T="[UNIVERSAL 16]" TL="2" V="13">
+	<C T="[1]" TL="2" V="11">
+		<I T="[PRIVATE 1]" TL="2">
+			<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-19-B.ber b/asn1c/tests/data-62/data-62-19-B.ber
new file mode 100644
index 0000000000000000000000000000000000000000..1e2641b3ed3666bea14d132f6cc36d0d9d77c770
GIT binary patch
literal 14
VcmXruS;+mcL71f^wYY?V0RSN;1R($b

literal 0
HcmV?d00001

diff --git a/asn1c/tests/data-62/data-62-19-B.xbr b/asn1c/tests/data-62/data-62-19-B.xbr
new file mode 100644
index 00000000..5e424cc4
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-19-B.xbr
@@ -0,0 +1,7 @@
+<C T="[UNIVERSAL 16]" TL="2" V="12">
+	<C T="[1]" TL="2" V="11">
+		<I T="[PRIVATE 1]" TL="2">
+			<P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-20.ber b/asn1c/tests/data-62/data-62-20.ber
new file mode 100644
index 0000000000000000000000000000000000000000..ea13838a4f51e6e4c1bd6c93e9fc046ffb00bf9b
GIT binary patch
literal 11
ScmXruT*&^gVShCP0|NjTBm;c_

literal 0
HcmV?d00001

diff --git a/asn1c/tests/data-62/data-62-20.xbr b/asn1c/tests/data-62/data-62-20.xbr
new file mode 100644
index 00000000..178fa660
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-20.xbr
@@ -0,0 +1,8 @@
+<C T="[UNIVERSAL 16]" TL="2" V="9">
+	<C T="[1]" TL="2" V="7">
+		<I T="[PRIVATE 1]" TL="2">
+			<C T="[123]" TL="3" V="0">
+			</C>
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-21-B.ber b/asn1c/tests/data-62/data-62-21-B.ber
new file mode 100644
index 0000000000000000000000000000000000000000..d109b4f23e9f0bff1d2a7e4132f0672a6ab32b57
GIT binary patch
literal 15
WcmXruT*&^gVShElb_P}k1_l5rb_6*9

literal 0
HcmV?d00001

diff --git a/asn1c/tests/data-62/data-62-21-B.xbr b/asn1c/tests/data-62/data-62-21-B.xbr
new file mode 100644
index 00000000..7aeac97d
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-21-B.xbr
@@ -0,0 +1,11 @@
+<C T="[UNIVERSAL 16]" TL="2" V="9">
+	<C T="[1]" TL="2" V="7">
+		<I T="[PRIVATE 1]" TL="2">
+			<C T="[123]" TL="3" V="0">
+				<C T="[23]" TL="2" V="0">
+					<P T="[UNIVERSAL 5]" TL="2" V="0"></P>
+				</C>
+			</C>
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-22.ber b/asn1c/tests/data-62/data-62-22.ber
new file mode 100644
index 0000000000000000000000000000000000000000..93111e9f4528787ae78c17a8948f418bb760eda3
GIT binary patch
literal 15
WcmXruTFCvdVShEtb|zK^1_l5r+5|)Z

literal 0
HcmV?d00001

diff --git a/asn1c/tests/data-62/data-62-22.xbr b/asn1c/tests/data-62/data-62-22.xbr
new file mode 100644
index 00000000..ca220a73
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-22.xbr
@@ -0,0 +1,11 @@
+<C T="[UNIVERSAL 16]" TL="2" V="13">
+	<C T="[1]" TL="2" V="11">
+		<I T="[PRIVATE 1]" TL="2">
+			<C T="[123]" TL="3" V="4">
+				<C T="[23]" TL="2" V="2">
+					<P T="[UNIVERSAL 5]" TL="2" V="0"></P>
+				</C>
+			</C>
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-23-B.ber b/asn1c/tests/data-62/data-62-23-B.ber
new file mode 100644
index 0000000000000000000000000000000000000000..a1f5af9b8bed55a1ec496e1662b807fd6ff39902
GIT binary patch
literal 15
WcmXruTFCvdVShF2b|zK^1_l5r;RHnh

literal 0
HcmV?d00001

diff --git a/asn1c/tests/data-62/data-62-23-B.xbr b/asn1c/tests/data-62/data-62-23-B.xbr
new file mode 100644
index 00000000..7a2777ed
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-23-B.xbr
@@ -0,0 +1,11 @@
+<C T="[UNIVERSAL 16]" TL="2" V="13">
+	<C T="[1]" TL="2" V="11">
+		<I T="[PRIVATE 1]" TL="2">
+			<C T="[123]" TL="3" V="5">
+				<C T="[23]" TL="2" V="2">
+					<P T="[UNIVERSAL 5]" TL="2" V="0"></P>
+				</C>
+			</C>
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-24-L.ber b/asn1c/tests/data-62/data-62-24-L.ber
new file mode 100644
index 0000000000000000000000000000000000000000..d88d78b4a21b31086cf36ed94671935d11f5a925
GIT binary patch
literal 20
YcmXqLSjhLVVShF2c4lG5Dh4nB08AAHNB{r;

literal 0
HcmV?d00001

diff --git a/asn1c/tests/data-62/data-62-24-L.xbr b/asn1c/tests/data-62/data-62-24-L.xbr
new file mode 100644
index 00000000..9974a67e
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-24-L.xbr
@@ -0,0 +1,12 @@
+<I T="[UNIVERSAL 16]" TL="2" V="Indefinite">
+	<C T="[1]" TL="2" V="14">
+		<I T="[PRIVATE 1]" TL="2">
+			<C T="[123]" TL="3" V="5">
+				<C T="[23]" TL="2" V="3">
+					<P T="[UNIVERSAL 19]" TL="2" V="1">z</P>
+				</C>
+			</C>
+		</I>
+		<P T="[UNIVERSAL 0]" TL="2" V="0"></P>
+	</C>
+</I>
diff --git a/asn1c/tests/data-62/data-62-25.ber b/asn1c/tests/data-62/data-62-25.ber
new file mode 100644
index 0000000000000000000000000000000000000000..931978ba483cd274faa4f997a6fafbbbf14d5d62
GIT binary patch
literal 16
XcmXruTgdaUVShF2c4lG5Dh37sFf9bs

literal 0
HcmV?d00001

diff --git a/asn1c/tests/data-62/data-62-25.xbr b/asn1c/tests/data-62/data-62-25.xbr
new file mode 100644
index 00000000..d62e4567
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-25.xbr
@@ -0,0 +1,11 @@
+<C T="[UNIVERSAL 16]" TL="2" V="14">
+	<C T="[1]" TL="2" V="12">
+		<I T="[PRIVATE 1]" TL="2">
+			<C T="[123]" TL="3" V="5">
+				<C T="[23]" TL="2" V="3">
+					<P T="[UNIVERSAL 19]" TL="2" V="1">z</P>
+				</C>
+			</C>
+		</I>
+	</C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-26-B.ber b/asn1c/tests/data-62/data-62-26-B.ber
new file mode 100644
index 0000000000000000000000000000000000000000..ef7d10632c6296380d40e17c6e18855685d04270
GIT binary patch
literal 18
YcmXqLSjhLVVShF2c4lG5Dh40`06~QXNB{r;

literal 0
HcmV?d00001

diff --git a/asn1c/tests/data-62/data-62-26-B.xbr b/asn1c/tests/data-62/data-62-26-B.xbr
new file mode 100644
index 00000000..13c0aa29
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-26-B.xbr
@@ -0,0 +1,11 @@
+<I T="[UNIVERSAL 16]" TL="2" V="Indefinite">
+	<C T="[1]" TL="2" V="14">
+		<I T="[PRIVATE 1]" TL="2">
+			<C T="[123]" TL="3" V="5">
+				<C T="[23]" TL="2" V="3">
+					<P T="[UNIVERSAL 19]" TL="2" V="1">z</P>
+				</C>
+			</C>
+		</I>
+	</C>
+</I>
diff --git a/asn1c/tests/data-62/data-62-27.ber b/asn1c/tests/data-62/data-62-27.ber
new file mode 100644
index 0000000000000000000000000000000000000000..7cb619dcd6355c15108a6558777e518d7f852896
GIT binary patch
literal 4
LcmXqDTF3wZ0t^7u

literal 0
HcmV?d00001

diff --git a/asn1c/tests/data-62/data-62-27.xbr b/asn1c/tests/data-62/data-62-27.xbr
new file mode 100644
index 00000000..2fb64227
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-27.xbr
@@ -0,0 +1,4 @@
+<C T="[UNIVERSAL 16]" TL="2" V="2">
+	<C T="[1]" TL="2" V="0">
+	</C>
+</C>
-- 
GitLab