1#!/bin/bash 2 3# Copyright (C) 2017 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# A simple helper script that runs all of the atest unit tests. 18# We have 2 situations we take care of: 19# 1. User wants to invoke this script by itself. 20# 2. PREUPLOAD hook invokes this script. 21 22ATEST_DIR=`dirname $0`/ 23[ "$(uname -s)" == "Darwin" ] && { realpath(){ echo "$(cd $(dirname $1);pwd -P)/$(basename $1)"; }; } 24ATEST_REAL_PATH=`realpath $ATEST_DIR` 25RED='\033[0;31m' 26GREEN='\033[0;32m' 27NC='\033[0m' # No Color 28COVERAGE=false 29 30function set_pythonpath() { 31 if ! echo $PYTHONPATH | grep -q $ATEST_REAL_PATH; then 32 PYTHONPATH=$ATEST_REAL_PATH:$PYTHONPATH 33 fi 34} 35 36function print_summary() { 37 local test_results=$1 38 if [[ $COVERAGE == true ]]; then 39 coverage report -m 40 coverage html 41 fi 42 if [[ $test_results -eq 0 ]]; then 43 echo -e "${GREEN}All unittests pass${NC}!" 44 else 45 echo -e "${RED}There was a unittest failure${NC}" 46 fi 47} 48 49function run_atest_unittests() { 50 echo "Running tests..." 51 local run_cmd="python" 52 local rc=0 53 set_pythonpath 54 if [[ $COVERAGE == true ]]; then 55 # Clear previously coverage data. 56 python -m coverage erase 57 # Collect coverage data. 58 run_cmd="coverage run --source $ATEST_REAL_PATH --append" 59 fi 60 61 for test_file in $(find $ATEST_DIR -name "*_unittest.py"); do 62 if ! $run_cmd $test_file; then 63 rc=1 64 echo -e "${RED}$t failed${NC}" 65 fi 66 done 67 echo 68 print_summary $rc 69 return $rc 70} 71 72# Let's check if anything is passed in, if not we assume the user is invoking 73# script, but if we get a list of files, assume it's the PREUPLOAD hook. 74read -ra PREUPLOAD_FILES <<< "$@" 75if [[ ${#PREUPLOAD_FILES[@]} -eq 0 ]]; then 76 run_atest_unittests; exit $? 77elif [[ "${#PREUPLOAD_FILES[@]}" -eq 1 && "${PREUPLOAD_FILES}" == "coverage" ]]; then 78 COVERAGE=true run_atest_unittests; exit $? 79else 80 for f in ${PREUPLOAD_FILES[@]}; do 81 # We only want to run this unittest if atest files have been touched. 82 if [[ $f == atest/* ]]; then 83 run_atest_unittests; exit $? 84 fi 85 done 86fi 87