mirror of https://github.com/deajan/osync
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
242 lines
6.8 KiB
Bash
242 lines
6.8 KiB
Bash
# vim:et:ft=sh:sts=2:sw=2
|
|
#
|
|
# shUnit2 unit test common functions
|
|
#
|
|
# Copyright 2008-2021 Kate Ward. All Rights Reserved.
|
|
# Released under the Apache 2.0 license.
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Author: kate.ward@forestent.com (Kate Ward)
|
|
# https://github.com/kward/shunit2
|
|
#
|
|
### ShellCheck (http://www.shellcheck.net/)
|
|
# expr may be antiquated, but it is the only solution in some cases.
|
|
# shellcheck disable=SC2003
|
|
# $() are not fully portable (POSIX != portable).
|
|
# shellcheck disable=SC2006
|
|
|
|
# Exit immediately if a simple command exits with a non-zero status.
|
|
set -e
|
|
|
|
# Treat unset variables as an error when performing parameter expansion.
|
|
set -u
|
|
|
|
# Set shwordsplit for zsh.
|
|
[ -n "${ZSH_VERSION:-}" ] && setopt shwordsplit
|
|
|
|
#
|
|
# Constants.
|
|
#
|
|
|
|
# Path to shUnit2 library. Can be overridden by setting SHUNIT_INC.
|
|
TH_SHUNIT=${SHUNIT_INC:-./shunit2}; export TH_SHUNIT
|
|
|
|
# Configure debugging. Set the DEBUG environment variable to any
|
|
# non-empty value to enable debug output, or TRACE to enable trace
|
|
# output.
|
|
TRACE=${TRACE:+'th_trace '}
|
|
[ -n "${TRACE}" ] && DEBUG=1
|
|
[ -z "${TRACE}" ] && TRACE=':'
|
|
|
|
DEBUG=${DEBUG:+'th_debug '}
|
|
[ -z "${DEBUG}" ] && DEBUG=':'
|
|
|
|
#
|
|
# Variables.
|
|
#
|
|
|
|
th_RANDOM=0
|
|
|
|
#
|
|
# Functions.
|
|
#
|
|
|
|
# Logging functions.
|
|
th_trace() { echo "test:TRACE $*" >&2; }
|
|
th_debug() { echo "test:DEBUG $*" >&2; }
|
|
th_info() { echo "test:INFO $*" >&2; }
|
|
th_warn() { echo "test:WARN $*" >&2; }
|
|
th_error() { echo "test:ERROR $*" >&2; }
|
|
th_fatal() { echo "test:FATAL $*" >&2; }
|
|
|
|
# Output subtest name.
|
|
th_subtest() { echo " $*" >&2; }
|
|
|
|
th_oneTimeSetUp() {
|
|
# These files will be cleaned up automatically by shUnit2.
|
|
stdoutF="${SHUNIT_TMPDIR}/stdout"
|
|
stderrF="${SHUNIT_TMPDIR}/stderr"
|
|
returnF="${SHUNIT_TMPDIR}/return"
|
|
expectedF="${SHUNIT_TMPDIR}/expected"
|
|
export stdoutF stderrF returnF expectedF
|
|
}
|
|
|
|
# Generate a random number.
|
|
th_generateRandom() {
|
|
tfgr_random=${th_RANDOM}
|
|
|
|
while [ "${tfgr_random}" = "${th_RANDOM}" ]; do
|
|
# shellcheck disable=SC2039
|
|
if [ -n "${RANDOM:-}" ]; then
|
|
# $RANDOM works
|
|
# shellcheck disable=SC2039
|
|
tfgr_random=${RANDOM}${RANDOM}${RANDOM}$$
|
|
elif [ -r '/dev/urandom' ]; then
|
|
tfgr_random=`od -vAn -N4 -tu4 </dev/urandom |sed 's/^[^0-9]*//'`
|
|
else
|
|
tfgr_date=`date '+%H%M%S'`
|
|
tfgr_random=`expr "${tfgr_date}" \* $$`
|
|
unset tfgr_date
|
|
fi
|
|
[ "${tfgr_random}" = "${th_RANDOM}" ] && sleep 1
|
|
done
|
|
|
|
th_RANDOM=${tfgr_random}
|
|
unset tfgr_random
|
|
}
|
|
|
|
# This section returns the data section from the specified section of a file. A
|
|
# data section is defined by a [header], one or more lines of data, and then a
|
|
# blank line.
|
|
th_getDataSect() {
|
|
th_sgrep "\\[$1\\]" "$2" |sed '1d'
|
|
}
|
|
|
|
# This function greps a section from a file. a section is defined as a group of
|
|
# lines preceded and followed by blank lines..
|
|
th_sgrep() {
|
|
th_pattern_=$1
|
|
shift
|
|
|
|
# shellcheck disable=SC2068
|
|
sed -e '/./{H;$!d;}' -e "x;/${th_pattern_}/"'!d;' $@ |sed '1d'
|
|
|
|
unset th_pattern_
|
|
}
|
|
|
|
# Custom assert that checks for true return value (0), and no output to STDOUT
|
|
# or STDERR. If a non-zero return value is encountered, the output of STDERR
|
|
# will be output.
|
|
#
|
|
# Args:
|
|
# th_test_: string: name of the subtest
|
|
# th_rtrn_: integer: the return value of the subtest performed
|
|
# th_stdout_: string: filename where stdout was redirected to
|
|
# th_stderr_: string: filename where stderr was redirected to
|
|
th_assertTrueWithNoOutput() {
|
|
th_test_=$1
|
|
th_rtrn_=$2
|
|
th_stdout_=$3
|
|
th_stderr_=$4
|
|
|
|
assertEquals "${th_test_}: expected return value of true" "${SHUNIT_TRUE}" "${th_rtrn_}"
|
|
assertFalse "${th_test_}: expected no output to STDOUT" "[ -s '${th_stdout_}' ]"
|
|
assertFalse "${th_test_}: expected no output to STDERR" "[ -s '${th_stderr_}' ]"
|
|
# shellcheck disable=SC2166
|
|
if [ -s "${th_stdout_}" -o -s "${th_stderr_}" ]; then
|
|
_th_showOutput "${SHUNIT_FALSE}" "${th_stdout_}" "${th_stderr_}"
|
|
fi
|
|
|
|
unset th_test_ th_rtrn_ th_stdout_ th_stderr_
|
|
}
|
|
|
|
# Custom assert that checks for non-zero return value, output to STDOUT, but no
|
|
# output to STDERR.
|
|
#
|
|
# Args:
|
|
# th_test_: string: name of the subtest
|
|
# th_rtrn_: integer: the return value of the subtest performed
|
|
# th_stdout_: string: filename where stdout was redirected to
|
|
# th_stderr_: string: filename where stderr was redirected to
|
|
th_assertFalseWithOutput()
|
|
{
|
|
th_test_=$1
|
|
th_rtrn_=$2
|
|
th_stdout_=$3
|
|
th_stderr_=$4
|
|
|
|
assertNotEquals "${th_test_}: expected non-true return value" "${SHUNIT_TRUE}" "${th_rtrn_}"
|
|
assertTrue "${th_test_}: expected output to STDOUT" "[ -s '${th_stdout_}' ]"
|
|
assertFalse "${th_test_}: expected no output to STDERR" "[ -s '${th_stderr_}' ]"
|
|
# shellcheck disable=SC2166
|
|
if ! [ -s "${th_stdout_}" -a ! -s "${th_stderr_}" ]; then
|
|
_th_showOutput "${SHUNIT_FALSE}" "${th_stdout_}" "${th_stderr_}"
|
|
fi
|
|
|
|
unset th_test_ th_rtrn_ th_stdout_ th_stderr_
|
|
}
|
|
|
|
# Custom assert that checks for non-zero return value, no output to STDOUT, but
|
|
# output to STDERR.
|
|
#
|
|
# Args:
|
|
# th_test_: string: name of the subtest
|
|
# th_rtrn_: integer: the return value of the subtest performed
|
|
# th_stdout_: string: filename where stdout was redirected to
|
|
# th_stderr_: string: filename where stderr was redirected to
|
|
th_assertFalseWithError() {
|
|
th_test_=$1
|
|
th_rtrn_=$2
|
|
th_stdout_=$3
|
|
th_stderr_=$4
|
|
|
|
assertFalse "${th_test_}: expected non-zero return value" "${th_rtrn_}"
|
|
assertFalse "${th_test_}: expected no output to STDOUT" "[ -s '${th_stdout_}' ]"
|
|
assertTrue "${th_test_}: expected output to STDERR" "[ -s '${th_stderr_}' ]"
|
|
# shellcheck disable=SC2166
|
|
if ! [ ! -s "${th_stdout_}" -a -s "${th_stderr_}" ]; then
|
|
_th_showOutput "${SHUNIT_FALSE}" "${th_stdout_}" "${th_stderr_}"
|
|
fi
|
|
|
|
unset th_test_ th_rtrn_ th_stdout_ th_stderr_
|
|
}
|
|
|
|
# Some shells, zsh on Solaris in particular, return immediately from a sub-shell
|
|
# when a non-zero return value is encountered. To properly catch these values,
|
|
# they are either written to disk, or recognized as an error the file is empty.
|
|
th_clearReturn() { cp /dev/null "${returnF}"; }
|
|
th_queryReturn() {
|
|
if [ -s "${returnF}" ]; then
|
|
th_return=`cat "${returnF}"`
|
|
else
|
|
th_return=${SHUNIT_ERROR}
|
|
fi
|
|
export th_return
|
|
}
|
|
|
|
# Providing external and internal calls to the showOutput helper function.
|
|
th_showOutput() { _th_showOutput "$@"; }
|
|
_th_showOutput() {
|
|
if isSkipping; then
|
|
return
|
|
fi
|
|
|
|
_th_return_="${1:-${returnF}}"
|
|
_th_stdout_="${2:-${stdoutF}}"
|
|
_th_stderr_="${3:-${stderrF}}"
|
|
|
|
if [ "${_th_return_}" != "${SHUNIT_TRUE}" ]; then
|
|
# shellcheck disable=SC2166
|
|
if [ -n "${_th_stdout_}" -a -s "${_th_stdout_}" ]; then
|
|
echo '>>> STDOUT' >&2
|
|
cat "${_th_stdout_}" >&2
|
|
echo '<<< STDOUT' >&2
|
|
fi
|
|
# shellcheck disable=SC2166
|
|
if [ -n "${_th_stderr_}" -a -s "${_th_stderr_}" ]; then
|
|
echo '>>> STDERR' >&2
|
|
cat "${_th_stderr_}" >&2
|
|
echo '<<< STDERR' >&2
|
|
fi
|
|
fi
|
|
|
|
unset _th_return_ _th_stdout_ _th_stderr_
|
|
}
|
|
|
|
#
|
|
# Main.
|
|
#
|
|
|
|
${TRACE} 'trace output enabled'
|
|
${DEBUG} 'debug output enabled'
|