#!/bin/sh # taken from # https://github.com/ryanbrainard/heroku-buildpack-testrunner/blob/master/lib/test_utils.sh oneTimeSetUp() { TEST_SUITE_CACHE="$(mktemp -d ${SHUNIT_TMPDIR}/test_suite_cache.XXXX)" } oneTimeTearDown() { rm -rf ${TEST_SUITE_CACHE} } setUp() { OUTPUT_DIR="$(mktemp -d ${SHUNIT_TMPDIR}/output.XXXX)" STD_OUT="${OUTPUT_DIR}/stdout" STD_ERR="${OUTPUT_DIR}/stderr" BUILD_DIR="${OUTPUT_DIR}/build" CACHE_DIR="${OUTPUT_DIR}/cache" mkdir -p ${OUTPUT_DIR} mkdir -p ${BUILD_DIR} mkdir -p ${CACHE_DIR} } tearDown() { rm -rf ${OUTPUT_DIR} } capture() { resetCapture LAST_COMMAND="$@" "$@" >${STD_OUT} 2>${STD_ERR} RETURN=$? rtrn=${RETURN} # deprecated } resetCapture() { if [ -f ${STD_OUT} ]; then rm ${STD_OUT} fi if [ -f ${STD_ERR} ]; then rm ${STD_ERR} fi unset LAST_COMMAND unset RETURN unset rtrn # deprecated } assertCapturedEquals() { assertEquals "$@" "$(cat ${STD_OUT})" } assertCapturedNotEquals() { assertNotEquals "$@" "$(cat ${STD_OUT})" } assertCaptured() { stdroute=${2:-STD_OUT} assertFileContains "$1" "${!stdroute}" } assertNotCaptured() { assertFileNotContains "$@" "${STD_OUT}" } assertCapturedSuccess() { assertEquals "Captured exit code -" "0" "${RETURN}" assertEquals "STD_ERR -" "" "$(cat ${STD_ERR})" if [ $RETURN -ne 0 -o -n "$(cat ${STD_ERR})" ]; then debug fi } assertCapturedSuccessWithStdErr() { assertEquals "Captured exit code -" "0" "${RETURN}" assertNotEquals "STD_ERR -" "" "$(cat ${STD_ERR})" if [ ${RETURN} -ne 0 ]; then debug fi } # assertCapturedError [[expectedErrorCode] expectedErrorMsg] assertCapturedError() { if [ $# -gt 1 ]; then local expectedErrorCode=${1} shift fi local expectedErrorMsg=${1:-""} if [ -z ${expectedErrorCode} ]; then assertTrue "Expected captured exit code to be greater than 0; was <${RETURN}>" "[ ${RETURN} -gt 0 ]" else assertTrue "Expected captured exit code to be <${expectedErrorCode}>; was <${RETURN}>" "[ ${RETURN} -eq ${expectedErrorCode} ]" fi if [ "${expectedErrorMsg}" != "" ]; then assertFileContains "Expected STD_ERR to contain error <${expectedErrorMsg}>" "${expectedErrorMsg}" "${STD_ERR}" fi } _assertContains() { if [ 5 -eq $# ]; then local msg=$1 shift elif [ ! 4 -eq $# ]; then fail "Expected 4 or 5 parameters; Receieved $# parameters" fi local needle=$1 local haystack=$2 local expectation=$3 local haystack_type=$4 case "${haystack_type}" in "file") grep -q -F -e "${needle}" ${haystack} ;; "text") echo "${haystack}" | grep -q -F -e "${needle}" ;; esac if [ "${expectation}" != "$?" ]; then case "${expectation}" in 0) default_msg="Expected <${haystack}> to contain <${needle}>" ;; 1) default_msg="Did not expect <${haystack}> to contain <${needle}>" ;; esac fail "${msg:-${default_msg}}" if [ "${haystack_type}" == "file" ]; then echo cat "${haystack}" fi fi } debug() { echo echo '### STD_OUT ###' cat "${STD_OUT}" echo echo '### STD_ERR ###' cat "${STD_ERR}" echo echo } assertContains() { _assertContains "$@" 0 "text" } assertNotContains() { _assertContains "$@" 1 "text" } assertFileContains() { _assertContains "$@" 0 "file" } assertFileNotContains() { _assertContains "$@" 1 "file" } command_exists () { type "$1" > /dev/null 2>&1 ; } assertFileMD5() { expectedHash=$1 filename=$2 if command_exists "md5sum"; then md5_cmd="md5sum ${filename}" expected_md5_cmd_output="${expectedHash} ${filename}" elif command_exists "md5"; then md5_cmd="md5 ${filename}" expected_md5_cmd_output="MD5 (${filename}) = ${expectedHash}" else fail "no suitable MD5 hashing command found on this system" fi assertEquals "${expected_md5_cmd_output}" "`${md5_cmd}`" } # Test helpers mktmpdir() { dir=$(mktemp -t testXXXXX) rm -rf $dir mkdir $dir echo $dir } detect() { capture $(pwd)/bin/detect $(pwd)/test/fixtures/$1 } compile_dir="" default_process_types_cleanup() { file="/tmp/default_process_types" if [ -f "$file" ]; then rm "$file" fi } run_in_clean_env() { # Prevent stray environment variables from outside the test runner being exposed to tests. env -i HOME="${HOME}" LANG="${LANG}" PATH="${PATH}" STACK="${STACK}" "$@" } compile() { default_process_types_cleanup bp_dir=$(mktmpdir) compile_dir=$(mktmpdir) cp -a $(pwd)/* ${bp_dir} cp -a ${bp_dir}/test/fixtures/$1/. ${compile_dir} capture run_in_clean_env ${bp_dir}/bin/compile ${compile_dir} ${2:-$(mktmpdir)} $3 } compileDir() { default_process_types_cleanup local bp_dir=$(mktmpdir) local compile_dir=${1:-$(mktmpdir)} local cache_dir=${2:-$(mktmpdir)} local env_dir=$3 cp -a $(pwd)/* ${bp_dir} capture run_in_clean_env ${bp_dir}/bin/compile ${compile_dir} ${cache_dir} ${env_dir} } release() { bp_dir=$(mktmpdir) cp -a $(pwd)/* ${bp_dir} capture run_in_clean_env ${bp_dir}/bin/release ${bp_dir}/test/fixtures/$1 } assertFile() { assertEquals "$1" "$(cat ${compile_dir}/$2)" }