blob: 6916046f666b215ccabe1a477934cefb11565df4 [file] [log] [blame]
#!/system/bin/sh
#
# Copyright 2015 Nest Labs, Inc. All rights reserved.
#
# This script essentially ports the test cases defined in
# test/CMakeLists.txt (which use CTest as the test runner).
###
### Detect where the tests are installed,
### typically /data/nativetest/google-gflags
###
TEST_ROOT="$(dirname $0)"
grep -vE "^/" "$TEST_ROOT" &> /dev/null
if [ $? -eq 0 ] ; then
TEST_ROOT="$(pwd)/${TEST_ROOT}"
fi
###
### 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 os path separator, used to make copy/paste with CMakeLists.txt work
SLASH="/"
# 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}" google-gflags-unit-tests-log.XXXXXXXX)
# A temporary file, usually used for staging raw program output for grep
TMPFILE=$(mktemp --tmpdir="${TMPDIR}" google-gflags-unit-tests-tmp.XXXXXXXX)
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
}
###
### TEST CASES
###
### These are mostly taken from test/CMakeLists.txt
###
cd "$TEST_ROOT"
# Clear out the log file, add time
date > $LOGFILE
echo LOGFILE=$LOGFILE | tee -a "$LOGFILE"
echo TMPFILE=$TMPFILE | tee -a "$LOGFILE"
echo "SETTING ENVIRONMENT VARIABLES:" >> $LOGFILE
for N in FLAGS_undefok=foo,bar FLAGS_weirdo="" FLAGS_version="true" FLAGS_help="false" ; do
echo "$N" >> $LOGFILE
export $N
done
# Test this script
run_test "the_truth" 0 "" "" true
run_test "the_lie" 1 "" "" false
run_test "the_word" "" "really unlikely" "" echo "really unlikely"
# Make sure the --help output doesn't print the stripped text
run_test "strip_flags_help" 1 "" "This text should be stripped out" gflags_strip_flags_test --help
# Make sure the stripped text isn't in the binary at all
strings "${TEST_BIN}/gflags_strip_flags_test" | grep "This text should be stripped out"
if [ $? -eq 0 ] ; then
echo "strip_flags_binary: fail (poison string detected)"
else
echo "strip_flags_binary: pass"
fi
# First, just make sure the gflags_unittest works as-is
run_test "unittest" 0 "" "" gflags_unittest --test_tmpdir="${TMPDIR}"
# --help should show all flags, including flags from gflags_reporting
run_test "help-reporting" 1 "${SLASH}gflags_reporting.cc:" "" gflags_unittest --help
# Make sure that --help prints even very long helpstrings.
run_test long-helpstring 1 "end of a long helpstring" "" gflags_unittest --help
# Make sure --help reflects flag changes made before flag-parsing
run_test changed_bool1 1 "-changed_bool1 (changed) type: bool default: true" "" gflags_unittest --help
run_test changed_bool2 1 "-changed_bool2 (changed) type: bool default: false currently: true" "" gflags_unittest --help
# And on the command-line, too
run_test changeable_string_var 1 "-changeable_string_var () type: string default: \"1\" currently: \"2\"" "" gflags_unittest --changeable_string_var 2 --help
# --nohelp and --help=false should be as if we didn't say anything
run_test nohelp 0 "PASS" "" gflags_unittest --nohelp
run_test help=false 0 "PASS" "" gflags_unittest --help=false
# --helpfull is the same as help
run_test helpfull 1 "${SLASH}gflags_reporting.cc:" "" gflags_unittest --helpfull
# --helpshort should show only flags from the gflags_unittest itself
run_test helpshort 1 "${SLASH}gflags_unittest.cc:" "${SLASH}gflags_reporting.cc:" gflags_unittest --helpshort
# --helpshort should show the tldflag we created in the gflags_unittest dir
run_test helpshort-tldflag1 1 "tldflag1" "${SLASH}google.cc:" gflags_unittest --helpshort
run_test helpshort-tldflag2 1 "tldflag2" "${SLASH}google.cc:" gflags_unittest --helpshort
# --helpshort should work if the main source file is suffixed with [_-]main
run_test helpshort-main 1 "${SLASH}gflags_unittest-main.cc:" "${SLASH}gflags_reporting.cc:" gflags_unittest-main --helpshort
run_test helpshort_main 1 "${SLASH}gflags_unittest_main.cc:" "${SLASH}gflags_reporting.cc:" gflags_unittest_main --helpshort
# --helpon needs an argument
run_test helpon 1 "'--helpon' is missing its argument; flag description: show help on" "" gflags_unittest --helpon
# --helpon argument indicates what file we'll show args from
run_test helpon=gflags 1 "${SLASH}gflags.cc:" "${SLASH}gflags_unittest.cc:" gflags_unittest --helpon=gflags
# another way of specifying the argument
run_test helpon_gflags 1 "${SLASH}gflags.cc:" "${SLASH}gflags_unittest.cc:" gflags_unittest --helpon gflags
# test another argument
run_test helpon=gflags_unittest 1 "${SLASH}gflags_unittest.cc:" "${SLASH}gflags.cc:" gflags_unittest --helpon=gflags_unittest
# helpmatch is like helpon but takes substrings
run_test helpmatch_reporting 1 "${SLASH}gflags_reporting.cc:" "${SLASH}gflags_unittest.cc:" gflags_unittest -helpmatch reporting
run_test helpmatch=unittest 1 "${SLASH}gflags_unittest.cc:" "${SLASH}gflags.cc:" gflags_unittest -helpmatch=unittest
# if no flags are found with helpmatch or helpon, suggest --help
run_test helpmatch=nosuchsubstring 1 "No modules matched" "${SLASH}gflags_unittest.cc:" gflags_unittest -helpmatch=nosuchsubstring
run_test helpon=nosuchmodule 1 "No modules matched" "${SLASH}gflags_unittest.cc:" gflags_unittest -helpon=nosuchmodule
# helppackage shows all the flags in the same dir as this unittest
# --help should show all flags, including flags from google.cc
run_test helppackage 1 "${SLASH}gflags_reporting.cc:" "" gflags_unittest --helppackage
# xml!
run_test helpxml 1 "${SLASH}gflags_unittest.cc</file>" "${SLASH}gflags_unittest.cc:" gflags_unittest --helpxml
# just print the version info and exit
run_test version-1 0 "gflags_unittest" "${SLASH}gflags_unittest.cc:" gflags_unittest --version
run_test version-2 0 "version test_version" "${SLASH}gflags_unittest.cc:" gflags_unittest --version
# --undefok is a fun flag...
run_test undefok-1 1 "unknown command line flag 'foo'" "" gflags_unittest --undefok= --foo --unused_bool
run_test undefok-2 0 "PASS" "" gflags_unittest --undefok=foo --foo --unused_bool
# If you say foo is ok to be undefined, we'll accept --nofoo as well
run_test undefok-3 0 "PASS" "" gflags_unittest --undefok=foo --nofoo --unused_bool
# It's ok if the foo is in the middle
run_test undefok-4 0 "PASS" "" gflags_unittest --undefok=fee,fi,foo,fum --foo --unused_bool
# But the spelling has to be just right...
run_test undefok-5 1 "unknown command line flag 'foo'" "" gflags_unittest --undefok=fo --foo --unused_bool
run_test undefok-6 1 "unknown command line flag 'foo'" "" gflags_unittest --undefok=foot --foo --unused_bool
# See if we can successfully load our flags from the flagfile
run_test flagfile.1 0 "gflags_unittest" "${SLASH}gflags_unittest.cc:" gflags_unittest "--flagfile=data/flagfile.1"
run_test flagfile.2 0 "PASS" "" gflags_unittest "--flagfile=data/flagfile.2"
run_test flagfile.3 0 "PASS" "" gflags_unittest "--flagfile=data/flagfile.3"
# Also try to load flags from the environment
run_test fromenv=version 0 "gflags_unittest" "${SLASH}gflags_unittest.cc:" gflags_unittest --fromenv=version
run_test tryfromenv=version 0 "gflags_unittest" "${SLASH}gflags_unittest.cc:" gflags_unittest --tryfromenv=version
run_test fromenv=help 0 "PASS" "" gflags_unittest --fromenv=help
run_test tryfromenv=help 0 "PASS" "" gflags_unittest --tryfromenv=help
run_test fromenv=helpfull 1 "helpfull not found in environment" "" gflags_unittest --fromenv=helpfull
run_test tryfromenv=helpfull 0 "PASS" "" gflags_unittest --tryfromenv=helpfull
run_test tryfromenv=undefok 0 "PASS" "" gflags_unittest --tryfromenv=undefok --foo
run_test tryfromenv=weirdo 1 "unknown command line flag" "" gflags_unittest --tryfromenv=weirdo
run_test tryfromenv-multiple 0 "gflags_unittest" "${SLASH}gflags_unittest.cc:" gflags_unittest --tryfromenv=test_bool,version,unused_bool
run_test fromenv=test_bool 1 "not found in environment" "" gflags_unittest --fromenv=test_bool
run_test fromenv=test_bool-ok 1 "unknown command line flag" "" gflags_unittest --fromenv=test_bool,ok
# Here, the --version overrides the fromenv
run_test version-overrides-fromenv 0 "gflags_unittest" "${SLASH}gflags_unittest.cc:" gflags_unittest --fromenv=test_bool,version,ok
# Make sure -- by itself stops argv processing
run_test dashdash 0 "PASS" "" gflags_unittest -- --help
# And we should die if the flag value doesn't pass the validator
run_test always_fail 1 "ERROR: failed validation of new value 'true' for flag 'always_fail'" "" gflags_unittest --always_fail
run_test gflags_declare 0 "Hello gflags!" "" gflags_declare_test --message "Hello gflags!"
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