#!/usr/bin/env bash set -a export SOURCE_HOME=`dirname "$0"` export SOURCE_HOME=`cd "$SOURCE_HOME/bigflow"; pwd` TARGET_DIR=$1 [ -z $TARGET_DIR ] && TARGET_DIR=. ERROR_LOG=$PWD/error_logs rm -rf $ERROR_LOG mkdir -p $ERROR_LOG FAILED=0 #environment #export PIPELINE_TYPE=hadoop #export HDFS_ROOT_PATH=hdfs:///app/inf/dataflow/unittest #export PARALLEL_RUN=1 function run_test() { local dir local filename dir=`dirname $1` filename=`basename $1` pushd $dir > /dev/null local LOGFILE=$PWD/${filename%.py}.test_log rm -rf $LOGFILE echo "Running test: $1" | tee -a $LOGFILE bash -c '"$SOURCE_HOME"/bin/pyrun $filename | tee ${LOGFILE}.stdout; exit ${PIPESTATUS[0]}' >$LOGFILE 2>&1 FAILED=$? if [ $(stat -c %s ${LOGFILE}.stdout) -ne 0 ]; then echo [FAIL] stdout should have been empty. echo Unexpected stdout in $1. The output is: cat ${LOGFILE}.stdout FAILED=-1 else echo [OK] As expected, stdout is empty. fi rm ${LOGFILE}.stdout cat $LOGFILE | grep "Warning" # Fail and exit on the first test failure. if [[ $FAILED != 0 ]]; then cat $LOGFILE | grep -v "^[0-9][0-9]*" # filter all lines starting with a number. echo -en "\033[31m" # Red echo "Had test failures; see logs at $ERROR_LOG/${filename%.py}.test_log" echo -en "\033[0m" # No color cp $LOGFILE $ERROR_LOG fi popd > /dev/null rm -rf $LOGFILE #[ $FAILED -ne 0 ] && exit -1 } function pp { echo "run $1" } function parallel_run_all_tests { # nohup $SOURCE_HOME/bin/bigflow_server --service_port=60019 > /dev/null 2>$1 < /dev/null & # SERVER_PID=$! # echo "PID: $SERVER_PID" local SLEEP_SEC=1 local PARALLEL_NUM=20 for target in `find ${TARGET_DIR} -name '*_test.py' -not -path '*/\.*' | grep -v python_runtime`; do run_test $target & while [ $(jobs | wc -l) -ge ${PARALLEL_NUM} ] do sleep ${SLEEP_SEC}s if [ -e $ERROR_LOG/* ]; then exit -1 fi done done wait if [ -e $ERROR_LOG/* ]; then exit -1 fi } function run_all_tests { # nohup $SOURCE_HOME/bin/bigflow_server --service_port=60019 > /dev/null 2>$1 < /dev/null & # SERVER_PID=$! # echo "PID: $SERVER_PID" for target in `find ${TARGET_DIR} -name '*_test.py' -not -path '*/\.*' | grep -v python_runtime`; do { # try run_test $target } || { # catch echo $target >> test_status.log } done } echo "Running Bigflow Python tests. Output is in $LOG_FILE." if [ "$PARALLEL_RUN" != "" ]; then parallel_run_all_tests "$1" else run_all_tests fi # wait all background job finishes if we already have failures. wait if [ -d ${ERROR_LOG} -a "$(ls -A ${ERROR_LOG})" ]; then # only display the last 500 lines of log in err_log tail -n 500 $ERROR_LOG/* exit -1 else echo -en "\033[32m" # Green echo "Tests passed." echo -en "\033[0m" # No color fi echo "Testing with Python version:" ${SOURCE_HOME}/bin/pyrun --version 1>/dev/null