• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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