1*63d4e48fSSadaf Ebrahimi# vim:et:ft=sh:sts=2:sw=2 2*63d4e48fSSadaf Ebrahimi# 3*63d4e48fSSadaf Ebrahimi# shFlags unit test common functions 4*63d4e48fSSadaf Ebrahimi# 5*63d4e48fSSadaf Ebrahimi# Copyright 2008-2018 Kate Ward. All Rights Reserved. 6*63d4e48fSSadaf Ebrahimi# Released under the Apache 2.0 license. 7*63d4e48fSSadaf Ebrahimi# 8*63d4e48fSSadaf Ebrahimi# Author: [email protected] (Kate Ward) 9*63d4e48fSSadaf Ebrahimi# https://github.com/kward/shflags 10*63d4e48fSSadaf Ebrahimi# 11*63d4e48fSSadaf Ebrahimi### ShellCheck (http://www.shellcheck.net/) 12*63d4e48fSSadaf Ebrahimi# Disable source following. 13*63d4e48fSSadaf Ebrahimi# shellcheck disable=SC1090,SC1091 14*63d4e48fSSadaf Ebrahimi# $() are not fully portable (POSIX != portable). 15*63d4e48fSSadaf Ebrahimi# shellcheck disable=SC2006 16*63d4e48fSSadaf Ebrahimi# Arrays are not available in all shells. 17*63d4e48fSSadaf Ebrahimi# shellcheck disable=SC2089 18*63d4e48fSSadaf Ebrahimi# Exporting variables shouldn't impact their contents. 19*63d4e48fSSadaf Ebrahimi# shellcheck disable=SC2090 20*63d4e48fSSadaf Ebrahimi# Disagree with [ p ] && [ q ] vs [ p -a -q ] recommendation. 21*63d4e48fSSadaf Ebrahimi# shellcheck disable=SC2166 22*63d4e48fSSadaf Ebrahimi 23*63d4e48fSSadaf Ebrahimi# Exit immediately if a simple command exits with a non-zero status. 24*63d4e48fSSadaf Ebrahimiset -e 25*63d4e48fSSadaf Ebrahimi 26*63d4e48fSSadaf Ebrahimi# Treat unset variables as an error when performing parameter expansion. 27*63d4e48fSSadaf Ebrahimiset -u 28*63d4e48fSSadaf Ebrahimi 29*63d4e48fSSadaf Ebrahimi# Set shwordsplit for zsh. 30*63d4e48fSSadaf Ebrahimi[ -n "${ZSH_VERSION:-}" ] && setopt shwordsplit 31*63d4e48fSSadaf Ebrahimi 32*63d4e48fSSadaf Ebrahimi# Message functions. 33*63d4e48fSSadaf Ebrahimith_trace() { echo "test:TRACE $*" >&2; } 34*63d4e48fSSadaf Ebrahimith_debug() { echo "test:DEBUG $*" >&2; } 35*63d4e48fSSadaf Ebrahimith_info() { echo "test:INFO $*" >&2; } 36*63d4e48fSSadaf Ebrahimith_warn() { echo "test:WARN $*" >&2; } 37*63d4e48fSSadaf Ebrahimith_error() { echo "test:ERROR $*" >&2; } 38*63d4e48fSSadaf Ebrahimith_fatal() { echo "test:FATAL $*" >&2; exit 1; } 39*63d4e48fSSadaf Ebrahimi 40*63d4e48fSSadaf Ebrahimi# Path to shFlags library. Can be overridden by setting SHFLAGS_INC. 41*63d4e48fSSadaf EbrahimiTH_SHFLAGS=${SHFLAGS_INC:-./shflags}; export TH_SHFLAGS 42*63d4e48fSSadaf Ebrahimi 43*63d4e48fSSadaf Ebrahimi# Path to shUnit2 library. Can be overridden by setting SHUNIT_INC. 44*63d4e48fSSadaf EbrahimiTH_SHUNIT=${SHUNIT_INC:-lib/shunit2}; export TH_SHUNIT 45*63d4e48fSSadaf Ebrahimi 46*63d4e48fSSadaf EbrahimiTH_BOOL_VALID='true t 0 false f 1'; export TH_BOOL_VALID 47*63d4e48fSSadaf EbrahimiTH_BOOL_INVALID='123 123.0 invalid'; export TH_BOOL_INVALID 48*63d4e48fSSadaf EbrahimiTH_FLOAT_VALID='-1234.0 -1.0 -.123 0.0 0. .123 1.0 1234.0' 49*63d4e48fSSadaf Ebrahimiexport TH_FLOAT_VALID 50*63d4e48fSSadaf EbrahimiTH_FLOAT_INVALID='true false 1.2.3 -1.2.3 ""'; export TH_FLOAT_INVALID 51*63d4e48fSSadaf EbrahimiTH_INT_VALID='-1234 -1 0 1 1234'; export TH_INT_VALID 52*63d4e48fSSadaf EbrahimiTH_INT_INVALID='true false -1.0 -.123 0.0 .123 1.0 ""'; export TH_INT_INVALID 53*63d4e48fSSadaf Ebrahimi 54*63d4e48fSSadaf Ebrahimi# 55*63d4e48fSSadaf Ebrahimi# Test helper functions. 56*63d4e48fSSadaf Ebrahimi# 57*63d4e48fSSadaf Ebrahimi 58*63d4e48fSSadaf Ebrahimith_oneTimeSetUp() { 59*63d4e48fSSadaf Ebrahimi # Load shFlags. 60*63d4e48fSSadaf Ebrahimi # shellcheck disable=SC2034 61*63d4e48fSSadaf Ebrahimi [ -n "${ZSH_VERSION:-}" ] && FLAGS_PARENT=$0 62*63d4e48fSSadaf Ebrahimi . "${TH_SHFLAGS}" 63*63d4e48fSSadaf Ebrahimi 64*63d4e48fSSadaf Ebrahimi # These files will be cleaned up automatically by shUnit2. 65*63d4e48fSSadaf Ebrahimi tmpDir=${SHUNIT_TMPDIR}; export tmpDir 66*63d4e48fSSadaf Ebrahimi stdoutF="${tmpDir}/stdout" && touch "${stdoutF}" 67*63d4e48fSSadaf Ebrahimi stderrF="${tmpDir}/stderr" && touch "${stderrF}" 68*63d4e48fSSadaf Ebrahimi returnF="${tmpDir}/return" && touch "${returnF}" 69*63d4e48fSSadaf Ebrahimi expectedF="${tmpDir}/expected" && touch "${expectedF}" 70*63d4e48fSSadaf Ebrahimi} 71*63d4e48fSSadaf Ebrahimi 72*63d4e48fSSadaf Ebrahimith_showOutput() { 73*63d4e48fSSadaf Ebrahimi if isSkipping; then 74*63d4e48fSSadaf Ebrahimi return 75*63d4e48fSSadaf Ebrahimi fi 76*63d4e48fSSadaf Ebrahimi 77*63d4e48fSSadaf Ebrahimi _th_return="${1:-${returnF}}" 78*63d4e48fSSadaf Ebrahimi _th_stdout="${2:-${stdoutF}}" 79*63d4e48fSSadaf Ebrahimi _th_stderr="${3:-${stderrF}}" 80*63d4e48fSSadaf Ebrahimi 81*63d4e48fSSadaf Ebrahimi if [ "${_th_return}" != "${FLAGS_TRUE}" ]; then 82*63d4e48fSSadaf Ebrahimi # shellcheck disable=SC2166 83*63d4e48fSSadaf Ebrahimi if [ -n "${_th_stdout}" -a -s "${_th_stdout}" ]; then 84*63d4e48fSSadaf Ebrahimi echo '>>> STDOUT' >&2 85*63d4e48fSSadaf Ebrahimi cat "${_th_stdout}" >&2 86*63d4e48fSSadaf Ebrahimi echo '<<< STDOUT' >&2 87*63d4e48fSSadaf Ebrahimi fi 88*63d4e48fSSadaf Ebrahimi # shellcheck disable=SC2166 89*63d4e48fSSadaf Ebrahimi if [ -n "${_th_stderr}" -a -s "${_th_stderr}" ]; then 90*63d4e48fSSadaf Ebrahimi echo '>>> STDERR' >&2 91*63d4e48fSSadaf Ebrahimi cat "${_th_stderr}" >&2 92*63d4e48fSSadaf Ebrahimi echo '<<< STDERR' >&2 93*63d4e48fSSadaf Ebrahimi fi 94*63d4e48fSSadaf Ebrahimi fi 95*63d4e48fSSadaf Ebrahimi 96*63d4e48fSSadaf Ebrahimi unset _th_rtrn _th_stdout _th_stderr 97*63d4e48fSSadaf Ebrahimi} 98*63d4e48fSSadaf Ebrahimi 99*63d4e48fSSadaf Ebrahimi# Some shells, zsh on Solaris in particular, return immediately from a sub-shell 100*63d4e48fSSadaf Ebrahimi# when a non-zero return value is encountered. To properly catch these values, 101*63d4e48fSSadaf Ebrahimi# they are either written to disk, or recognized as an error the file is empty. 102*63d4e48fSSadaf Ebrahimith_clearReturn() { cp /dev/null "${returnF}"; } 103*63d4e48fSSadaf Ebrahimith_queryReturn() { 104*63d4e48fSSadaf Ebrahimi if [ -s "${returnF}" ]; then 105*63d4e48fSSadaf Ebrahimi cat "${returnF}" 106*63d4e48fSSadaf Ebrahimi return $? 107*63d4e48fSSadaf Ebrahimi fi 108*63d4e48fSSadaf Ebrahimi echo "${SHUNIT_ERROR}" 109*63d4e48fSSadaf Ebrahimi return "${SHUNIT_ERROR}" 110*63d4e48fSSadaf Ebrahimi} 111*63d4e48fSSadaf Ebrahimi 112*63d4e48fSSadaf EbrahimiassertWarnMsg() { _th_assertMsg 'WARN' "${1:-}" "${2:-}"; } 113*63d4e48fSSadaf EbrahimiassertErrorMsg() { _th_assertMsg 'ERROR' "${1:-}" "${2:-}"; } 114*63d4e48fSSadaf EbrahimiassertFatalMsg() { _th_assertMsg 'FATAL' "${1:-}" "${2:-}"; } 115*63d4e48fSSadaf Ebrahimi 116*63d4e48fSSadaf Ebrahimi_th_assertMsg() { 117*63d4e48fSSadaf Ebrahimi _th_alert_type_=$1 118*63d4e48fSSadaf Ebrahimi _th_alert_msg_=$2 119*63d4e48fSSadaf Ebrahimi _th_msg_=$3 120*63d4e48fSSadaf Ebrahimi 121*63d4e48fSSadaf Ebrahimi case ${_th_alert_type_} in 122*63d4e48fSSadaf Ebrahimi WARN) _th_alert_str_='a warning' ;; 123*63d4e48fSSadaf Ebrahimi ERROR) _th_alert_str_='an error' ;; 124*63d4e48fSSadaf Ebrahimi FATAL) _th_alert_str_='a fatal' ;; 125*63d4e48fSSadaf Ebrahimi esac 126*63d4e48fSSadaf Ebrahimi if [ -z "${_th_alert_msg_}" ]; then 127*63d4e48fSSadaf Ebrahimi _th_alert_msg_='.*' 128*63d4e48fSSadaf Ebrahimi fi 129*63d4e48fSSadaf Ebrahimi if [ -n "${_th_msg_}" ]; then 130*63d4e48fSSadaf Ebrahimi _th_msg_="(${_th_msg_}) " 131*63d4e48fSSadaf Ebrahimi fi 132*63d4e48fSSadaf Ebrahimi 133*63d4e48fSSadaf Ebrahimi (grep -- "^flags:${_th_alert_type_} ${_th_alert_msg_}" "${stderrF}" >/dev/null) 134*63d4e48fSSadaf Ebrahimi assertEquals "FLAGS ${_th_msg_}failure did not generate ${_th_alert_str_} message" "${FLAGS_TRUE}" $? 135*63d4e48fSSadaf Ebrahimi 136*63d4e48fSSadaf Ebrahimi unset _th_alert_type_ _th_alert_msg_ _th_alert_str_ _th_msg_ 137*63d4e48fSSadaf Ebrahimi} 138