use RMAX= in test-random/bundles to test larger randomized values (default max limit is 128 bytes)
diff --git a/tests/tests-randomized/bundles/04-VisibleString-bundle.txt b/tests/tests-randomized/bundles/04-VisibleString-bundle.txt
index f86d743..ec03664 100644
--- a/tests/tests-randomized/bundles/04-VisibleString-bundle.txt
+++ b/tests/tests-randomized/bundles/04-VisibleString-bundle.txt
@@ -16,11 +16,11 @@
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))
+RMAX=64000 VisibleString (SIZE(64000)) -- Length is not encoded, #11.9.3.3
+RMAX=33000 T ::= VisibleString (SIZE(32000..32002))
+RMAX=33000 T ::= VisibleString (SIZE(32000..32002)) (FROM("A".."B"))
+RMAX=33000 T ::= VisibleString (SIZE(32000..32002,...)) (FROM("A".."B"))
+RMAX=65536 T ::= VisibleString (SIZE(65530..65535))
+RMAX=65536 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/bundles/README b/tests/tests-randomized/bundles/README
new file mode 100644
index 0000000..29c1aab
--- /dev/null
+++ b/tests/tests-randomized/bundles/README
@@ -0,0 +1,22 @@
+
+This directory contains test bundles for randomized testing.
+Each file contains a number of related ASN.1 types with variations in
+contstraints that are intended to affect encoding and parsing.
+
+ * Lines consisting of comments only are ignored.
+
+ * The ASN.1 type can be written with "T ::=" prefix or without it, in which
+ case it will be added automatically. It is done to simplify manual
+ testing with ./check-bundles.sh -t <type>. For example,
+ ./check-bundles.sh -t INTEGER
+ is equivalent to
+ ./check-bundles.sh -t "T ::= INTEGER"
+
+ * By default, the random value generator attempts to generate values
+ limited to very roughly to around 128 bytes. If huge values are desired
+ (perhaps due to large constraints), the RMAX=<size> prefix can be specified
+ on a line:
+
+ RMAX=64000 T ::= VisibleString (SIZE(64000))
+
+
diff --git a/tests/tests-randomized/check-bundles.sh b/tests/tests-randomized/check-bundles.sh
index 2847eb0..12f6e89 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 (set -e && cd ${RNDTEMP} && compile_and_test "$asn" "$@"); then
+ if (set -e && cd ${RNDTEMP} && compile_and_test "$asn" "${where}"); then
echo "OK [$asn] ${where}"
tests_succeeded=$((tests_succeeded+1))
else
@@ -79,7 +79,7 @@
local asn="$1"
shift
- if ! asn_compile "$asn" "$@"; then
+ if ! asn_compile "$asn" "$*"; then
echo "Cannot compile ASN.1 $asn"
return 1
fi
@@ -91,17 +91,21 @@
return 2
fi
+ # Maximum size of the random data
+ local rmax=$(echo "$asn" | sed -Ee '/RMAX/!d;s/.*RMAX=([0-9]+).*/\1/')
+ if [ "0${rmax}" -lt 1 ]; then rmax=128; fi
+
echo "Checking random data encode-decode"
- if ! eval ${ASAN_ENV_FLAGS} ./random-test-driver -c; then
+ if ! eval ${ASAN_ENV_FLAGS} ./random-test-driver -s ${rmax} -c; then
echo "RETRY:"
- echo "(cd ${RNDTEMP} && CC=${CC} CFLAGS=\"${LIBFUZZER_CFLAGS} ${CFLAGS}\" make && ${ASAN_ENV_FLAGS} ./random-test-driver -c)"
+ echo "(cd ${RNDTEMP} && CC=${CC} CFLAGS=\"${LIBFUZZER_CFLAGS} ${CFLAGS}\" make && ${ASAN_ENV_FLAGS} ./random-test-driver -s ${rmax} -c)"
return 3
fi
echo "Generating new random data"
rm -rf random-data
cmd="${ASAN_ENV_FLAGS} UBSAN_OPTIONS=print_stacktrace=1"
- cmd+=" ./random-test-driver -g random-data"
+ cmd+=" ./random-test-driver -s ${rmax} -g random-data"
if ! eval "$cmd" ; then
echo "RETRY:"
echo "(cd ${RNDTEMP} && $cmd)"
@@ -144,14 +148,16 @@
local asn="$1"
shift
- # Create "INTEGER (1..2)" from "T ::= INTEGER (1..2) -- Comment"
- local short_asn=$(echo "$asn" | sed -e 's/ *--.*//')
+ # Create "INTEGER (1..2)" from "RMAX=5 T ::= INTEGER (1..2) -- Comment"
+ local short_asn=$(echo "$asn" | sed -e 's/ *--.*//;s/RMAX=[^ ]* //;')
if [ $(echo "$short_asn" | grep -c "::=") = 1 ]; then
short_asn=$(echo "$short_asn" | sed -e 's/.*::= *//')
fi
+ asn=$(echo "$asn" | sed -e 's/RMAX=[^ ]* //;')
test ! -f Makefile.am # Protection from accidental clobbering
echo "Test DEFINITIONS ::= BEGIN $asn" > test.asn1
+ echo "-- $*" >> test.asn1
echo "END" >> test.asn1
if ! ${abs_top_builddir}/asn1c/asn1c -S ${abs_top_srcdir}/skeletons \
-gen-OER -gen-PER test.asn1
diff --git a/tests/tests-randomized/random-test-driver.c b/tests/tests-randomized/random-test-driver.c
index 0b93d96..cb7bda7 100644
--- a/tests/tests-randomized/random-test-driver.c
+++ b/tests/tests-randomized/random-test-driver.c
@@ -84,6 +84,7 @@
"OPTIONS:\n"
" -c Check encode-decode round-trip on random data\n"
" -g <dir> Generate random data for selected encodings\n"
+ " -s <size> Approximate max random value size for -c and -g\n"
" -n <number> Number of iterations for -c and -g\n"
" -e <encoding> Encodings to test or generate random data for\n"
"Encodings (ASN.1 Transfer Syntaxes):\n"
@@ -101,7 +102,7 @@
}
static void
-generate_random_data(enum asn_transfer_syntax syntax, const char *top_dirname, int iterations) {
+generate_random_data(enum asn_transfer_syntax syntax, const char *top_dirname, size_t max_random_value_size, int iterations, int debug) {
char dirname[PATH_MAX];
size_t dirname_len = 0;
dirname[dirname_len] = '\0';
@@ -142,7 +143,9 @@
snprintf(&dirname[dirname_len], sizeof(dirname) - dirname_len,
"/%03d.bin", i);
- if(asn_random_fill(&asn_DEF_T, (void **)&structure, 128) == -1) {
+ if(asn_random_fill(&asn_DEF_T, (void **)&structure,
+ max_random_value_size)
+ == -1) {
assert(structure == 0);
fprintf(stderr, "Can't generate %d'th value, skipping\n", i);
continue;
@@ -169,11 +172,13 @@
exit(EX_SOFTWARE);
}
- if(i < 5) {
- fprintf(stderr, "[%s] ", &filename[dirname_len+1]);
- asn_fprint(stderr, &asn_DEF_T, structure);
- } else if(i == 5) {
- fprintf(stderr, "... and so on\n");
+ if(debug) {
+ if(i < 5 || debug > 1) {
+ fprintf(stderr, "[%s] ", &filename[dirname_len+1]);
+ asn_fprint(stderr, &asn_DEF_T, structure);
+ } else if(i == 5) {
+ fprintf(stderr, "... and so on\n");
+ }
}
ASN_STRUCT_FREE(asn_DEF_T, structure);
@@ -189,7 +194,7 @@
}
static void
-check_random_roundtrip(enum asn_transfer_syntax syntax, int iterations) {
+check_random_roundtrip(enum asn_transfer_syntax syntax, size_t max_random_value_size, int iterations, int debug) {
struct encoding_map enc;
for(size_t i = 0; i < sizeof(encodings)/sizeof(encodings[0]); i++) {
@@ -208,7 +213,9 @@
T_t *structure = 0;
T_t *decoded_structure = 0;
- if(asn_random_fill(&asn_DEF_T, (void **)&structure, 128) == -1) {
+ if(asn_random_fill(&asn_DEF_T, (void **)&structure,
+ max_random_value_size)
+ == -1) {
assert(structure == 0);
fprintf(stderr, "Can't generate %d'th value, skipping\n", i);
continue;
@@ -228,8 +235,12 @@
exit(EX_SOFTWARE);
}
if(er.encoded > buffer_size && buffer == tmp_buffer) {
- fprintf(stderr, "Reallocate output buffer %zu -> %zu\n",
- buffer_size, er.encoded);
+ if(debug) {
+ fprintf(
+ stderr,
+ "Reallocate output buffer %zu -> %zu (iteration %d)\n",
+ buffer_size, er.encoded, i);
+ }
buffer = malloc(er.encoded + 1);
assert(buffer);
buffer[er.encoded] = '\0';
@@ -307,13 +318,18 @@
} mode = MODE_UNKNOWN;
const char *generate_into_dir = NULL;
int iterations = 100;
+ size_t max_random_value_size = 128;
+ int debug = 0;
int c;
- while((c = getopt(argc, argv, "ce:g:hn:")) != -1) {
+ while((c = getopt(argc, argv, "cde:g:hn:s:")) != -1) {
switch(c) {
case 'c':
mode = MODE_CHECK_RANDOM_ROUNDTRIP;
break;
+ case 'd':
+ debug = 1;
+ break;
case 'e':
enabled_encodings |= 1 << lookup_syntax(optarg);
if(enabled_encodings & (1 << ATS_INVALID)) {
@@ -336,6 +352,13 @@
exit(EX_DATAERR);
}
break;
+ case 's':
+ if(atoi(optarg) <= 0) {
+ fprintf(stderr, "-s %s: positive value expected\n", optarg);
+ exit(EX_DATAERR);
+ }
+ max_random_value_size = atoi(optarg);
+ break;
default:
usage(argv[0]);
exit(2);
@@ -360,10 +383,12 @@
assert(mode != MODE_UNKNOWN);
break;
case MODE_GENERATE_RANDOM_DATA:
- generate_random_data(syntax, generate_into_dir, iterations);
+ generate_random_data(syntax, generate_into_dir,
+ max_random_value_size, iterations, debug);
break;
case MODE_CHECK_RANDOM_ROUNDTRIP:
- check_random_roundtrip(syntax, iterations);
+ check_random_roundtrip(syntax, max_random_value_size,
+ iterations, debug);
break;
}
}