| #!/bin/bash |
| |
| # Copyright 2014 The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| readonly PREFIX="#####" |
| readonly RETRIES=2 |
| test_prefix= |
| |
| function checkArgOrExit() { |
| if [[ $# -lt 2 ]]; then |
| echo "Missing argument for option $1" >&2 |
| exit 1 |
| fi |
| } |
| |
| function usageAndExit() { |
| cat >&2 << EOF |
| all_tests.sh - test runner with support for flake testing |
| |
| all_tests.sh [options] |
| |
| options: |
| -h, --help show this menu |
| -p, --prefix=TEST_PREFIX specify a prefix for the tests to be run |
| EOF |
| exit 0 |
| } |
| |
| function maybePlural() { |
| # $1 = integer to use for plural check |
| # $2 = singular string |
| # $3 = plural string |
| if [ $1 -ne 1 ]; then |
| echo "$3" |
| else |
| echo "$2" |
| fi |
| } |
| |
| function runTest() { |
| local cmd="$1" |
| |
| if $cmd; then |
| return 0 |
| fi |
| |
| for iteration in $(seq $RETRIES); do |
| if ! $cmd; then |
| echo >&2 "'$cmd' failed more than once, giving up" |
| return 1 |
| fi |
| done |
| |
| echo >&2 "Warning: '$cmd' FLAKY, passed $RETRIES/$((RETRIES + 1))" |
| } |
| |
| # Parse arguments |
| while [ -n "$1" ]; do |
| case "$1" in |
| -h|--help) |
| usageAndExit |
| ;; |
| -p|--prefix) |
| checkArgOrExit $@ |
| test_prefix=$2 |
| shift 2 |
| ;; |
| *) |
| echo "Unknown option $1" >&2 |
| echo >&2 |
| usageAndExit |
| ;; |
| esac |
| done |
| |
| # Find the relevant tests |
| if [[ -z $test_prefix ]]; then |
| readonly tests=$(eval "find . -name '*_test.py' -type f -executable") |
| else |
| readonly tests=$(eval "find . -name '$test_prefix*' -type f -executable") |
| fi |
| |
| # Give some readable status messages |
| readonly count=$(echo $tests | wc -w) |
| if [[ -z $test_prefix ]]; then |
| echo "$PREFIX Found $count $(maybePlural $count test tests)." |
| else |
| echo "$PREFIX Found $count $(maybePlural $count test tests) with prefix $test_prefix." |
| fi |
| |
| exit_code=0 |
| |
| i=0 |
| for test in $tests; do |
| i=$((i + 1)) |
| echo "" |
| echo "$PREFIX $test ($i/$count)" |
| echo "" |
| runTest $test || exit_code=$(( exit_code + 1 )) |
| echo "" |
| done |
| |
| echo "$PREFIX $exit_code failed $(maybePlural $exit_code test tests)." |
| exit $exit_code |