Home | History | Annotate | Download | only in tests
      1 #!/bin/bash
      2 #
      3 # Copyright (C) 2007 The Android Open Source Project
      4 #
      5 # Licensed under the Apache License, Version 2.0 (the "License");
      6 # you may not use this file except in compliance with the License.
      7 # You may obtain a copy of the License at
      8 #
      9 #     http://www.apache.org/licenses/LICENSE-2.0
     10 #
     11 # Unless required by applicable law or agreed to in writing, software
     12 # distributed under the License is distributed on an "AS IS" BASIS,
     13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 # See the License for the specific language governing permissions and
     15 # limitations under the License.
     16 
     17 # Set up prog to be the path of this script, including following symlinks,
     18 # and set up progdir to be the fully-qualified pathname of its directory.
     19 prog="$0"
     20 while [ -h "${prog}" ]; do
     21     newProg=`/bin/ls -ld "${prog}"`
     22     newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
     23     if expr "x${newProg}" : 'x/' >/dev/null; then
     24         prog="${newProg}"
     25     else
     26         progdir=`dirname "${prog}"`
     27         prog="${progdir}/${newProg}"
     28     fi
     29 done
     30 oldwd=`pwd`
     31 progdir=`dirname "${prog}"`
     32 cd "${progdir}"
     33 progdir=`pwd`
     34 prog="${progdir}"/`basename "${prog}"`
     35 
     36 # Command-line options
     37 skip_tests=""
     38 sequential="no"
     39 usage="no"
     40 while [[ "$1" == "-"* ]]; do
     41   case $1 in
     42     --seq) sequential="yes" ;;
     43     --skip) skip_tests="$2 $skip_tests"
     44             shift ;;
     45     *) usage="yes" ;;
     46   esac
     47   shift
     48 done
     49 
     50 if [ $usage = "yes" ]; then
     51     prog=`basename $prog`
     52     cat 1>&2 <<END_USAGE
     53 Usage:
     54   $prog [options]   Run all tests with given options.
     55 Options:
     56   --seq             Run tests sequentially (default: parallel)
     57   --skip <test>     Skip running specified test
     58 END_USAGE
     59     exit 1
     60 fi
     61 
     62 # Globals for tracking numbers of successes and failures and their names.
     63 passed=()
     64 surprised=()
     65 ignored=()
     66 failed=()
     67 skipped=()
     68 
     69 # Tests failing and require attention (e.g. 115-merge)
     70 known_bad="100-local-mismatch 115-merge 119-merge-conflict"
     71 
     72 function display_results {
     73   printf    "\n\nTest Results\n"
     74   printf -- "----------------------------\n"
     75   printf    "Pass:                   % 4d\n" ${#passed[@]}
     76   printf    "Surprise pass:          % 4d\n" ${#surprised[@]}
     77   printf    "Known failures:         % 4d\n" ${#ignored[@]}
     78   printf    "Failures:               % 4d\n" ${#failed[@]}
     79   printf    "Skipped:                % 4d\n" ${#skipped[@]}
     80   printf -- "----------------------------\n"
     81   printf    "Elapsed time(s):        % 4d\n" $SECONDS
     82 
     83   list_files "Unexpected successes" ${surprised[@]}
     84   list_files "Known failures" ${ignored[@]}
     85   list_files "Failures" ${failed[@]}
     86   list_files "Skipped" ${skipped[@]}
     87 
     88   needing_attention=$(( ${#failed[@]} + ${#surprised[@]} ))
     89   exit ${needing_attention}
     90 }
     91 
     92 function list_files {
     93   # Arguments: Title test_name0 test_name1 ... test_nameN
     94   echo "$1:"
     95   shift
     96   if [[ "$1" = "" ]]; then
     97     echo "  NONE"
     98     return
     99   fi
    100   while [[ "$1" != "" ]]; do
    101     echo "  $1"
    102     shift
    103   done
    104 }
    105 
    106 function update_result {
    107   test_name=$1
    108   output=$2
    109   result=$3
    110 
    111   if [[ "$known_bad" == *"$test_name"* ]]; then
    112     expectFail=1
    113   else
    114     expectFail=0
    115   fi
    116   if [ $result = 0 ]; then
    117     if [[ $expectFail = 0 ]]; then
    118       passed+=(${test_name})
    119     else
    120       echo "Failing on unexpected success of $test_name"
    121       surprised+=(${test_name})
    122     fi
    123   else
    124     if [[ $expectFail = 0 ]]; then
    125       failed+=(${test_name})
    126     else
    127       echo "Ignoring expected failure of $test_name"
    128       ignored+=(${test_name})
    129       # Clean up when we expect a test to fail.
    130       # run-test only does this on success.
    131       rm -rf "$output"
    132     fi
    133   fi
    134 }
    135 
    136 function run_tests {
    137   if [[ "$sequential" = "yes" ]]; then
    138     for test_name in *; do
    139       if [[ "$skip_tests" = *"$test_name"* ]]; then
    140           skipped+=(${test_name})
    141           continue
    142       fi
    143       if [ -d "$test_name" -a -r "$test_name" ]; then
    144         output=/tmp/$$/$test_name
    145         ./run-test --output_dir "$output" "$test_name"
    146         update_result $test_name $output $?
    147       fi
    148     done
    149   else
    150     i=0
    151     for test_name in *; do
    152       if [[ "$skip_tests" = *"$test_name"* ]]; then
    153           skipped+=(${test_name})
    154           continue
    155       fi
    156       if [ -d "$test_name" -a -r "$test_name" ]; then
    157           output=/tmp/$$/$test_name
    158           ./run-test --output_dir "$output" "$test_name" &
    159           test_pids[i]=$!
    160           test_names[test_pids[i]]="$test_name"
    161           test_outputs[test_pids[i]]="output"
    162           let i+=1
    163       fi
    164     done
    165 
    166     for pid in ${test_pids[@]}; do
    167       wait $pid
    168       update_result ${test_names[$pid]} ${test_outputs[$pid]} $?
    169     done
    170   fi
    171 }
    172 
    173 function handle_interrupt {
    174   trap INT
    175   display_results
    176 }
    177 
    178 trap handle_interrupt INT
    179 run_tests
    180 display_results
    181