• 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# There are 2 situations that we take care of:
19#   1. User wants to invoke this script directly.
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 get_pythonpath() {
31    echo "$ATEST_REAL_PATH:$PYTHONPATH"
32}
33
34function print_summary() {
35    local test_results=$1
36    if [[ $COVERAGE == true ]]; then
37        coverage report -m
38        coverage html
39    fi
40    if [[ $test_results -eq 0 ]]; then
41        echo -e "${GREEN}All unittests pass${NC}!"
42    else
43        echo -e "${RED}There was a unittest failure${NC}"
44    fi
45}
46
47function run_atest_unittests() {
48    echo "Running tests..."
49    local run_cmd="python"
50    local rc=0
51    if [[ $COVERAGE == true ]]; then
52        # Clear previously coverage data.
53        python -m coverage erase
54        # Collect coverage data.
55        run_cmd="coverage run --source $ATEST_REAL_PATH --append"
56    fi
57
58    for test_file in $(find $ATEST_DIR -name "*_unittest.py"); do
59        if ! PYTHONPATH=$(get_pythonpath) $run_cmd $test_file; then
60          rc=1
61          echo -e "${RED}$t failed${NC}"
62        fi
63    done
64    echo
65    print_summary $rc
66    return $rc
67}
68
69# Let's check if anything is passed in, if not we assume the user is invoking
70# script, but if we get a list of files, assume it's the PREUPLOAD hook.
71read -ra PREUPLOAD_FILES <<< "$@"
72if [[ ${#PREUPLOAD_FILES[@]} -eq 0 ]]; then
73    run_atest_unittests; exit $?
74elif [[ "${#PREUPLOAD_FILES[@]}" -eq 1 && "${PREUPLOAD_FILES}" == "coverage" ]]; then
75    COVERAGE=true run_atest_unittests; exit $?
76else
77    for f in ${PREUPLOAD_FILES[@]}; do
78        # We only want to run this unittest if atest files have been touched.
79        if [[ $f == atest/* ]]; then
80            run_atest_unittests; exit $?
81        fi
82    done
83fi
84