#!/usr/bin/env bash set -e LINE_SPACES=${LINE_SPACES:-48} MYDIR="$(realpath "$(dirname ${0})")" nDPId_test_EXEC="$(realpath "${2:-"${MYDIR}/../nDPId-test"}")" NETCAT_EXEC="$(which nc) -q 0 -l 127.0.0.1 9000" JSON_VALIDATOR="$(realpath "${3:-"${MYDIR}/../examples/py-schema-validation/py-schema-validation.py"}")" SEMN_VALIDATOR="$(realpath "${4:-"${MYDIR}/../examples/py-semantic-validation/py-semantic-validation.py"}")" IS_GIT=$(test -d "${MYDIR}/../.git" && printf '1' || printf '0') function usage() { cat <&2 exit 2 fi LOCKFILE="$(realpath "${0}").lock" touch "${LOCKFILE}" exec 42< "${LOCKFILE}" $(which flock) -x -n 42 || { printf '%s\n' "Could not aquire file lock for ${0}. Already running instance?" >&2; exit 3; } function sighandler() { printf '%s\n' ' Received shutdown SIGNAL, bye' >&2 $(which pkill) -P $$ wait rm -f "${LOCKFILE}" exit 4 } trap sighandler SIGINT SIGTERM if [ ! -x "${nDPId_test_EXEC}" ]; then usage printf '\n%s\n' "Required nDPId-test executable does not exist; ${nDPId_test_EXEC}" exit 5 fi $(which nc) -h |& head -n1 | grep -qoE '^OpenBSD netcat' || { printf '%s\n' "$(which nc): OpenBSD netcat (nc) version required!" >&2; printf '%s\n' "$(which nc): Your version: $(nc -h |& head -n1)" >&2; exit 6; } nDPI_TEST_DIR="$(realpath "${nDPI_SOURCE_ROOT}/tests/pcap")" cd "${nDPI_TEST_DIR}" cat </dev/null if [ $? -ne 1 ]; then printf '%s\n' "nDPId-test: ${nDPId_test_EXEC} seems to be an invalid executable" exit 7 fi for pcap_file in *.pcap *.pcapng *.cap; do printf '%s\n' "-- CMD: ${nDPId_test_EXEC} $(realpath "${pcap_file}")" \ >"/tmp/nDPId-test-stderr/${pcap_file}.out" printf '%s\n' "-- OUT: ${MYDIR}/results/${pcap_file}.out" \ >>"/tmp/nDPId-test-stderr/${pcap_file}.out" printf "%-${LINE_SPACES}s\t" "${pcap_file}" ${nDPId_test_EXEC} "${pcap_file}" \ >"/tmp/nDPId-test-stdout/${pcap_file}.out.new" \ 2>>"/tmp/nDPId-test-stderr/${pcap_file}.out" nDPId_test_RETVAL=$? if [ ${nDPId_test_RETVAL} -eq 0 ]; then if [ ! -r "${MYDIR}/results/${pcap_file}.out" ]; then printf '%s\n' '[NEW]' test ${IS_GIT} -eq 1 && \ mv -v "/tmp/nDPId-test-stdout/${pcap_file}.out.new" \ "${MYDIR}/results/${pcap_file}.out" TESTS_FAILED=$((TESTS_FAILED + 1)) elif diff -u0 "${MYDIR}/results/${pcap_file}.out" \ "/tmp/nDPId-test-stdout/${pcap_file}.out.new" >/dev/null; then printf '%s\n' '[OK]' rm -f "/tmp/nDPId-test-stdout/${pcap_file}.out.new" else printf '%s\n' '[DIFF]' diff -u0 "${MYDIR}/results/${pcap_file}.out" \ "/tmp/nDPId-test-stdout/${pcap_file}.out.new" test ${IS_GIT} -eq 1 && \ mv -v "/tmp/nDPId-test-stdout/${pcap_file}.out.new" \ "${MYDIR}/results/${pcap_file}.out" TESTS_FAILED=$((TESTS_FAILED + 1)) fi else printf '%s\n' '[FAIL]' printf '%s\n' '----------------------------------------' printf '%s\n' "-- STDERR of ${pcap_file}: /tmp/nDPId-test-stderr/${pcap_file}.out" cat "/tmp/nDPId-test-stderr/${pcap_file}.out" TESTS_FAILED=$((TESTS_FAILED + 1)) fi done function validate_results() { prefix_str="${1}" pcap_file="$(basename ${2})" result_file="${3}" validator_exec="${4}" printf "%s %-$((${LINE_SPACES} - ${#prefix_str}))s\t" "${prefix_str}" "${pcap_file}" printf '%s\n' "-- ${prefix_str}" >>"/tmp/nDPId-test-stderr/${pcap_file}.out" if [ ! -r "${result_file}" ]; then printf ' %s\n' '[MISSING]' return 1 fi # Note that the grep command is required as we generate a summary in the results file. cat "${result_file}" | grep -vE '^~~.*$' | ${NETCAT_EXEC} & nc_pid=$! printf '%s\n' "-- ${validator_exec}" >>"/tmp/nDPId-test-stderr/${pcap_file}.out" ${validator_exec} 2>>"/tmp/nDPId-test-stderr/${pcap_file}.out" if [ $? -eq 0 ]; then printf ' %s\n' '[OK]' else printf ' %s\n' '[FAIL]' printf '%s\n' '----------------------------------------' printf '%s\n' "-- STDERR of ${pcap_file}: /tmp/nDPId-test-stderr/${pcap_file}.out" cat "/tmp/nDPId-test-stderr/${pcap_file}.out" return 1 fi kill -SIGTERM ${nc_pid} 2>/dev/null wait ${nc_pid} 2>/dev/null return 0 } cat <