1
1
Fork 0
mirror of https://github.com/QB64-Phoenix-Edition/QB64pe.git synced 2024-07-03 13:31:23 +00:00
QB64-PE/tests/compile_tests.sh
Matthew Kilgore 2deac87b60 Fix Linux build agent audio problems
It's still not entirely clear what the underlying issue is, but the ALSA
device provided by pulseaudio stops working after so many tests use it.
I've tried various approaches, but simply restarting pulseaudio after
every test is a bruteforce but successful solution. In practice it also
doesn't have any noticeable performance penalty, so it seems like a file
solution.

The `CI_TESTING` environment variable is used to avoid restarting
pulseaudio if the tests aren't being run in the CI environment (we don't
want to restart your pulseaudio instance if you're running them locally!)
2022-09-17 02:41:22 -04:00

110 lines
3.5 KiB
Bash
Executable file

#!/bin/bash
# Arg 1: qb54 location
# Arg 2: Optional category to test
PREFIX="Compilation"
RESULTS_DIR="./tests/results/$PREFIX"
mkdir -p $RESULTS_DIR
QB64=$1
if [ "$#" -eq 2 ]; then
CATEGORY="/$2"
fi
show_failure()
{
cat "$RESULTS_DIR/$1-$2-compile_result.txt"
cat "$RESULTS_DIR/$2-compilelog.txt"
}
show_incorrect_result()
{
printf "EXPECTED: '%s'\n" "$1"
printf "GOT: '%s'\n" "$2"
}
# Each .bas file represents a separate test.
while IFS= read -r test
do
category=$(basename "$(dirname "$test")")
testName=$(basename "$test" .bas)
TESTCASE="$category/$testName"
EXE="$RESULTS_DIR/$category-$testName - output"
# If a .err file exists, then this test is actually testing a compilation error
testType="success"
if test -f "./tests/compile_tests/$category/$testName.err"; then
testType="error"
fi
# Clear out temp folder before next compile, avoids stale compilelog files
rm -fr ./internal/temp/*
# Clean up existing EXE, so we don't use it by accident
rm -f "$EXE*"
compileResultOutput="$RESULTS_DIR/$category-$testName-compile_result.txt"
# A .flags file contains any extra compiler flags to provide to QB64 for this test
compilerFlags=
if test -f "./tests/compile_tests/$category/$testName.flags"; then
compilerFlags=$(cat "./tests/compile_tests/$category/$testName.flags")
fi
# -m and -q make sure that we get predictable results
"$QB64" $compilerFlags -m -q -x "./tests/compile_tests/$category/$testName.bas" -o "$EXE" 1>"$compileResultOutput"
ERR=$?
cp_if_exists ./internal/temp/compilelog.txt "$RESULTS_DIR/$category-$testName-compilelog.txt"
if [ "$testType" == "success" ]; then
(exit $ERR)
assert_success_named "Compile" "Compilation Error:" show_failure "$category" "$testName"
test -f "$EXE"
assert_success_named "exe exists" "$test-output executable does not exist!" show_failure "$category" "$testName"
# Some tests do not have an output or err file because they should
# compile successfully but cannot be run on the build agents
if [ ! -f "./tests/compile_tests/$category/$testName.output" ]; then
continue
fi
expectedResult="$(cat "./tests/compile_tests/$category/$testName.output")"
pushd . > /dev/null
cd "./tests/compile_tests/$category"
testResult=$("../../../$EXE" 2>&1)
ERR=$?
popd > /dev/null
(exit $ERR)
assert_success_named "run" "Execution Error:" echo "$testResult"
[ "$testResult" == "$expectedResult" ]
assert_success_named "result" "Result is wrong:" show_incorrect_result "$expectedResult" "$testResult"
# Restart pulseaudio between each test to make sound tests work on Linux
if [ "$CI_TESTING" == "y" ] && command -v pulseaudio > /dev/null
then
pulseaudio -k
pulseaudio -D
fi
else
! (exit $ERR)
assert_success_named "Compile" "Compilation Success, was expecting error:" show_failure "$category" "$testName"
! test -f "$EXE"
assert_success_named "Exe exists" "'$category-$testName - output' exists, it should not!" show_failure "$category" "$testName"
expectedErr="$(cat "./tests/compile_tests/$category/$testName.err")"
diffResult=$(diff -y "./tests/compile_tests/$category/$testName.err" "$compileResultOutput")
assert_success_named "Error result" "Error reporting is wrong:" echo "$diffResult"
fi
done < <(find ./tests/compile_tests$CATEGORY -name "*.bas" -print)