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