encode BIT STRING in a minimum number of bits for CANONICAL-UPER
diff --git a/tests/tests-randomized/bundles/03-BIT-STRING-bundle.txt b/tests/tests-randomized/bundles/03-BIT-STRING-bundle.txt
new file mode 100644
index 0000000..2835b3c
--- /dev/null
+++ b/tests/tests-randomized/bundles/03-BIT-STRING-bundle.txt
@@ -0,0 +1,19 @@
+-- Test encoding/decoding/transcoding of everything concerning the BIT STRING.
+T ::= BIT STRING { foo(0) }
+T ::= BIT STRING { foo(0) } (SIZE(0..1))
+T ::= BIT STRING { foo(0) } (SIZE(1))
+T ::= BIT STRING { foo(0) } (SIZE(1..MAX))
+T ::= BIT STRING { foo(0) } (SIZE(1..2))
+T ::= BIT STRING { foo(0) } (SIZE(2))
+T ::= BIT STRING { foo(0) } (SIZE(2,...))
+T ::= BIT STRING { foo(0), bar(65535) }
+T ::= BIT STRING { foo(0), bar(65535) } (SIZE(0..16))
+T ::= BIT STRING { foo(0), bar(65535) } (SIZE(16))
+T ::= BIT STRING { foo(0), bar(2147483647) }
+T ::= BIT STRING { foo(0), bar(2147483647) } (SIZE(1..MAX))
+T ::= BIT STRING { foo(2147483648), bar(0), baz(2147483647) }
+T ::= BIT STRING { foo(2147483648), baz(2147483647) }
+T ::= BIT STRING { foo(2147483648), baz(2147483647) } (SIZE(32))
+T ::= BIT STRING { foo(2147483648), baz(2147483647) } (SIZE(31,...))
+T ::= BIT STRING { foo(2147483648), baz(2147483647) } (SIZE(0..32))
+T ::= BIT STRING { foo(2147483648), baz(2147483647) } (SIZE(0..31,...))
diff --git a/tests/tests-randomized/bundles/04-VisibleString-bundle.txt b/tests/tests-randomized/bundles/04-VisibleString-bundle.txt
new file mode 100644
index 0000000..c86aa79
--- /dev/null
+++ b/tests/tests-randomized/bundles/04-VisibleString-bundle.txt
@@ -0,0 +1,26 @@
+-- Test encoding/decoding/transcoding of a simple string type
+T ::= VisibleString
+T ::= VisibleString ("Value Constraint")
+T ::= VisibleString (SIZE(0))
+T ::= VisibleString (SIZE(0,...))
+T ::= VisibleString (SIZE(1))
+T ::= VisibleString (SIZE(1)) (FROM("A".."B"))
+T ::= VisibleString (SIZE(1,..))
+T ::= VisibleString (SIZE(2))
+T ::= VisibleString (SIZE(2,...))
+T ::= VisibleString (SIZE(1..2))
+T ::= VisibleString (SIZE(1..2,...))
+T ::= VisibleString (SIZE(4..6,...)) (FROM("A".."B"))
+T ::= VisibleString (SIZE(1..MAX)) FROM("A".."B"))
+T ::= VisibleString (SIZE(1..127))
+T ::= VisibleString (SIZE(1..128))
+T ::= VisibleString (SIZE(1..129))
+T ::= VisibleString (SIZE(5) INTERSECTION FROM("A".."Z"))
+T ::= VisibleString (SIZE(64000))   -- Length is not encoded, #11.9.3.3
+T ::= VisibleString (SIZE(32000..32002))
+T ::= VisibleString (SIZE(32000..32002)) (FROM("A".."B"))
+T ::= VisibleString (SIZE(32000..32002,...)) (FROM("A".."B"))
+T ::= VisibleString (SIZE(65530..65535))
+T ::= VisibleString (SIZE(65530..65536))
+T ::= VisibleString (SIZE(4..6) INTERSECTION (FROM("A".."B")))
+T ::= VisibleString (SIZE(4..6,...) INTERSECTION (FROM("A".."B")))
diff --git a/tests/tests-randomized/check-bundles.sh b/tests/tests-randomized/check-bundles.sh
index f9e2b4d..3ba312d 100755
--- a/tests/tests-randomized/check-bundles.sh
+++ b/tests/tests-randomized/check-bundles.sh
@@ -66,7 +66,7 @@
     echo "Testing [$asn] ${where}"
 
     mkdir -p ${RNDTEMP}
