#! /bin/bash unset NO_COLOR top_srcdir="@abssrcdir@" export top_srcdir top_srcdir_parent=`dirname ${top_srcdir}` export top_srcdir_parent srcdir="@abssrcdir@/test" export srcdir # The top build directory, derived from the path to this script. top_builddir=`dirname $0` export top_builddir builddir=`pwd -P` export builddir test_dir="@abssrcdir@/test" export test_dir # Let the tests know whether bzip is supported or not. BZIP2_SUPPORT="@BZIP2_SUPPORT@" export BZIP2_SUPPORT BZIP2_CMD="@BZIP2_CMD@" export BZIP2_CMD XZ_CMD="@XZ_CMD@" export XZ_CMD TSHARK_CMD="@TSHARK_CMD@" export TSHARK_CMD LIBARCHIVE_LIBS="@LIBARCHIVE_LIBS@" export LIBARCHIVE_LIBS HOME="${top_builddir}/test" export HOME # The full path of the test case test_file=$1 # The base name of the test case test_file_base=`basename $1` # The current test number for shell based tests. test_num=0 test_hash="" lnav_test="${top_builddir}/src/lnav-test" export lnav_test lnav="${top_builddir}/src/lnav" export lnav LNAV_LOG_PATH="${top_builddir}/test/test.log" export LNAV_LOG_PATH SFTP_TEST_URL="@SFTP_TEST_URL@" export SFTP_TEST_URL HAVE_SQLITE3_VALUE_SUBTYPE="@HAVE_SQLITE3_VALUE_SUBTYPE@" export HAVE_SQLITE3_VALUE_SUBTYPE HAVE_SQLITE3_ERROR_OFFSET="@HAVE_SQLITE3_ERROR_OFFSET@" export HAVE_SQLITE3_ERROR_OFFSET ## BEGIN Functions LAST_TEST="" LAST_CAP_TEST=() has_errors="" # # Run a test case and capture its standard out and standard err. # # Usage: run_test [ ...] # # Example: # # To run rktimes and capture all of its stdio output: # # run_test rktimes -V # run_test() { printf "%s \033[0;35m=============================================================\033[0m\n" $(date -Iseconds) LAST_TEST=("test: $@") echo "${LAST_TEST[@]}" export test_num=`expr ${test_num} \+ 1` "$@" > ${test_file_base}_${test_num}.tmp 2> ${test_file_base}_${test_num}.err } run_cap_test() { LAST_CAP_TEST=("test: $@") local full_cmd=$(echo "${LAST_CAP_TEST[@]}" | sed -e "s;${test_dir};{test_dir};g" -e "s;${top_srcdir};{top_srcdir};g") export test_hash=$(echo "${full_cmd}" | shasum | cut -f 1 -d ' ') echo "${full_cmd}" > ${test_file_base}_${test_hash}.cmd "$@" > ${test_file_base}_${test_hash}.out 2> ${test_file_base}_${test_hash}.err sed -ibak \ -e "s;${test_dir};{test_dir};g" \ -e "s;${builddir};{test_dir};g" \ -e "s;${top_srcdir};{top_srcdir};g" \ -e "s;${top_srcdir_parent};{top_srcdir_parent};g" \ -e "s;lnav-user-${UID}-work;lnav-user-{uid}-work;g" \ ${test_file_base}_${test_hash}.out echo printf "%s \033[0;35m=============================================================\033[0m\n" $(date -Iseconds) printf '\033[0;35mCommand\033[0m: %s\n' "${full_cmd}" printf '\033[0;32mBEGIN\033[0m %s\n' "${test_file_base}_${test_hash}.out" cat "${test_file_base}_${test_hash}.out" printf '\033[0;32mEND\033[0m %s\n' "${test_file_base}_${test_hash}.out" if test -f ${srcdir}/expected/${test_file_base}_${test_hash}.out; then diff -w -u \ ${srcdir}/expected/${test_file_base}_${test_hash}.out \ ${test_file_base}_${test_hash}.out \ > ${test_file_base}_${test_hash}.diff if test $? -ne 0; then echo OUT: "${full_cmd}" cat ${test_file_base}_${test_hash}.diff echo "FAIL! EXPECTED OUT DIFF" export has_errors="yes" fi else echo "FAIL! EXPECTED OUT MISSING -- ${srcdir}/expected/${test_file_base}_${test_hash}.out" export has_errors="yes" fi sed -ibak -E \ -e "s;${test_dir};{test_dir};g" \ -e "s;${builddir};{builddir};g" \ -e "s;${top_srcdir};{top_srcdir};g" \ -e "s;lnav-user-${UID}-work;lnav-user-{uid}-work;g" \ -e 's;"errorId":".+";;g' \ ${test_file_base}_${test_hash}.err printf '\033[0;31mBEGIN\033[0m %s\n' "${test_file_base}_${test_hash}.err" cat "${test_file_base}_${test_hash}.err" printf '\033[0;31mEND\033[0m %s\n' "${test_file_base}_${test_hash}.err" if test -f ${srcdir}/expected/${test_file_base}_${test_hash}.err; then diff -w -u ${srcdir}/expected/${test_file_base}_${test_hash}.err \ ${test_file_base}_${test_hash}.err \ > ${test_file_base}_${test_hash}.err.diff if test $? -ne 0; then echo ERR: "${full_cmd}" cat ${test_file_base}_${test_hash}.err.diff echo "FAIL! EXPECTED ERR DIFF" export has_errors="yes" fi else echo "FAIL! EXPECTED ERR MISSING" export has_errors="yes" fi } # # Check the output generated by a run_test() call. # # Usage: check_output {Expected output on stdin} # # Example: # # To check the output of 'rktimes -V' and print out 'Unable to get version?' # if the output doesn't match: # # run_test rktimes -V # check_output "Unable to get version?" < ${test_file_base}_${test_num}.diff if test $? -ne 0; then echo "${LAST_TEST[@]}" echo $1 cat ${test_file_base}_${test_num}.diff exit 1 fi } check_output_ws() { diff -u - ${test_file_base}_${test_num}.tmp > ${test_file_base}_${test_num}.diff if test $? -ne 0; then echo "${LAST_TEST[@]}" echo $1 cat ${test_file_base}_${test_num}.diff exit 1 fi } test_filename() { echo ${test_file_base}_${test_num}.tmp } test_err_filename() { echo ${test_file_base}_${test_num}.err } check_error_output() { sed -ibak \ -e "s;${test_dir};{test_dir};g" \ -e "s;${top_srcdir};{top_srcdir};g" \ ${test_file_base}_${test_num}.err diff -w -u - ${test_file_base}_${test_num}.err \ > ${test_file_base}_${test_num}.err.diff if test $? -ne 0; then echo "${LAST_TEST[@]}" echo $1 cat ${test_file_base}_${test_num}.err.diff exit 1 fi } # # Grep for a string in the output generated by a run_test() call. # # Usage: grep_output_for # # Example: # # To check the output of 'cbhey -l' for 'IDL:Foobar:1.0' and print out # 'Unable to list supported interfaces?' if it is not found: # # run_test cbhey -l # grep_output_for "IDL:Foobar:1.0" "Unable to list supported interface?" # grep_output_for() { if grep -q $1 ${test_file_base}_${test_num}.tmp > /dev/null 2>&1; then : else echo "${test_file_base}_${test_num}.tmp: $2" exit 1 fi } on_error_log() { if test $? -ne 0; then echo $1 > /dev/stderr cat ${test_file_base}_${test_num}.tmp cat ${test_file_base}_${test_num}.err fi } on_error_fail_with() { if test $? -ne 0; then echo $1 > /dev/stderr cat ${test_file_base}_${test_num}.tmp cat ${test_file_base}_${test_num}.err exit 1 fi } ## END Functions # Finally, run the test... if test -x $1 && test `basename $1 .sh` == `basename $1`; then exec $* else # Shell script shift . ${test_file} fi cleanup() { if test "${has_errors}"x = "yes"x; then exit 1 fi } trap "cleanup" EXIT