1*800a58d9SAndroid Build Coastguard Worker#!/bin/bash 2*800a58d9SAndroid Build Coastguard Worker 3*800a58d9SAndroid Build Coastguard WorkerRED='\033[0;31m' 4*800a58d9SAndroid Build Coastguard WorkerGREEN='\033[0;32m' 5*800a58d9SAndroid Build Coastguard WorkerNC='\033[0m' # No Color 6*800a58d9SAndroid Build Coastguard WorkerACLOUD_DIR=$(dirname $(realpath $0)) 7*800a58d9SAndroid Build Coastguard WorkerTOOLS_DIR=$(dirname $ACLOUD_DIR) 8*800a58d9SAndroid Build Coastguard WorkerTHIRD_PARTY_DIR=$(dirname $TOOLS_DIR)/external/python 9*800a58d9SAndroid Build Coastguard Worker 10*800a58d9SAndroid Build Coastguard Workerfunction get_python_path() { 11*800a58d9SAndroid Build Coastguard Worker local python_path=$TOOLS_DIR 12*800a58d9SAndroid Build Coastguard Worker local third_party_libs=( 13*800a58d9SAndroid Build Coastguard Worker "apitools" 14*800a58d9SAndroid Build Coastguard Worker "dateutil" 15*800a58d9SAndroid Build Coastguard Worker "google-api-python-client" 16*800a58d9SAndroid Build Coastguard Worker "oauth2client" 17*800a58d9SAndroid Build Coastguard Worker ) 18*800a58d9SAndroid Build Coastguard Worker for lib in ${third_party_libs[*]}; 19*800a58d9SAndroid Build Coastguard Worker do 20*800a58d9SAndroid Build Coastguard Worker python_path=$THIRD_PARTY_DIR/$lib:$python_path 21*800a58d9SAndroid Build Coastguard Worker done 22*800a58d9SAndroid Build Coastguard Worker python_path=$python_path:$PYTHONPATH 23*800a58d9SAndroid Build Coastguard Worker echo $python_path 24*800a58d9SAndroid Build Coastguard Worker} 25*800a58d9SAndroid Build Coastguard Worker 26*800a58d9SAndroid Build Coastguard Workerfunction print_summary() { 27*800a58d9SAndroid Build Coastguard Worker local test_results=$1 28*800a58d9SAndroid Build Coastguard Worker local tmp_dir=$(mktemp -d) 29*800a58d9SAndroid Build Coastguard Worker local rc_file=${ACLOUD_DIR}/.coveragerc 30*800a58d9SAndroid Build Coastguard Worker PYTHONPATH=$(get_python_path) python -m coverage report -m 31*800a58d9SAndroid Build Coastguard Worker PYTHONPATH=$(get_python_path) python -m coverage html -d $tmp_dir --rcfile=$rc_file 32*800a58d9SAndroid Build Coastguard Worker echo "coverage report available at file://${tmp_dir}/index.html" 33*800a58d9SAndroid Build Coastguard Worker 34*800a58d9SAndroid Build Coastguard Worker if [[ $test_results -eq 0 ]]; then 35*800a58d9SAndroid Build Coastguard Worker echo -e "${GREEN}All unittests pass${NC}!" 36*800a58d9SAndroid Build Coastguard Worker else 37*800a58d9SAndroid Build Coastguard Worker echo -e "${RED}There was a unittest failure${NC}" 38*800a58d9SAndroid Build Coastguard Worker fi 39*800a58d9SAndroid Build Coastguard Worker} 40*800a58d9SAndroid Build Coastguard Worker 41*800a58d9SAndroid Build Coastguard Workerfunction run_unittests() { 42*800a58d9SAndroid Build Coastguard Worker local specified_tests=$@ 43*800a58d9SAndroid Build Coastguard Worker local rc=0 44*800a58d9SAndroid Build Coastguard Worker local run_cmd="python -m coverage run --append" 45*800a58d9SAndroid Build Coastguard Worker 46*800a58d9SAndroid Build Coastguard Worker # clear previously collected coverage data. 47*800a58d9SAndroid Build Coastguard Worker PYTHONPATH=$(get_python_path) python -m coverage erase 48*800a58d9SAndroid Build Coastguard Worker 49*800a58d9SAndroid Build Coastguard Worker # Get all unit tests under tools/acloud. 50*800a58d9SAndroid Build Coastguard Worker local all_tests=$(find $ACLOUD_DIR -type f -name "*_test.py" ! -name "acloud_test.py"); 51*800a58d9SAndroid Build Coastguard Worker local tests_to_run=$all_tests 52*800a58d9SAndroid Build Coastguard Worker 53*800a58d9SAndroid Build Coastguard Worker # Filter out the tests if specified. 54*800a58d9SAndroid Build Coastguard Worker if [[ ! -z $specified_tests ]]; then 55*800a58d9SAndroid Build Coastguard Worker tests_to_run=() 56*800a58d9SAndroid Build Coastguard Worker for t in $all_tests; 57*800a58d9SAndroid Build Coastguard Worker do 58*800a58d9SAndroid Build Coastguard Worker for t_pattern in $specified_tests; 59*800a58d9SAndroid Build Coastguard Worker do 60*800a58d9SAndroid Build Coastguard Worker if [[ "$t" =~ "$t_pattern" ]]; then 61*800a58d9SAndroid Build Coastguard Worker tests_to_run=("${tests_to_run[@]}" "$t") 62*800a58d9SAndroid Build Coastguard Worker fi 63*800a58d9SAndroid Build Coastguard Worker done 64*800a58d9SAndroid Build Coastguard Worker done 65*800a58d9SAndroid Build Coastguard Worker fi 66*800a58d9SAndroid Build Coastguard Worker 67*800a58d9SAndroid Build Coastguard Worker for t in $tests_to_run; 68*800a58d9SAndroid Build Coastguard Worker do 69*800a58d9SAndroid Build Coastguard Worker if ! PYTHONPATH=$(get_python_path):$PYTHONPATH $run_cmd $t; then 70*800a58d9SAndroid Build Coastguard Worker rc=1 71*800a58d9SAndroid Build Coastguard Worker echo -e "${RED}$t failed${NC}" 72*800a58d9SAndroid Build Coastguard Worker fi 73*800a58d9SAndroid Build Coastguard Worker done 74*800a58d9SAndroid Build Coastguard Worker 75*800a58d9SAndroid Build Coastguard Worker print_summary $rc 76*800a58d9SAndroid Build Coastguard Worker cleanup 77*800a58d9SAndroid Build Coastguard Worker exit $rc 78*800a58d9SAndroid Build Coastguard Worker} 79*800a58d9SAndroid Build Coastguard Worker 80*800a58d9SAndroid Build Coastguard Workerfunction check_env() { 81*800a58d9SAndroid Build Coastguard Worker if [ -z "$ANDROID_HOST_OUT" ]; then 82*800a58d9SAndroid Build Coastguard Worker echo "Missing ANDROID_HOST_OUT env variable. Run 'lunch' first." 83*800a58d9SAndroid Build Coastguard Worker exit 1 84*800a58d9SAndroid Build Coastguard Worker fi 85*800a58d9SAndroid Build Coastguard Worker if [ ! -f "$ANDROID_HOST_OUT/bin/aprotoc" ]; then 86*800a58d9SAndroid Build Coastguard Worker echo "Missing aprotoc. Run 'm aprotoc' first." 87*800a58d9SAndroid Build Coastguard Worker exit 1 88*800a58d9SAndroid Build Coastguard Worker fi 89*800a58d9SAndroid Build Coastguard Worker 90*800a58d9SAndroid Build Coastguard Worker local missing_py_packages=false 91*800a58d9SAndroid Build Coastguard Worker for py_lib in {coverage,mock}; 92*800a58d9SAndroid Build Coastguard Worker do 93*800a58d9SAndroid Build Coastguard Worker if ! python -m pip list | grep $py_lib &> /dev/null; then 94*800a58d9SAndroid Build Coastguard Worker echo "Missing required python package: $py_lib (python -m pip install $py_lib)" 95*800a58d9SAndroid Build Coastguard Worker missing_py_packages=true 96*800a58d9SAndroid Build Coastguard Worker fi 97*800a58d9SAndroid Build Coastguard Worker done 98*800a58d9SAndroid Build Coastguard Worker if $missing_py_packages; then 99*800a58d9SAndroid Build Coastguard Worker exit 1 100*800a58d9SAndroid Build Coastguard Worker fi 101*800a58d9SAndroid Build Coastguard Worker} 102*800a58d9SAndroid Build Coastguard Worker 103*800a58d9SAndroid Build Coastguard Workerfunction gen_proto_py() { 104*800a58d9SAndroid Build Coastguard Worker # Use aprotoc to generate python proto files. 105*800a58d9SAndroid Build Coastguard Worker local protoc_cmd=$ANDROID_HOST_OUT/bin/aprotoc 106*800a58d9SAndroid Build Coastguard Worker pushd $ACLOUD_DIR &> /dev/null 107*800a58d9SAndroid Build Coastguard Worker $protoc_cmd internal/proto/*.proto --python_out=./ 108*800a58d9SAndroid Build Coastguard Worker touch internal/proto/__init__.py 109*800a58d9SAndroid Build Coastguard Worker popd &> /dev/null 110*800a58d9SAndroid Build Coastguard Worker} 111*800a58d9SAndroid Build Coastguard Worker 112*800a58d9SAndroid Build Coastguard Workerfunction cleanup() { 113*800a58d9SAndroid Build Coastguard Worker # Search for *.pyc and delete them. 114*800a58d9SAndroid Build Coastguard Worker find $ACLOUD_DIR -name "*.pyc" -exec rm -f {} \; 115*800a58d9SAndroid Build Coastguard Worker 116*800a58d9SAndroid Build Coastguard Worker # Delete the generated proto files too. 117*800a58d9SAndroid Build Coastguard Worker find $ACLOUD_DIR/internal/proto -name "*.py" -exec rm -f {} \; 118*800a58d9SAndroid Build Coastguard Worker} 119*800a58d9SAndroid Build Coastguard Worker 120*800a58d9SAndroid Build Coastguard Workercheck_env 121*800a58d9SAndroid Build Coastguard Workercleanup 122*800a58d9SAndroid Build Coastguard Workergen_proto_py 123*800a58d9SAndroid Build Coastguard Workerrun_unittests $@ 124