Index: third_party/xdg-utils/tests/include/testassertions.sh |
=================================================================== |
--- third_party/xdg-utils/tests/include/testassertions.sh (revision 0) |
+++ third_party/xdg-utils/tests/include/testassertions.sh (revision 0) |
@@ -0,0 +1,379 @@ |
+# Adapted from |
+# shfuncs : test suite common shell functions |
+# which was shipped with the TET example code. |
+ |
+. "$XDG_TEST_DIR/include/testfuncs.sh" |
+ |
+## NOTE: Documentation is generated AUTOMATICALLY from this file |
+## Function usage must immediately follow function delcaration |
+ |
+assert_exit() { |
+# execute command (saving output) and check exit code |
+# Usage: assert_exit N command ... |
+# where N is a number or a literal 'N' (for non-zero) |
+# command can be an unquoted string, but be careful. |
+ EXPECT="$1" |
+ shift 1 |
+ |
+ # make sure nothing is hanging around from a prev. test. |
+ rm -f out.stdout out.stderr |
+ |
+ # $1 is command, $2 is expected exit code (0 or "N" for non-zero) |
+ ( "$@" > out.stdout 2> out.stderr ) |
+ CODE="$?" |
+ |
+ LASTCOMMAND="$*" |
+ |
+ if [ -z "$EXPECT" ]; then |
+ EXPECT=0; |
+ fi |
+ if [ "$EXPECT" = N -a "$CODE" -eq 0 ]; then |
+ test_fail "Command ($*) gave exit code $CODE, expected nonzero" |
+ elif [ "$EXPECT" != N ] && [ "$EXPECT" -ne "$CODE" ]; then |
+ test_fail "Command ($*) gave exit code $CODE, expected $EXPECT" |
+ fi |
+} |
+ |
+assert_interactive_notroot() { |
+ if [ `whoami` != 'root' ] ; then |
+ assert_interactive "$@" |
+ fi |
+} |
+ |
+assert_interactive() { |
+# Useage: |
+# assert_interactive {msg} [y|n|C|s varname] |
+# |
+# msg is the text to print. |
+# y -> expect y for [y/n] |
+# n -> expect n for [y/n] |
+# s -> save y or n into varname. Then, (presumably) $varname can be |
+# given in place of y or n in subsequent calls to assert_interactive |
+# C -> cleanup msg. Always print "msg [enter to continue]" despite test failure. |
+# if no argument is given after msg, print "msg [enter to continue]" |
+ |
+ query=$1 |
+ expect=$2 |
+# It seems valuable to see what happens even if the test has failed. |
+# (eg fail on stdout.) |
+ if [ "$TEST_STATUS" = 'FAIL' -a "$expect" != C ] ; then |
+ ## Don't waste user's time if test has already failed. |
+ test_infoline "Test has already failed. Not bothering to ask '$query'" |
+ return |
+ fi |
+ |
+ if [ ! -z "$XDG_TEST_NO_INTERACTIVE" ] ; then |
+ test_infoline "Assumed '$query' is '$expect'" |
+ return |
+ fi |
+ |
+ if [ ! -z "$expect" -a "$expect" != C ] ; then |
+ if [ "$expect" != y -a "$expect" != n -a "$expect" != s -a "$expect" != C ] ; then |
+ echo "TEST SYNTAX ERROR: interactive assertions require one of (y,n,s,C) as choices. (found '$expect')" >&2 |
+ exit 255 |
+ fi |
+ unset result |
+ while [ "$result" != y -a "$result" != n ] ; do |
+ echo -ne "\n\t$query [y/n]: " >&2 |
+ read result |
+ done |
+ |
+ if [ "$expect" = s ] ; then |
+ if [ -z "$3" ] ; then |
+ echo "TEST SYNTAX ERROR: 's' requires a variable name" |
+ exit 255 |
+ fi |
+ eval "$3=$result" |
+ elif [ "$result" != "$expect" ] ; then |
+ test_fail "User indicated '$result' instead of '$expect' in response to '$query'" |
+ fi |
+ else |
+ echo -ne "\n\t$query [enter to continue] " >&2 |
+ read result |
+ fi |
+} |
+ |
+ |
+assert_file_in_path() { |
+# Assert that some file is present in a path. |
+# |
+# Usage: |
+# assert_file_in_path FILENAME PATH |
+# where FILE is the exact name of the file and |
+# PATH is a ':' separated list of directories |
+ search_dirs=`echo "$2" | tr ':' ' '` |
+ found_files=`find $search_dirs -name "$1" 2>/dev/null` |
+ |
+ if [ -z "$found_files" ] ; then |
+ test_fail "Did not find '$1' in '$2'" |
+ fi |
+} |
+ |
+assert_file_not_in_path() { |
+# Assert the some file is NOT present in a path. |
+# Opposite of 'assert_file_in_path' |
+ search_dirs=`echo "$2" | tr ':' ' '` |
+ found_files=`find $search_dirs -name "$1" 2>/dev/null` |
+ |
+ if [ ! -z "$found_files" ] ; then |
+ test_fail "Found '$found_files' in $2" |
+ fi |
+} |
+ |
+ |
+assert_file() { |
+# Assert the existance of an exact filename |
+# Usage: assert_file FILE |
+ if [ ! -e "$1" ] ; then |
+ test_fail "'$1' does not exist" |
+ return |
+ elif [ ! -f "$1" ] ; then |
+ test_fail "'$1' is not a regular file" |
+ return |
+ fi |
+ if [ -f "$2" ] ; then |
+ compare=`diff -wB "$1" "$2"` |
+ if [ ! -z "$compare" ] ; then |
+ test_fail "'$1' is different from '$2'. Diff is:\n$compare" |
+ fi |
+ fi |
+} |
+ |
+assert_nofile() { |
+# Assert the non existance of an exact filename. |
+# Opposite of 'assert_file' |
+ if [ -e "$1" ] ; then |
+ test_fail "'$1' exists." |
+ fi |
+} |
+ |
+ |
+assert_nostdout() { |
+# assert nothing was written to a stdout. |
+# NOTE: Failing this assertion will WARN rather than FAIL |
+ if [ -s out.stdout ] |
+ then |
+ test_infoline "Unexpected output from '$LASTCOMMAND' written to stdout, as shown below:" |
+ infofile out.stdout stdout: |
+ if [ "$TEST_STATUS" = "PASS" ]; then |
+ test_status WARN |
+ fi |
+ fi |
+} |
+ |
+assert_nostderr() { |
+# assert nothing was written to stderr. |
+# NOTE: Failing this assertion will WARN rather than FAIL |
+ if [ -n "$XDG_UTILS_DEBUG_LEVEL" ] ; then |
+ if [ -s out.stderr ] ; then |
+ infofile out.stderr debug: |
+ fi |
+ elif [ -s out.stderr ] ; then |
+ test_infoline "Unexpected output from '$LASTCOMMAND' written to stderr, as shown below:" |
+ infofile out.stderr stderr: |
+ if [ "$TEST_STATUS" = "PASS" ]; then |
+ test_status WARN |
+ fi |
+ fi |
+} |
+ |
+assert_stderr() { |
+# check that stderr matches expected error |
+# $1 is file containing regexp for expected error |
+# if no argument supplied, just check out.stderr is not empty |
+ |
+ if [ ! -s out.stderr ] |
+ then |
+ test_infoline "Expected output from '$LASTCOMMAND' to stderr, but none written" |
+ test_fail |
+ return |
+ fi |
+ if [ ! -z "$1" ] ; then |
+ expfile="$1" |
+ OK=Y |
+ exec 4<&0 0< "$expfile" 3< out.stderr |
+ while read expline |
+ do |
+ if read line <&3 |
+ then |
+ if expr "$line" : "$expline" > /dev/null |
+ then |
+ : |
+ else |
+ OK=N |
+ break |
+ fi |
+ else |
+ OK=N |
+ fi |
+ done |
+ exec 0<&4 3<&- 4<&- |
+ if [ "$OK" = N ] |
+ then |
+ test_infoline "Incorrect output from '$LASTCOMMAND' written to stderr, as shown below" |
+ infofile "$expfile" "expected stderr:" |
+ infofile out.stderr "received stderr:" |
+ test_fail |
+ fi |
+ fi |
+} |
+ |
+assert_stdout() { |
+# check that stderr matches expected error |
+# $1 is file containing regexp for expected error |
+# if no argument supplied, just check out.stderr is not empty |
+ |
+ if [ ! -s out.stdout ] |
+ then |
+ test_infoline "Expected output from '$LASTCOMMAND' to stdout, but none written" |
+ test_fail |
+ return |
+ fi |
+ if [ ! -z "$1" ] ; then |
+ expfile="$1" |
+ |
+ if [ ! -e "$expfile" ] ; then |
+ test_status NORESULT "Could not find file '$expfile' to look up expected pattern!" |
+ return |
+ fi |
+ OK=Y |
+ exec 4<&0 0< "$expfile" 3< out.stdout |
+ while read expline |
+ do |
+ if read line <&3 |
+ then |
+ if expr "$line" : "$expline" > /dev/null |
+ then |
+ : |
+ else |
+ OK=N |
+ break |
+ fi |
+ else |
+ OK=N |
+ fi |
+ done |
+ exec 0<&4 3<&- 4<&- |
+ if [ "$OK" = N ] |
+ then |
+ test_infoline "Incorrect output from '$LASTCOMMAND' written to stdout, as shown below" |
+ infofile "$expfile" "expected stdout:" |
+ infofile out.stdout "received stdout:" |
+ test_fail |
+ fi |
+ fi |
+} |
+ |
+require_interactive() { |
+# if $XDG_TEST_NO_INTERACTIVE is set, test result becomes UNTESTED |
+ if [ ! -z "$XDG_TEST_NO_INTERACTIVE" ] ; then |
+ test_result UNTESTED "XDG_TEST_NO_INTERACTIVE is set, but this test needs interactive" |
+ fi |
+} |
+ |
+require_root() { |
+# if the test is not being run as root, test result is UNTESTED |
+ if [ `whoami` != 'root' ] ; then |
+ test_result UNTESTED "not running as root, but test requires root privileges" |
+ fi |
+} |
+ |
+require_notroot() { |
+# if the test is being run as root, the test result is UNTESTED |
+# opposite of 'require_root' |
+ if [ `whoami` = 'root' ] ; then |
+ test_result UNTESTED "running as root, but test must be run as a normal user" |
+ fi |
+} |
+ |
+set_no_display() { |
+# Clear $DISPLAY |
+ unset DISPLAY |
+} |
+ |
+assert_display() { |
+# Assert that the $DISPLAY variable is set. |
+ if [ -z "$DISPLAY" ] ; then |
+ test_fail "DISPLAY not set!" |
+ fi |
+} |
+ |
+assert_util_var() { |
+# Assert that the $XDGUTIL varilable is set. |
+# DEPRICATED. Only used by generic tests. |
+if [ "x$XDGUTIL" = x ]; then |
+ test_fail "XDGUTIL variable not set" |
+fi |
+} |
+ |
+use_file() { |
+# Copy a datafile from it's defult location into the test directory |
+# Usage: |
+# use_file ORIG_FILE VAR |
+# Where ORIG_FILE is the name of the file, and VAR is the name of the |
+# variable to create that will contain the new (unique) filename. |
+# DO NOT put a '$' in front of VAR. VAR will be created via eval. |
+# |
+# $VAR will be set to 'xdgtestdata-$XDG_TEST_ID-$file' after the |
+# directory is stripped from $file. |
+ src="$1" |
+ file=${src##/*/} |
+ varname="$2" |
+ |
+ if [ $# -lt 2 ] ; then |
+ echo "TEST SYNTAX ERROR: use_file must have two arguments" >&2 |
+ exit 255 |
+ fi |
+ |
+ assert_file "$src" |
+ |
+ outfile="xdgtestdata-$XDG_TEST_ID-$file" |
+ eval "$varname=$outfile" |
+ |
+ cp "$src" "$XDG_TEST_TMPDIR/$outfile" |
+} |
+ |
+get_unique_name() { |
+# Get a unique name for a file, similar to 'use_file' |
+# except that no file is copied. You are left to create file $VAR. |
+ varname="$1" |
+ file="$2" |
+ if [ -z "$varname" ] ; then |
+ echo "TEST SYNAX ERROR: get_unique_name requries a variable name" |
+ exit 255 |
+ fi |
+ |
+ outfile="xdgtestdata-$XDG_TEST_ID-$file" |
+ eval "$varname=$outfile" |
+} |
+ |
+edit_file() { |
+# Edit file via sed. |
+# Usage: |
+# edit_file $FILE origstr VARNAME [newstr] |
+# Where: |
+# $FILE is a file, probably copied from 'use_file' |
+# VARNAME is created via 'eval' to contain the newstr |
+# newstr is the optional substitution. If newstr is not present, |
+# it will become 'xdgtestdata-$XDG_TEST_ID-$origstr' |
+ file="$1" |
+ origstr="$2" |
+ varname="$3" |
+ newstr="$4" |
+ |
+ if [ $# -lt 3 ] ; then |
+ echo "TEST SYNTAX ERROR: edit_file must have at least 3 arguments." |
+ exit 255 |
+ fi |
+ |
+ assert_file "$file" |
+ |
+ if [ -z "$newstr" ] ; then |
+ newstr="xdgtestdata-$XDG_TEST_ID-$origstr" |
+ fi |
+ |
+ eval "$varname=\"$newstr\"" |
+ |
+ sed -i -e "s|$origstr|$newstr|g" "$file" |
+} |
+ |