-    if (cd ${RNDTEMP} && compile_and_test "$asn" "$@"); then
+    if (set -e && cd ${RNDTEMP} && compile_and_test "$asn" "$@"); then
         echo "OK [$asn] ${where}"
         tests_succeeded=$((tests_succeeded+1))
     else
@@ -134,7 +134,7 @@
         done
     fi
 
-    return 0;
+    return 0
 }
 
 asn_compile() {
@@ -150,8 +150,11 @@
     test ! -f Makefile.am   # Protection from accidental clobbering
     echo "Test DEFINITIONS ::= BEGIN $asn" > test.asn1
     echo "END" >> test.asn1
-    ${abs_top_builddir}/asn1c/asn1c -S ${abs_top_srcdir}/skeletons \
+    if ! ${abs_top_builddir}/asn1c/asn1c -S ${abs_top_srcdir}/skeletons \
         -gen-OER -gen-PER test.asn1
+    then
+        return 1
+    fi
     rm -f converter-example.c
     ln -sf ../random-test-driver.c || cp ../random-test-driver.c .
     echo "CFLAGS+= -DASN1_TEXT='$short_asn'" > Makefile
diff --git a/tests/tests-randomized/random-test-driver.c b/tests/tests-randomized/random-test-driver.c
index e2ea475..0b93d96 100644
--- a/tests/tests-randomized/random-test-driver.c
+++ b/tests/tests-randomized/random-test-driver.c
@@ -190,9 +190,6 @@
 
 static void
 check_random_roundtrip(enum asn_transfer_syntax syntax, int iterations) {
-    char tmp_buffer[512];
-    char *buffer = tmp_buffer;
-    size_t buffer_size = sizeof(tmp_buffer);
     struct encoding_map enc;
 
     for(size_t i = 0; i < sizeof(encodings)/sizeof(encodings[0]); i++) {
@@ -205,6 +202,9 @@
     }
 
     for(int i = 0; i < iterations; i++) {
+        char tmp_buffer[512];
+        char *buffer = tmp_buffer;
+        size_t buffer_size = sizeof(tmp_buffer);
         T_t *structure = 0;
         T_t *decoded_structure = 0;
 
@@ -228,6 +228,8 @@
                 exit(EX_SOFTWARE);
             }
             if(er.encoded > buffer_size && buffer == tmp_buffer) {
+                fprintf(stderr, "Reallocate output buffer %zu -> %zu\n",
+                        buffer_size, er.encoded);
                 buffer = malloc(er.encoded + 1);
                 assert(buffer);
                 buffer[er.encoded] = '\0';
@@ -236,7 +238,11 @@
             }
             break;
         }
-        assert(er.encoded <= buffer_size);
+        if(er.encoded > buffer_size) {
+            fprintf(stderr, "Data %zd does not fit into buffer %zu\n",
+                    er.encoded, buffer_size);
+            assert(er.encoded <= buffer_size);
+        }
 
         asn_dec_rval_t rval =
             asn_decode(0, syntax, &asn_DEF_T, (void **)&decoded_structure,
@@ -244,9 +250,9 @@
         if(rval.code == RC_OK) {
             /* Everything's cool... or is it? Expecting a proper consumed */
             if(rval.consumed != er.encoded) {
-                fprintf(stderr, "Encoded into %zd, yet consumed %zu",
+                fprintf(stderr, "Encoded into %zd, yet consumed %zu\n",
                         er.encoded, rval.consumed);
-                fprintf(stderr, "Structure:\n");
+                fprintf(stderr, "Original random structure:\n");
                 asn_fprint(stderr, &asn_DEF_T, structure);
                 assert(rval.consumed == er.encoded);
                 exit(EX_SOFTWARE);
@@ -256,7 +262,7 @@
                     "Decoding %zu bytes of T yielded %s after byte %zu\n",
                     er.encoded, rval.code == RC_FAIL ? "RC_FAIL" : "RC_WMORE",
                     rval.consumed);
-            fprintf(stderr, "Structure:\n");
+            fprintf(stderr, "Original random structure:\n");
             asn_fprint(stderr, &asn_DEF_T, structure);
             exit(EX_SOFTWARE);
         }
@@ -278,8 +284,6 @@
 
         if(buffer != tmp_buffer) {
             free(buffer);
-            buffer = tmp_buffer;
-            buffer_size = sizeof(tmp_buffer);
         }
 
         if(i < 5) {