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