blob: 299f833d1c3588a2bcde7322c1163d909a563961 [file] [log] [blame]
Lev Walkin700df492017-08-10 14:59:15 -07001#!/bin/sh
2
3#
4# This script is designed to quickly create lots of files in underlying
5# test-* directories, do lots of other magic stuff and exit cleanly.
6#
7
8set -e
9
10if [ "x$1" = "x" ]; then
Lev Walkin15734f92017-09-30 11:41:04 -070011 echo "Usage: $0 check-src/<check-NN.c>"
12 exit 1
Lev Walkin700df492017-08-10 14:59:15 -070013fi
14
15srcdir="${srcdir:-.}"
16abs_top_srcdir="${abs_top_srcdir:-$(pwd)/../../}"
17abs_top_builddir="${abs_top_builddir:-$(pwd)/../../}"
18
19if echo "$*" | grep -q -- -- ; then
20 TEST_DRIVER=$(echo "$*" | sed -e 's/ -- .*/ -- /g')
21 source_full=$(echo "$*" | sed -e 's/.* //g')
22else
23 TEST_DRIVER=""
24 source_full="$1"
25fi
26
27# Compute the .asn1 spec name by the given file name.
28source_short=$(echo "$source_full" | sed -e 's/.*\///')
29testno=$(echo "$source_short" | cut -f2 -d'-' | cut -f1 -d'.')
30
Lev Walkinb5cdc5d2017-09-15 21:57:46 -070031args=$(echo "$source_short" | sed -E -e 's/\.c+$//')
Lev Walkin387a8f02017-09-15 23:24:00 -070032source_obj=$(echo "$source_short" | sed -E -e 's/\.c+$/.o/')
Lev Walkin7b04d792017-09-16 00:04:18 -070033ext=$(echo "$source_short" | sed -E -e 's/.*\.(c+)$/\1/')
34
Lev Walkin700df492017-08-10 14:59:15 -070035OFS=$IFS
36IFS="."
37set $args
Lev Walkinc8c286a2017-09-18 03:19:37 -070038data_dir=$(echo "$1" | sed -e s/check-/data-/)
Lev Walkin700df492017-08-10 14:59:15 -070039shift
40IFS=$OFS
41AFLAGS="$*"
42
Lev Walkinc8c286a2017-09-18 03:19:37 -070043if [ -d ${data_dir} ]; then
44 OPT_DATA_DIR="../${data_dir}"
45else
46 OPT_DATA_DIR=""
47fi
48
49if test "${LIBFUZZER_CFLAGS}" && grep LLVMFuzzer ${source_full} > /dev/null;
50then
51 MAKE_FUZZER=yes
52else
53 MAKE_FUZZER=no
54fi
55
Lev Walkin700df492017-08-10 14:59:15 -070056# Assume the test fails. Will be removed when it passes well.
57testdir=test-${args}
58if [ -f "${testdir}-FAILED" ]; then
59 rm -rf "${testdir}"
60fi
61touch "${testdir}-FAILED"
62
63mkdir -p "${testdir}"
64ln -fns "../${source_full}" "${testdir}"
65
66asn_module=$(echo "${abs_top_srcdir}/tests/tests-asn1c-compiler/${testno}"-*.asn1)
67
68AUTOGENERATED="# This file is autogenerated by $0 ${source_full} ${AFLAGS}"
69
70# Create a common Makefile for the project
Lev Walkin40b8a7a2017-10-08 22:36:29 -070071cat <<END_MAKEFILE > "${testdir}/Makefile"
Lev Walkin700df492017-08-10 14:59:15 -070072${AUTOGENERATED}
Lev Walkin026055f2017-08-27 01:28:59 -070073COMMON_FLAGS= -I.
Lev Walkin24cf97d2017-09-15 20:34:25 -070074CFLAGS = \${COMMON_FLAGS} ${CFLAGS:-} -g -O1
Lev Walkin40b8a7a2017-10-08 22:36:29 -070075CFLAGS += -DSRCDIR=../${srcdir}
Lev Walkinb5cdc5d2017-09-15 21:57:46 -070076CXXFLAGS = \${CFLAGS} ${CXXFLAGS}
Lev Walkin387a8f02017-09-15 23:24:00 -070077LIBFUZZER_CFLAGS = ${LIBFUZZER_CFLAGS}
Lev Walkin700df492017-08-10 14:59:15 -070078LDFLAGS = ${LDFLAGS:-}
79
Lev Walkin40b8a7a2017-10-08 22:36:29 -070080ASN_PROGRAM = check-program
81ASN_PROGRAM_SOURCES = ${source_short}
82
Lev Walkin700df492017-08-10 14:59:15 -070083CC ?= ${CC}
Lev Walkinb5cdc5d2017-09-15 21:57:46 -070084CXX ?= ${CXX}
Lev Walkin700df492017-08-10 14:59:15 -070085
Lev Walkin40b8a7a2017-10-08 22:36:29 -070086-include Makefile.am.example
Lev Walkin700df492017-08-10 14:59:15 -070087
Lev Walkin40b8a7a2017-10-08 22:36:29 -070088all: compiled-module
89 \$(MAKE) check-program
Lev Walkin700df492017-08-10 14:59:15 -070090
91# Compile the corresponding .asn1 spec.
92compiled-module: ${asn_module} ${abs_top_builddir}/asn1c/asn1c
93 ${abs_top_builddir}/asn1c/asn1c \\
94 -S ${abs_top_srcdir}/skeletons \\
95 -Wdebug-compiler \\
96 ${AFLAGS} ${asn_module}
Lev Walkin15b26e62017-09-26 23:04:57 -070097 rm -f converter-example.c
Lev Walkin700df492017-08-10 14:59:15 -070098 @touch compiled-module
99
Lev Walkin40b8a7a2017-10-08 22:36:29 -0700100END_MAKEFILE
Lev Walkin387a8f02017-09-15 23:24:00 -0700101
102
103if [ "${MAKE_FUZZER}" != "yes" ]; then
Lev Walkin19008882017-09-27 02:29:27 +0000104 CHECK_FUZZER="@echo \"No fuzzer defined, skipping.\""
Lev Walkin40b8a7a2017-10-08 22:36:29 -0700105cat <<END_MAKEFILE >> "${testdir}/Makefile"
Lev Walkin19008882017-09-27 02:29:27 +0000106.PHONY: check-fuzzer
Lev Walkin387a8f02017-09-15 23:24:00 -0700107check-fuzzer:
Lev Walkin40b8a7a2017-10-08 22:36:29 -0700108END_MAKEFILE
Lev Walkin387a8f02017-09-15 23:24:00 -0700109else
Lev Walkindcae9ce2017-09-18 20:13:36 -0700110 CHECK_FUZZER="ASAN_OPTIONS=detect_leaks=1 UBSAN_OPTIONS=print_stacktrace=1 ./check-fuzzer -timeout=3 -max_total_time=60 -max_len=512 ${OPT_DATA_DIR}"
Lev Walkin40b8a7a2017-10-08 22:36:29 -0700111cat <<END_MAKEFILE >> "${testdir}/Makefile"
112check-fuzzer: ${source_short} \$(ASN_LIBRARY)
113 ${CC} \$(CFLAGS) \$(LIBFUZZER_CFLAGS) \$(LDFLAGS) -o check-fuzzer \$^
114END_MAKEFILE
Lev Walkin387a8f02017-09-15 23:24:00 -0700115fi
116
Lev Walkin40b8a7a2017-10-08 22:36:29 -0700117cat <<END_MAKEFILE >> "${testdir}/Makefile"
Lev Walkin387a8f02017-09-15 23:24:00 -0700118
Lev Walkin40b8a7a2017-10-08 22:36:29 -0700119check-succeeded: compiled-module \$(ASN_LIBRARY) ${source_short}
120 \$(MAKE) check-program
Lev Walkin387a8f02017-09-15 23:24:00 -0700121 \$(MAKE) check-fuzzer
Lev Walkin700df492017-08-10 14:59:15 -0700122 @rm -f check-succeeded
Lev Walkin40b8a7a2017-10-08 22:36:29 -0700123 ./check-program
Lev Walkindcae9ce2017-09-18 20:13:36 -0700124 \$(MAKE) fuzz
Lev Walkin700df492017-08-10 14:59:15 -0700125 @touch check-succeeded
Lev Walkin19008882017-09-27 02:29:27 +0000126 @echo "OK: ${source_full}"
Lev Walkin700df492017-08-10 14:59:15 -0700127
Lev Walkindcae9ce2017-09-18 20:13:36 -0700128.PHONY: fuzz
129fuzz:
130 ${CHECK_FUZZER}
131
Lev Walkin700df492017-08-10 14:59:15 -0700132check: check-succeeded
133
Lev Walkin40b8a7a2017-10-08 22:36:29 -0700134END_MAKEFILE
Lev Walkin700df492017-08-10 14:59:15 -0700135
136# Perform building and checking
Lev Walkin40b8a7a2017-10-08 22:36:29 -0700137${TEST_DRIVER} ${MAKE:-make} -C "${testdir}" check
Lev Walkin700df492017-08-10 14:59:15 -0700138
139# Make sure the test is not marked as failed any longer.
140rm -f "${testdir}-FAILED"