#!/bin/bash # Defaults. ROOT_TEST_GROUPS="xdg-desktop-icon xdg-desktop-menu xdg-icon-resource xdg-mime xdg-utils-usecases" USER_TEST_GROUPS="$ROOT_TEST_GROUPS xdg-email xdg-open xdg-screensaver" usage() { cat << _ENDUSAGE_ Usage: $0 [-iIcChRSd:p:f:a] [test|testgroup] [...] Options: [-h] Show this message and exit. [-I|-i] Turn off/on interactive tests. Default: on (overrides XDG_TEST_NO_INTERACTIVE) [-C|-c] Turn off/on deletion of tempfiles. Default: on (overrides XDG_TEST_DONT_CLEANUP) [-R] Turn off su to root tests. You will not be prompted for the root password at the beginning of the testrun. [-S] Use sudo instead of su. [-a] Run all tests. (i.e xdg-*/) Has no effect if tests are specified explicitly. [-d dir] Set XDG_TEST_DIR to dir [-p path] Reset PATH to path. Recommended for internal use only. [-f pid] RESERVED -- state flag for self reference. DON'T USE. Arguments: After options, all arguments correspond to tests to run. The default is to run all tests, which consist of all files matching 'xdg-*/t.*'. Supplied testgroups can be a list of directories or a list of individual tests. _ENDUSAGE_ exit 1 } MYARGS="$@" if [ `whoami` == root ] ; then XDG_TEST_DONT_SU="set" DEFAULT_TEST_GROUPS="$ROOT_TEST_GROUPS" RUNNING_AS="root" else DEFAULT_TEST_GROUPS="$USER_TEST_GROUPS" RUNNING_AS="normal" fi ## Read options while getopts "iIcChRSf:d:p:a" opt; do case $opt in I ) export XDG_TEST_NO_INTERACTIVE="set" ;; i ) unset XDG_TEST_NO_INTERACTIVE ;; C ) export XDG_TEST_DONT_CLEANUP="set" ;; c ) unset XDG_TEST_DONT_CLEANUP ;; R ) XDG_TEST_DONT_SU="set" ;; S ) XDG_TEST_USE_SUDO="set" ;; f ) XDG_TEST_SELF_LAUNCH="$OPTARG" ;; d ) export XDG_TEST_DIR="$OPTARG" ;; p ) export PATH="$OPTARG" ;; a ) DEFAULT_TEST_GROUPS=`ls -d $XDG_TEST_DIR/xdg-*` ;; h ) usage ;; \? ) usage ;; esac done shift $(($OPTIND - 1)) ## Set up prerequisites if [ -z "$XDG_TEST_DIR" ] ; then export XDG_TEST_DIR="$PWD" echo "WARNING: guessed XDG_TEST_DIR to be $XDG_TEST_DIR" fi if ! command -v xdg-mime >/dev/null && [ -d "$XDG_TEST_DIR/../scripts" ] ; then export PATH="$PATH:$XDG_TEST_DIR/../scripts" echo "WARNING: modified PATH to add '$XDG_TEST_DIR/../scripts'" fi ## Read test groups if [ $# -eq 0 ] ; then TEST_GROUPS="$DEFAULT_TEST_GROUPS" else TEST_GROUPS="$@" fi TEST_FILES=`find $TEST_GROUPS -name 't.*[^~]' | sort` declare -i PASS=0 declare -i FAILCOUNT=0 declare -i TOTAL=0 declare -i ATTEMPT=0 TEST_LOG="$XDG_TEST_DIR/xdg-test.log" export USING_TEST_RUNNER="true" for MY_TEST_FILE in $TEST_FILES; do . "$MY_TEST_FILE" done if [ -z "$XDG_TEST_SELF_LAUNCH" ] ; then # not self launched test -d "$XDG_TEST_DIR/tmp" || mkdir "$XDG_TEST_DIR/tmp" touch "$XDG_TEST_DIR/tmp/shortid" chmod 666 "$XDG_TEST_DIR/tmp/shortid" if [ "$RUNNING_AS" == root -a -z "$*" ] ; then echo "WARNING: Tests are incomplete unless run as a normal (non-root) user." echo "The test runner will SU as needed to run root cases." fi echo "======================================================" >> "$TEST_LOG" echo "[`date`] TEST RUN START: $*" >> "$TEST_LOG" "$XDG_TEST_DIR/include/system_info" >>"$TEST_LOG" if [ -z "$XDG_TEST_DONT_SU" ] ; then if [ -z "$XDG_TEST_USE_SUDO" ] ; then SUCMD= echo "Running su for system tests. (Use testrun -S to use sudo instead)" echo "Please enter the root password when requested." else SUCMD=`command -v sudo` echo "Running ${SUCMD-su} for system tests." echo "Please enter an appropriate password if requested." fi # Note if sudo is not found, $SUCMD will be blank, so run su directly. # We cannot assume su works since systems like Ubuntu require sudo # Yet, systems like Debian do not ship with sudo by default. $SUCMD su - -c "cd $PWD && XDG_UTILS_DEBUG_LEVEL=$XDG_UTILS_DEBUG_LEVEL $0 -f $$ -d '$XDG_TEST_DIR' -p '$PATH' $MYARGS" fi TEST_STATUS_FILE="$XDG_TEST_DIR/tmp/xdgtest_status-$$" USERCLASS="normal user" else TEST_STATUS_FILE="$XDG_TEST_DIR/tmp/xdgtest_status-$XDG_TEST_SELF_LAUNCH" USERCLASS="root" fi echo "[`date`] ---- $USERCLASS run start: $*" >> "$TEST_LOG" #echo "TEST_LIST: $TEST_LIST" for t in $TEST_LIST; do TOTAL=$((TOTAL + 1 )) ATTEMPT=$((ATTEMPT + 1 )) echo -n "$t: " test_setup # Run test - subshell is necessary to keep things contained. ( "$t" ) >> "$TEST_LOG" CODE="$?" test_cleanup # Report result case "$CODE" in 0 ) PASS=$((PASS + 1)) RESULT=PASS ;; 1 ) RESULT=FAIL FAILCOUNT=$((FAILCOUNT +1)) ;; 5 ) RESULT=UNTESTED TOTAL=$((TOTAL - 1 )) ## HACK: we don't want to count tests that don't run. ;; 7 ) RESULT=NORESULT ;; 10 ) RESULT=WARN ;; * ) RESULT="UNKNOWN($CODE)";; esac echo "$RESULT" test "$RESULT" == FAIL && echo "" >> "$TEST_LOG" done echo -n "[`date`] ---- " >> "$TEST_LOG" echo "$USERCLASS run end: $FAILCOUNT tests failed, $PASS of $TOTAL tests passed. ($ATTEMPT attempted)" | tee -a "$TEST_LOG" if [ -z "$XDG_TEST_SELF_LAUNCH" ] ; then # not su'd if [ -f "$TEST_STATUS_FILE" ] ; then RFAIL=`grep 'FAIL' "$TEST_STATUS_FILE" | cut -d ':' -f2` RPASS=`grep 'PASS' "$TEST_STATUS_FILE" | cut -d ':' -f2` RTOTAL=`grep 'TOTAL' "$TEST_STATUS_FILE" | cut -d ':' -f2` RATTEMPT=`grep 'ATTEMPT' "$TEST_STATUS_FILE" | cut -d ':' -f2` rm -f "$TEST_STATUS_FILE" fi GFAIL=$(( $FAILCOUNT + ${RFAIL-0} )) GPASS=$(( $PASS + ${RPASS-0} )) GTOTAL=$(( $TOTAL + ${RTOTAL-0} )) GATTEMPT=$(( $ATTEMPT + ${RATTEMPT-0} )) echo -n "[`date`] TEST RUN END: $* - " >> "$TEST_LOG" echo -n "TOTAL: " echo "$GFAIL tests failed, $GPASS of $GTOTAL tests passed. ($GATTEMPT attempted)" | tee -a "$TEST_LOG" if [ $(( $GTOTAL - $GPASS )) -gt 0 ]; then EC=1 echo "NOT OK! -- See $TEST_LOG for details." else EC=0 echo "ok" fi if [ -z "$*" -a -z "$XDG_TEST_NO_INTERACTIVE" ] ; then echo "Please consider submitting your test report to" echo "http://portland.freedesktop.org/testreport.html" echo "" fi exit "$EC" else ## Running su'd. save results. echo "FAIL:$FAILCOUNT" > $TEST_STATUS_FILE echo "PASS:$PASS" >> $TEST_STATUS_FILE echo "TOTAL:$TOTAL" >> $TEST_STATUS_FILE echo "ATTEMPT:$ATTEMPT" >> $TEST_STATUS_FILE if [ $(( $TOTAL - $PASS)) -gt 0 ] ; then exit -1 else exit 0 fi fi