#!/bin/sh

#
# This script is designed to quickly create lots of files in underlying
# test-* directories, do lots of other magic stuff and exit cleanly.
#

set -e

if [ "x$1" = "x" ]; then
	echo "Usage: $0 <check-NN.c>"
	exit
fi

srcdir="${srcdir:-.}"
abs_top_srcdir="${abs_top_srcdir:-$(pwd)/../../}"
abs_top_builddir="${abs_top_builddir:-$(pwd)/../../}"

if echo "$*" | grep -q -- -- ; then
    TEST_DRIVER=$(echo "$*"  | sed -e 's/ -- .*/ -- /g')
    source_full=$(echo "$*"  | sed -e 's/.* //g')
else
    TEST_DRIVER=""
    source_full="$1"
fi

# Compute the .asn1 spec name by the given file name.
source_short=$(echo "$source_full" | sed -e 's/.*\///')
testno=$(echo "$source_short" | cut -f2 -d'-' | cut -f1 -d'.')

CODECS_FLAGS=""
has_oer=$(echo "$source_short" | grep "gen-OER" || :)
if [ ! "$has_oer" ]; then
    CODECS_FLAGS="${CODECS_FLAGS} -DASN_DISABLE_OER_SUPPORT"
fi
has_per=$(echo "$source_short" | grep "gen-PER" || :)
if [ ! "$has_per" ]; then
    CODECS_FLAGS="${CODECS_FLAGS} -DASN_DISABLE_PER_SUPPORT"
fi

args=$(echo "$source_short" | sed -E -e 's/\.c+$//')
source_obj=$(echo "$source_short" | sed -E -e 's/\.c+$/.o/')

OFS=$IFS
IFS="."
set $args
shift
IFS=$OFS
AFLAGS="$*"

# Assume the test fails. Will be removed when it passes well.
testdir=test-${args}
if [ -f "${testdir}-FAILED" ]; then
    rm -rf "${testdir}"
fi
touch "${testdir}-FAILED"

mkdir -p "${testdir}"
ln -fns "../${source_full}" "${testdir}"

if test "${LIBFUZZER_CFLAGS}" && grep LLVMFuzzer ${source_full} > /dev/null;
then
    MAKE_FUZZER=yes
else
    MAKE_FUZZER=no
fi

asn_module=$(echo "${abs_top_srcdir}/tests/tests-asn1c-compiler/${testno}"-*.asn1)

AUTOGENERATED="# This file is autogenerated by $0 ${source_full} ${AFLAGS}"

# Create a common Makefile for the project
cat <<TARGETS > "${testdir}/Makefile.targets"
${AUTOGENERATED}

COMMON_FLAGS= -I.
CFLAGS = \${COMMON_FLAGS} ${CFLAGS:-} -g -O1
CFLAGS += -DSRCDIR=../${srcdir} ${CODECS_FLAGS}
CXXFLAGS = \${CFLAGS} ${CXXFLAGS}
LIBFUZZER_CFLAGS = ${LIBFUZZER_CFLAGS}
LDFLAGS = ${LDFLAGS:-}

CC ?= ${CC}
CXX ?= ${CXX}

all: compiled-module
	\$(MAKE) check-executable

check-executable: \$(OBJS)
	@rm -f *.core
	\$(CC) \$(CFLAGS) \$(LDFLAGS) -o check-executable \$(OBJS) -lm

# Compile the corresponding .asn1 spec.
compiled-module: ${asn_module} ${abs_top_builddir}/asn1c/asn1c
	${abs_top_builddir}/asn1c/asn1c		\\
		-S ${abs_top_srcdir}/skeletons	\\
		-Wdebug-compiler		\\
		${AFLAGS} ${asn_module}
	rm -f converter-sample.c
	@touch compiled-module

TARGETS


if [ "${MAKE_FUZZER}" != "yes" ]; then
    CHECK_FUZZER=": # No fuzzer defined"
cat <<TARGETS >> "${testdir}/Makefile.targets"
.PHONY check-fuzzer:
check-fuzzer:
TARGETS
else
    CHECK_FUZZER="./check-fuzzer -timeout=3 -max_total_time=60 -max-len 512 -detect_leaks=1"
cat <<TARGETS >> "${testdir}/Makefile.targets"
check-fuzzer: \$(OBJS)
	rm -f ${source_obj}
	\$(CC) \$(CFLAGS) \$(LIBFUZZER_CFLAGS) -c -o ${source_obj} ${source_short}
	\$(CC) \$(CFLAGS) \$(LIBFUZZER_CFLAGS) \$(LDFLAGS) -o check-fuzzer \$(OBJS)
	rm -f ${source_obj}
TARGETS
fi

cat <<TARGETS >> "${testdir}/Makefile.targets"

check-succeeded: compiled-module
	\$(MAKE) check-executable
	\$(MAKE) check-fuzzer
	@rm -f check-succeeded
	./check-executable
	${CHECK_FUZZER}
	@touch check-succeeded

check: check-succeeded

clean:
	@rm -f *.o check-executable
TARGETS

# Create a BSD- or GNU-specific Makefile for the project.
produce_specific_makefile() {
    local make_type=$1
    local make_file="$testdir/${make_type}makefile"

    if [ ${make_type} = "BSD" ]; then
		cat <<-OBJECTS > ${make_file}
			${AUTOGENERATED}
			SRCS_C!=find . -name \*.c
			SRCS_CXX!=find . -name \*.cc
			SRCS=\$(SRCS_C) \$(SRCS_CXX)
			OBJS=\${SRCS_C:.c=.o} ${SRCS_CXX:.cc=.o}
			.sinclude <Makefile.targets>
		OBJECTS
	else
		cat <<-OBJECTS > ${make_file}
			${AUTOGENERATED}
			SRCS_C := \$(wildcard *.c)
			SRCS_CXX := \$(wildcard *.cc)
			SRCS = \$(SRCS_C) \$(SRCS_CXX)
			OBJS =\$(patsubst %.c,%.o,\$(SRCS_C))
			OBJS+=\$(patsubst %.cc,%.o,\$(SRCS_CXX))
			-include Makefile.targets
		OBJECTS
    fi

}

produce_specific_makefile BSD
produce_specific_makefile GNU

# Perform building and checking
${TEST_DRIVER} make -C "$testdir" check

# Make sure the test is not marked as failed any longer.
rm -f "${testdir}-FAILED"
