| #!/bin/bash |
| |
| RED='\033[0;31m' |
| GREEN='\033[0;32m' |
| NC='\033[0m' # No Color |
| ACLOUD_DIR=$(dirname $(realpath $0)) |
| TOOLS_DIR=$(dirname $ACLOUD_DIR) |
| THIRD_PARTY_DIR=$(dirname $TOOLS_DIR)/external/python |
| |
| function get_python_path() { |
| local python_path=$TOOLS_DIR |
| local third_party_libs=( |
| "apitools" |
| "dateutil" |
| "google-api-python-client" |
| "oauth2client" |
| ) |
| for lib in ${third_party_libs[*]}; |
| do |
| python_path=$THIRD_PARTY_DIR/$lib:$python_path |
| done |
| python_path=$python_path:$PYTHONPATH |
| echo $python_path |
| } |
| |
| function print_summary() { |
| local test_results=$1 |
| local tmp_dir=$(mktemp -d) |
| local rc_file=${ACLOUD_DIR}/.coveragerc |
| PYTHONPATH=$(get_python_path) python -m coverage report -m |
| PYTHONPATH=$(get_python_path) python -m coverage html -d $tmp_dir --rcfile=$rc_file |
| echo "coverage report available at file://${tmp_dir}/index.html" |
| |
| if [[ $test_results -eq 0 ]]; then |
| echo -e "${GREEN}All unittests pass${NC}!" |
| else |
| echo -e "${RED}There was a unittest failure${NC}" |
| fi |
| } |
| |
| function run_unittests() { |
| local specified_tests=$@ |
| local rc=0 |
| local run_cmd="python -m coverage run --append" |
| |
| # clear previously collected coverage data. |
| PYTHONPATH=$(get_python_path) python -m coverage erase |
| |
| # Get all unit tests under tools/acloud. |
| local all_tests=$(find $ACLOUD_DIR -type f -name "*_test.py" ! -name "acloud_test.py"); |
| local tests_to_run=$all_tests |
| |
| # Filter out the tests if specified. |
| if [[ ! -z $specified_tests ]]; then |
| tests_to_run=() |
| for t in $all_tests; |
| do |
| for t_pattern in $specified_tests; |
| do |
| if [[ "$t" =~ "$t_pattern" ]]; then |
| tests_to_run=("${tests_to_run[@]}" "$t") |
| fi |
| done |
| done |
| fi |
| |
| for t in $tests_to_run; |
| do |
| if ! PYTHONPATH=$(get_python_path):$PYTHONPATH $run_cmd $t; then |
| rc=1 |
| echo -e "${RED}$t failed${NC}" |
| fi |
| done |
| |
| print_summary $rc |
| cleanup |
| exit $rc |
| } |
| |
| function check_env() { |
| if [ -z "$ANDROID_HOST_OUT" ]; then |
| echo "Missing ANDROID_HOST_OUT env variable. Run 'lunch' first." |
| exit 1 |
| fi |
| if [ ! -f "$ANDROID_HOST_OUT/bin/aprotoc" ]; then |
| echo "Missing aprotoc. Run 'm aprotoc' first." |
| exit 1 |
| fi |
| |
| local missing_py_packages=false |
| for py_lib in {coverage,mock}; |
| do |
| if ! python -m pip list | grep $py_lib &> /dev/null; then |
| echo "Missing required python package: $py_lib (python -m pip install $py_lib)" |
| missing_py_packages=true |
| fi |
| done |
| if $missing_py_packages; then |
| exit 1 |
| fi |
| } |
| |
| function gen_proto_py() { |
| # Use aprotoc to generate python proto files. |
| local protoc_cmd=$ANDROID_HOST_OUT/bin/aprotoc |
| pushd $ACLOUD_DIR &> /dev/null |
| $protoc_cmd internal/proto/*.proto --python_out=./ |
| touch internal/proto/__init__.py |
| popd &> /dev/null |
| } |
| |
| function cleanup() { |
| # Search for *.pyc and delete them. |
| find $ACLOUD_DIR -name "*.pyc" -exec rm -f {} \; |
| |
| # Delete the generated proto files too. |
| find $ACLOUD_DIR/internal/proto -name "*.py" -exec rm -f {} \; |
| } |
| |
| check_env |
| cleanup |
| gen_proto_py |
| run_unittests $@ |