mirror of
https://github.com/kennethreitz/heroku-buildpack-python.git
synced 2026-06-05 23:10:16 +00:00
a98ef91566
* Fixes the "Installing <version>" assertions so that they don't false positive against the "please upgrade to <version>" output. * Removes modification of test fixtures during tests, since it can lead to failures depending on test order, and confusion when debugging. * Updates the PyPy version warning tests to use a slightly newer (but still not latest) PyPy version, which means that the test now passes on Cedar-14 and can be unskipped. * Switches to using an empty requirements file for version tests that duplicate the main test, to save spending time installing dependencies unnecessarily. * Switches the NLTK test to using the default buildpack Python version, rather than an ancient Python 3.6. * Skips the Python 3.7/3.8 tests on Cedar-14 rather than asserting failure, since we know they'll never pass due to Cedar-14's libssl being older than required. * Removes redundant `testSqliteInstall` test since it duplicates the Python version install tests. Longer term I'll be moving many of the unit tests to Hatchet, however this at least makes the tests more dependable in the meantime. Closes @W-8060219@. Closes @W-8176779@. [skip changelog]
265 lines
5.0 KiB
Bash
265 lines
5.0 KiB
Bash
#!/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)"
|
|
}
|