#!/bin/bash
#
# Runs robolectric tests.
set -euo pipefail
# Terminate with a fatal error.
function fatal() {
echo "Fatal: $*"
exit 113
}
# Ensures that the given variable is set.
function validate_var() {
local name="$1"; shift || fatal "Missing argument: name"
test $# = 0 || fatal "Too many arguments"
eval [[ -n \${${name}+dummy} ]] || {
echo "Variable not set: $name";
return 1;
}
}
# Ensures that all the required variables are set.
function validate_vars() {
test $# = 0 || fatal "Too many arguments"
validate_var 'PRIVATE_INTERMEDIATES'
validate_var 'PRIVATE_JARS'
validate_var 'PRIVATE_JAVA_ARGS'
validate_var 'PRIVATE_ROBOLECTRIC_PATH'
validate_var 'PRIVATE_ROBOLECTRIC_SCRIPT_PATH'
validate_var 'PRIVATE_RUN_INDIVIDUALLY'
validate_var 'PRIVATE_TARGET_MESSAGE'
validate_var 'PRIVATE_TESTS'
validate_var 'PRIVATE_TIMEOUT'
validate_var 'XML_OUTPUT_FILE'
validate_var 'TEST_WORKSPACE'
}
# Remove leading and trailing spaces around the given argument.
function strip() {
local value="$1"; shift || fatal "Missing argument: value"
test $# = 0 || fatal "Too many arguments"
echo "$value" | sed -e 's/^ *//' -e 's/ *$//'
}
# Normalizes a list of paths and turns it into a colon-separated list.
function normalize-path-list() {
echo "$@" | sed -e 's/^ *//' -e 's/ *$//' -e 's/ */ /g' -e 's/ /:/g'
}
function junit() {
# This adds the lib folder to the cp.
local classpath="$(strip "$(normalize-path-list "${PRIVATE_JARS}")")"
local command=(
"${PRIVATE_ROBOLECTRIC_SCRIPT_PATH}/java-timeout"
"${PRIVATE_TIMEOUT}"
${PRIVATE_JAVA_ARGS}
-Drobolectric.dependency.dir="${PRIVATE_ROBOLECTRIC_PATH}"
-Drobolectric.offline=true
-Drobolectric.logging=stdout
-cp "$classpath"
com.android.junitxml.JUnitXmlRunner
)
echo "${command[@]}" "$@"
"${command[@]}" "$@"
}
function runtests() {
local tests="$1"; shift || fatal "Missing argument: tests"
test $# = 0 || fatal "Too many arguments"
if [[ "$(strip "${PRIVATE_RUN_INDIVIDUALLY}")" = 'true' ]]; then
local result=0
for test in ${tests}; do
echo "-------------------------------------------------------------------"
echo "Running $test:"
junit "${test}"
done
return "$result"
else
echo "-------------------------------------------------------------------"
echo "Running $tests:"
junit $tests # Contains a space-separated list of tests.
fi
}
# Run the robolectric tests
function run() {
test $# = 0 || fatal "Too many arguments"
[ "${PRIVATE_TARGET_MESSAGE}" == '' ] || echo "${PRIVATE_TARGET_MESSAGE}"
local tests="${PRIVATE_TESTS}"
if [ "$tests" = '' ]; then
# Somehow there are no tests to run. Assume this is failure.
echo "No tests to run."
exit 1
fi
local output="${PRIVATE_INTERMEDIATES}/output.out"
local failed="${PRIVATE_INTERMEDIATES}/failed.out"
local result=0
runtests "${tests}" >"$output" 2>&1 || result="$?"
echo "$output"
cat "$output"
if [ "$result" = 0 ]; then
return "$result"
fi
"${PRIVATE_ROBOLECTRIC_SCRIPT_PATH}/list_failed.sh" <"$output" >"$failed"
return "$result"
}
function main() {
test $# = 0 || fatal "Too many arguments"
validate_vars
run
}
main "$@"