robotest.sh revision 2a2559e5581c585721d342ffe6dceff6c5d7019e
12a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux#!/bin/bash
22a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux#
32a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux# Runs robolectric tests.
42a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux
52a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieuxset -euo pipefail
62a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux
72a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux# Terminate with a fatal error.
82a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieuxfunction fatal() {
92a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  echo "Fatal: $*"
102a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  exit 113
112a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux}
122a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux
132a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux# Ensures that the given variable is set.
142a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieuxfunction validate_var() {
152a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  local name="$1"; shift || fatal "Missing argument: name"
162a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  test $# = 0 || fatal "Too many arguments"
172a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux
182a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  eval [[ -n \${${name}+dummy} ]] || {
192a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux    echo "Variable not set: $name";
202a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux    return 1;
212a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  }
222a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux}
232a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux
242a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux# Ensures that all the required variables are set.
252a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieuxfunction validate_vars() {
262a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  test $# = 0 || fatal "Too many arguments"
272a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux
282a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  validate_var 'PRIVATE_INTERMEDIATES'
292a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  validate_var 'PRIVATE_JARS'
302a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  validate_var 'PRIVATE_JAVA_ARGS'
312a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  validate_var 'PRIVATE_ROBOLECTRIC_PATH'
322a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  validate_var 'PRIVATE_ROBOLECTRIC_SCRIPT_PATH'
332a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  validate_var 'PRIVATE_RUN_INDIVIDUALLY'
342a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  validate_var 'PRIVATE_TARGET_MESSAGE'
352a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  validate_var 'PRIVATE_TESTS'
362a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  validate_var 'PRIVATE_TIMEOUT'
372a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux
382a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  validate_var 'XML_OUTPUT_FILE'
392a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  validate_var 'TEST_WORKSPACE'
402a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux}
412a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux
422a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux# Remove leading and trailing spaces around the given argument.
432a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieuxfunction strip() {
442a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  local value="$1"; shift || fatal "Missing argument: value"
452a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  test $# = 0 || fatal "Too many arguments"
462a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux
472a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  echo "$value" | sed -e 's/^ *//' -e 's/ *$//'
482a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux}
492a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux
502a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux# Normalizes a list of paths and turns it into a colon-separated list.
512a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieuxfunction normalize-path-list() {
522a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  echo "$@" | sed -e 's/^ *//' -e 's/ *$//' -e 's/  */ /g' -e 's/ /:/g'
532a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux}
542a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux
552a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieuxfunction junit() {
562a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  # This adds the lib folder to the cp.
572a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  local classpath="$(strip "$(normalize-path-list "${PRIVATE_JARS}")")"
582a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  local command=(
592a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux    "${PRIVATE_ROBOLECTRIC_SCRIPT_PATH}/java-timeout"
602a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux    "${PRIVATE_TIMEOUT}"
612a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux    ${PRIVATE_JAVA_ARGS}
622a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux    -Drobolectric.dependency.dir="${PRIVATE_ROBOLECTRIC_PATH}"
632a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux    -Drobolectric.offline=true
642a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux    -Drobolectric.logging=stdout
652a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux    -cp "$classpath"
662a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux    com.android.junitxml.JUnitXmlRunner
672a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  )
682a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  echo "${command[@]}" "$@"
692a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  "${command[@]}" "$@"
702a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux}
712a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux
722a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieuxfunction runtests() {
732a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  local tests="$1"; shift || fatal "Missing argument: tests"
742a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  test $# = 0 || fatal "Too many arguments"
752a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux
762a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  if [[ "$(strip "${PRIVATE_RUN_INDIVIDUALLY}")" = 'true' ]]; then
772a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux    local result=0
782a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux    for test in ${tests}; do
792a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux      echo "-------------------------------------------------------------------"
802a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux      echo "Running $test:"
812a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux      junit "${test}"
822a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux    done
832a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux    return "$result"
842a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  else
852a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux    echo "-------------------------------------------------------------------"
862a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux    echo "Running $tests:"
872a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux    junit $tests  # Contains a space-separated list of tests.
882a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  fi
892a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux}
902a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux
912a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux# Run the robolectric tests
922a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieuxfunction run() {
932a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  test $# = 0 || fatal "Too many arguments"
942a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux
952a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  [ "${PRIVATE_TARGET_MESSAGE}" == '' ] || echo "${PRIVATE_TARGET_MESSAGE}"
962a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  local tests="${PRIVATE_TESTS}"
972a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  if [ "$tests" = '' ]; then
982a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux    # Somehow there are no tests to run. Assume this is failure.
992a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux    echo "No tests to run."
1002a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux    exit 1
1012a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  fi
1022a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  local output="${PRIVATE_INTERMEDIATES}/output.out"
1032a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  local failed="${PRIVATE_INTERMEDIATES}/failed.out"
1042a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  local result=0
1052a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  runtests "${tests}" >"$output" 2>&1 || result="$?"
1062a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  echo "$output"
1072a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  cat "$output"
1082a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  if [ "$result" = 0 ]; then
1092a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux    return "$result"
1102a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  fi
1112a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  "${PRIVATE_ROBOLECTRIC_SCRIPT_PATH}/list_failed.sh" <"$output" >"$failed"
1122a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  return "$result"
1132a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux}
1142a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux
1152a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieuxfunction main() {
1162a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  test $# = 0 || fatal "Too many arguments"
1172a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux
1182a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  validate_vars
1192a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux  run
1202a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux}
1212a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieux
1222a2559e5581c585721d342ffe6dceff6c5d7019eJames Lemieuxmain "$@"
123