You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
4.3 KiB
141 lines
4.3 KiB
#!/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}")")"
|
|
# Setting the DEBUG_ROBOLECTRIC environment variable will print additional logging from
|
|
# Robolectric and also make it wait for a debugger to be connected.
|
|
# For Android Studio / IntelliJ the debugger can be connected via the "remote" configuration:
|
|
# https://www.jetbrains.com/help/idea/2016.2/run-debug-configuration-remote.html
|
|
# From command line the debugger can be connected via
|
|
# jdb -attach localhost:5005
|
|
if [ -n ${DEBUG_ROBOLECTRIC:-""} ]; then
|
|
# The arguments to the JVM needed to debug the tests.
|
|
# - server: wait for connection rather than connecting to a debugger
|
|
# - transport: how to accept debugger connections (sockets)
|
|
# - address: the port on which to accept debugger connections
|
|
# - timeout: how long (in ms) to wait for a debugger to connect
|
|
# - suspend: do not start running any code until the debugger connects
|
|
local debug_java_args="-Drobolectric.logging.enabled=true \
|
|
-Xdebug -agentlib:jdwp=server=y,transport=dt_socket,address=localhost:5005,suspend=y"
|
|
# Remove the timeout so Robolectric doesn't get killed while debugging
|
|
local debug_timeout="0"
|
|
fi
|
|
local command=(
|
|
"${PRIVATE_ROBOLECTRIC_SCRIPT_PATH}/java-timeout"
|
|
"${debug_timeout:-${PRIVATE_TIMEOUT}}"
|
|
${debug_java_args:-${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 "$@"
|