Home | History | Annotate | Download | only in 3.5.1
      1 #!/bin/bash
      2 #
      3 # Runs robolectric tests.
      4 
      5 set -euo pipefail
      6 
      7 # Terminate with a fatal error.
      8 function fatal() {
      9   echo "Fatal: $*"
     10   exit 113
     11 }
     12 
     13 # Ensures that the given variable is set.
     14 function validate_var() {
     15   local name="$1"; shift || fatal "Missing argument: name"
     16   test $# = 0 || fatal "Too many arguments"
     17 
     18   eval [[ -n \${${name}+dummy} ]] || {
     19     echo "Variable not set: $name";
     20     return 1;
     21   }
     22 }
     23 
     24 # Ensures that all the required variables are set.
     25 function validate_vars() {
     26   test $# = 0 || fatal "Too many arguments"
     27 
     28   validate_var 'PRIVATE_INTERMEDIATES'
     29   validate_var 'PRIVATE_JARS'
     30   validate_var 'PRIVATE_JAVA_ARGS'
     31   validate_var 'PRIVATE_ROBOLECTRIC_PATH'
     32   validate_var 'PRIVATE_ROBOLECTRIC_SCRIPT_PATH'
     33   validate_var 'PRIVATE_RUN_INDIVIDUALLY'
     34   validate_var 'PRIVATE_TARGET_MESSAGE'
     35   validate_var 'PRIVATE_TESTS'
     36   validate_var 'PRIVATE_TIMEOUT'
     37 
     38   validate_var 'XML_OUTPUT_FILE'
     39   validate_var 'TEST_WORKSPACE'
     40 }
     41 
     42 # Remove leading and trailing spaces around the given argument.
     43 function strip() {
     44   local value="$1"; shift || fatal "Missing argument: value"
     45   test $# = 0 || fatal "Too many arguments"
     46 
     47   echo "$value" | sed -e 's/^ *//' -e 's/ *$//'
     48 }
     49 
     50 # Normalizes a list of paths and turns it into a colon-separated list.
     51 function normalize-path-list() {
     52   echo "$@" | sed -e 's/^ *//' -e 's/ *$//' -e 's/  */ /g' -e 's/ /:/g'
     53 }
     54 
     55 function junit() {
     56   # This adds the lib folder to the cp.
     57   local classpath="$(strip "$(normalize-path-list "${PRIVATE_JARS}")")"
     58   local command=(
     59     "${PRIVATE_ROBOLECTRIC_SCRIPT_PATH}/java-timeout"
     60     "${PRIVATE_TIMEOUT}"
     61     ${PRIVATE_JAVA_ARGS}
     62     -Drobolectric.dependency.dir="${PRIVATE_ROBOLECTRIC_PATH}"
     63     -Drobolectric.offline=true
     64     -Drobolectric.logging=stdout
     65     -cp "$classpath"
     66     com.android.junitxml.JUnitXmlRunner
     67   )
     68   echo "${command[@]}" "$@"
     69   "${command[@]}" "$@"
     70 }
     71 
     72 function runtests() {
     73   local tests="$1"; shift || fatal "Missing argument: tests"
     74   test $# = 0 || fatal "Too many arguments"
     75 
     76   if [[ "$(strip "${PRIVATE_RUN_INDIVIDUALLY}")" = 'true' ]]; then
     77     local result=0
     78     for test in ${tests}; do
     79       echo "-------------------------------------------------------------------"
     80       echo "Running $test:"
     81       junit "${test}"
     82     done
     83     return "$result"
     84   else
     85     echo "-------------------------------------------------------------------"
     86     echo "Running $tests:"
     87     junit $tests  # Contains a space-separated list of tests.
     88   fi
     89 }
     90 
     91 # Run the robolectric tests
     92 function run() {
     93   test $# = 0 || fatal "Too many arguments"
     94 
     95   [ "${PRIVATE_TARGET_MESSAGE}" == '' ] || echo "${PRIVATE_TARGET_MESSAGE}"
     96   local tests="${PRIVATE_TESTS}"
     97   if [ "$tests" = '' ]; then
     98     # Somehow there are no tests to run. Assume this is failure.
     99     echo "No tests to run."
    100     exit 1
    101   fi
    102   local output="${PRIVATE_INTERMEDIATES}/output.out"
    103   local failed="${PRIVATE_INTERMEDIATES}/failed.out"
    104   local result=0
    105   runtests "${tests}" >"$output" 2>&1 || result="$?"
    106   echo "$output"
    107   cat "$output"
    108   if [ "$result" = 0 ]; then
    109     return "$result"
    110   fi
    111   "${PRIVATE_ROBOLECTRIC_SCRIPT_PATH}/list_failed.sh" <"$output" >"$failed"
    112   return "$result"
    113 }
    114 
    115 function main() {
    116   test $# = 0 || fatal "Too many arguments"
    117 
    118   validate_vars
    119   run
    120 }
    121 
    122 main "$@"
    123