| #!/system/bin/sh |
| # |
| # Copyright 2015 Nest Labs, Inc. All rights reserved. |
| |
| if [ -z "$PACKAGE" ] ; then |
| PACKAGE="faux-folly-tests" |
| fi |
| if [ -z "$TEST_ROOT" ] ; then |
| TEST_ROOT="$(dirname $0)" |
| grep -vE "^/" "$TEST_ROOT" &> /dev/null |
| if [ $? -eq 0 ] ; then |
| TEST_ROOT="$(pwd)/${TEST_ROOT}" |
| fi |
| fi |
| THIS_SCRIPT="$(basename $0)" |
| |
| ### |
| ### GLOBAL VARIABLES |
| ### |
| ### only export variables that mutate |
| ### |
| |
| # Increment when a test passes |
| export GLOBAL_PASS=0 |
| # Increment when a test fails |
| export GLOBAL_FAIL=0 |
| # The directory where helper test programs are installed |
| TEST_BIN="${TEST_ROOT}/bin" |
| # The directory where helper test data is installed |
| TEST_DATA="${TEST_ROOT}/data" |
| # The temporary directory where raw program output is placed |
| TMPDIR=/storage |
| # The log file with all raw program output |
| LOGFILE=$(mktemp --tmpdir="${TMPDIR}" ${PACKAGE}-log.XXXXXXXX) |
| # A temporary file, usually used for staging raw program output for grep |
| TMPFILE=$(mktemp --tmpdir="${TMPDIR}" ${PACKAGE}-tmp.XXXXXXXX) |
| |
| # The scripts need their PATH set, too |
| export PATH="${TEST_BIN}:${PATH}" |
| |
| # run_test |
| # |
| # This is a /bin/sh port of add_gflags_test that is implemented by |
| # cmake/utils.cmake and cmake/execute_test.cmake |
| # |
| # Usage: run_test <test-name> <expected-return-code> <expected-text-output> <unexpected-text-output> <cmd> [args...] |
| # |
| # test-name: A symbolic name for the test for logging |
| # |
| # expected-return-code: the number passed back to the operating system. default: 0 |
| # if a blank string is given. |
| # |
| # expected-text-output: if a non-empty string, it is expected that the command will |
| # output this string. It must be seen in order to pass. |
| # |
| # unexpected-text-output: if a non-empty string, it is expected that the command |
| # will NOT output this string. If it is seen, the test will fail. |
| # |
| # cmd: executable to run (full path or in $PATH) |
| # |
| # args: all arguments that need to be passed on to the executable. |
| # |
| run_test() |
| { |
| TEST_NAME="$1" |
| shift |
| EXPECTED_RC="$1" |
| shift |
| EXPECTED_OUTPUT="$1" |
| shift |
| UNEXPECTED_OUTPUT="$1" |
| shift |
| |
| if [ $# -eq 0 ] ; then |
| GLOBAL_RETURN_CODE=1 |
| echo "FATAL ERROR: invalid arguments passed to run_test for test='$TEST_NAME'" |
| return 1 |
| fi |
| |
| if [ -z "$EXPECTED_RC" ] ; then |
| EXPECTED_RC="0" |
| fi |
| |
| VERDICT="pass" |
| REASON="default" |
| |
| echo "RUNNING TEST '${TEST_NAME}' >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" > "$TMPFILE" |
| echo "CMDLINE: $@" >> "$TMPFILE" |
| "$@" &>> "$TMPFILE" |
| RC=$? |
| echo "RC=$RC" >> "$TMPFILE" |
| echo "END OF TEST '${TEST_NAME}' <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" >> "$TMPFILE" |
| |
| EXPECTED_FOUND=1 |
| UNEXPECTED_FOUND=0 |
| |
| if [ -n "$EXPECTED_OUTPUT" ] ; then |
| grep -- "$EXPECTED_OUTPUT" "$TMPFILE" &> /dev/null |
| if [ $? -ne 0 ] ; then |
| EXPECTED_FOUND=0 |
| fi |
| fi |
| |
| if [ -n "$UNEXPECTED_OUTPUT" ] ; then |
| grep -- "$UNEXPECTED_OUTPUT" "$TMPFILE" &> /dev/null |
| if [ $? -eq 0 ] ; then |
| UNEXPECTED_FOUND=1 |
| fi |
| fi |
| |
| if [ "$RC" != "$EXPECTED_RC" ] ; then |
| VERDICT="fail" |
| REASON="unexpected return code (got ${RC}, expected ${EXPECTED_RC})" |
| elif [ "$EXPECTED_FOUND" = "0" ] ; then |
| VERDICT="fail" |
| REASON="missing expected output, expected '${EXPECTED_OUTPUT}', see '$LOGFILE'" |
| elif [ "$UNEXPECTED_FOUND" = "1" ] ; then |
| VERDICT="fail" |
| REASON="Unexpected output detected: '${UNEXPECTED_OUTPUT}', see '$LOGFILE'" |
| fi |
| |
| cat "$TMPFILE" >> "$LOGFILE" |
| |
| if [ "$VERDICT" = "pass" ] ; then |
| echo "${TEST_NAME}: pass" |
| GLOBAL_PASS=$(($GLOBAL_PASS + 1)) |
| return 0 |
| else |
| echo "${TEST_NAME}: fail ($REASON)" |
| GLOBAL_FAIL=$(($GLOBAL_FAIL + 1)) |
| return 1 |
| fi |
| } |
| |
| # Tests must be executed from here: |
| cd "$TEST_ROOT" |
| |
| ### |
| ### TEST CASES |
| ### |
| |
| # Test this script |
| run_test "the_truth" 0 "" "" true |
| run_test "the_lie" 1 "" "" false |
| run_test "the_word" "" "really unlikely" "" echo "really unlikely" |
| |
| for T in "${TEST_BIN}"/* ; do |
| NAME=$(basename "${T}") |
| if [ "x${NAME}" == "x${THIS_SCRIPT}" ] ; then |
| continue |
| fi |
| if [ ! -x "${T}" ] ; then |
| echo "Skipping '${NAME}' because it doesn't have execute permission" |
| continue |
| fi |
| if [ ! -f "${T}" ] ; then |
| echo "Skipping '${NAME}' because it is not a file" |
| continue |
| fi |
| run_test "$NAME" 0 "" "" "$T" |
| done |
| |
| ### |
| ### RESULTS |
| ### |
| |
| if [ $GLOBAL_FAIL -ne 0 ] ; then |
| RETURN_CODE=1 |
| else |
| RETURN_CODE=0 |
| fi |
| TOTAL_TESTS=$(($GLOBAL_PASS + $GLOBAL_FAIL)) |
| |
| echo "${GLOBAL_PASS}/${TOTAL_TESTS} passed. See '$LOGFILE'" |
| rm "$TMPFILE" |
| |
| exit $RETURN_CODE |