#!/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 "$@"