#!/bin/bash # # Copyright(c) 2012-2021 Intel Corporation # SPDX-License-Identifier: BSD-3-Clause-Clear # ############################################################ # GLOBALS # ############################################################ export LOG_FILE="" export LOG_NAME="out" export RESULT_FILE="result" export CUMULATIVE_LOG="cumulative_log" export EXEC_LOG="exec_log" export TESTS=0 export PASSED=0 export FAILED=0 export NOT_RUN=0 # Some tests might use additional logging mechanism - disable them in case we run the tests via this script. export DISABLE_EXTERNAL_LOGGING=1 ############################################################ # FUNCTIONS # ############################################################ check_result() { if [ $1 == 0 ]; then echo -n " " echo_green_n "[OK]" PASSED=$(($PASSED + 1)) TEST_RESULTS[$TESTS]="Passed" elif [ "$1" -eq "$CAS_TEST_NOT_RUN" ]; then echo_yellow_n "[NOT RUN]" NOT_RUN=$(($NOT_RUN + 1)) TEST_RESULTS[$TESTS]="Not_run" else echo -n " " echo_red_n "[ERROR]" FAILED=$(($FAILED+ 1)) TEST_RESULTS[$TESTS]="Failed" fi } print_time() { time=$1 hours=`expr $time / 3600` mins=`expr \( $time - $hours \* 3600 \) / 60` secs=`expr $time - $hours \* 3600 - $mins \* 60` printf "%5d[s] (%02d:%02d:%02d)" ${time} ${hours} ${mins} ${secs} } run_test() { TEST_FILE=$1 TEST_FILE_NAMES[$TESTS]=${TEST_FILE} TEST_NAMES[$TESTS]="$(basename $TEST_FILE)" # Ignore tests marked as not-working if [[ ${TEST_NAMES[$TESTS]} == _* ]] ; then return fi TEST_CATEGORIES[$TESTS]="$(dirname $TEST_FILE | sed 's/.*\///g')" DESCRIPTION=$(cat $TEST_FILE | grep "# DESCRIPTION" | sed 's/# DESCRIPTION //g') DESCRIPTION=${DESCRIPTION:0:80} if [ -z "$DESCRIPTION" ] ; then DESCRIPTION="${TEST_NAMES[$TESTS]} [NO DESCRIPTION]" fi TEST_DESCRIPTIONS[$TESTS]="$DESCRIPTION" printf "%3d. %-30s% -80s" $((TESTS+1)) "${TEST_FILE}" "$DESCRIPTION" | tee -a ${EXEC_LOG} # Clear system log dmesg -c &> /dev/null export TEST_LOG_DIR="${LOGS_FOLDER}/$TEST_FILE" if [ ! -d $TEST_LOG_DIR ] ; then mkdir -p $TEST_LOG_DIR fi export LOG_FILE=$TEST_LOG_DIR/$LOG_NAME # Execute test and save output to the log file TEST_TIME="$(date +%s)" # Check result and print to stdout bash $TEST_FILE >> $LOG_FILE status=$? check_result $status if [ $status == 0 ]; then echo -n " [OK]" >> ${EXEC_LOG} elif [ "$status" == "$CAS_TEST_NOT_RUN" ]; then echo -n "[NOT RUN]" >> ${EXEC_LOG} else echo -n " [ERROR]" >> ${EXEC_LOG} fi delta=$(($(date +%s) - TEST_TIME)) print_time ${delta} | tee -a ${EXEC_LOG} echo "" | tee -a ${EXEC_LOG} cat $LOG_FILE >> $LOGS_FOLDER/$CUMULATIVE_LOG # Store test time TEST_TIMES[$TESTS]="${delta}" # Print the kernel log echo "--- kernel log ---" | tee -a $LOGS_FOLDER/$CUMULATIVE_LOG >> $LOG_FILE dmesg | tee -a $LOGS_FOLDER/$CUMULATIVE_LOG >> $LOG_FILE echo "" | tee -a $LOGS_FOLDER/$CUMULATIVE_LOG >> $LOG_FILE # Increment the tests counter TESTS=$(($TESTS + 1)) } start_table() { printf "

%s tests

\n" ${2} >> ${1} printf "\n" >> ${1} printf "\t\n" >> ${1} printf "\t\t\n" "Test file name" >> ${1} printf "\t\t\n" "Test description" >> ${1} printf "\t\t\n" "Exec time" >> ${1} printf "\t\t\n" "Result" >> ${1} printf "\t\n" >> ${1} } stop_table() { printf "
%s%s%s%s

\n" >> ${1} } export_results_to_html() { HTML_PASSED_LOG="${LOG_FILE}-passed.html" HTML_FAILED_LOG="${LOG_FILE}-failed.html" HTML_NOT_RUN_LOG="${LOG_FILE}-not-run.html" HTML_LOG="${LOG_FILE}.html" BUILD=$(cas_version) IF=`route | grep default | tr -s ' ' | cut -d' ' -f8` IP=`ifconfig ${IF} | grep "inet " | tr -s ' ' | cut -d' ' -f3` HOSTNAME=`hostname` rm -f ${HTML_LOG} ${HTML_PASSED_LOG} ${HTML_FAILED_LOG} ${HTML_NOT_RUN_LOG} touch ${HTML_LOG} ${HTML_PASSED_LOG} ${HTML_FAILED_LOG} ${HTML_NOT_RUN_LOG} printf "

Summary for Open-CAS-%s

\n" "${BUILD}" >> ${HTML_LOG} printf "

Test mode: %s

\n" "${TEST_MODE}" >> ${HTML_LOG} printf "

HOST: %s (%s)

\n" "${IP}" "${HOSTNAME}" >> ${HTML_LOG} start_table ${HTML_PASSED_LOG} "PASSED" start_table ${HTML_FAILED_LOG} "FAILED" start_table ${HTML_NOT_RUN_LOG} "NOT_RUN" total_passed=0 total_failed=0 total_not_run=0 for ((I = 0; I < $TESTS; I++)) ; do if [ "${TEST_RESULTS[$I]}" == "Passed" ]; then COLOR="green" file=${HTML_PASSED_LOG} total_passed=$((${total_passed}+${TEST_TIMES[I]})) elif [ "${TEST_RESULTS[$I]}" == "Failed" ]; then COLOR="red" file=${HTML_FAILED_LOG} total_failed=$((${total_failed}+${TEST_TIMES[$I]})) else COLOR="yellow" file=${HTML_NOT_RUN_LOG} total_not_run=$((${total_not_run}+${TEST_TIMES[I]})) fi printf "\t\n" >> ${file} printf "\t\t%s\n" "${TEST_FILE_NAMES[$I]}" >> ${file} printf "\t\t%s\n" "${TEST_DESCRIPTIONS[$I]}" >> ${file} printf "\t\t%s\n" "`print_time ${TEST_TIMES[$I]}`" >> ${file} printf "\t\t%s\n" "${TEST_RESULTS[$I]}" >> ${file} printf "\t\n" >> ${file} done stop_table ${HTML_PASSED_LOG} stop_table ${HTML_FAILED_LOG} stop_table ${HTML_NOT_RUN_LOG} if [ ${PASSED} -gt 0 ]; then cat ${HTML_PASSED_LOG} >> ${HTML_LOG} fi if [ ${FAILED} -gt 0 ]; then cat ${HTML_FAILED_LOG} >> ${HTML_LOG} fi if [ ${NOT_RUN} -gt 0 ]; then cat ${HTML_NOT_RUN_LOG} >> ${HTML_LOG} fi printf "
\n" >> ${HTML_LOG} printf "

Time stats

\n" >> ${HTML_LOG} printf "\n" >> ${HTML_LOG} printf "\t\n" >> ${HTML_LOG} printf "\t\t\n" >> ${HTML_LOG} printf "\t\t\n" >> ${HTML_LOG} printf "\t\n" >> ${HTML_LOG} printf "\t\n" >> ${HTML_LOG} printf "\t\n" >> ${HTML_LOG} time=`print_time ${total_passed}` printf "\t\t\n" >> ${HTML_LOG} printf "\t\t\n" "${time}" >> ${HTML_LOG} printf "\t\t\n" ${PASSED} >> ${HTML_LOG} printf "\t\n" >> ${HTML_LOG} printf "\t\n" >> ${HTML_LOG} time=`print_time ${total_failed}` printf "\t\t\n" >> ${HTML_LOG} printf "\t\t\n" "${time}" >> ${HTML_LOG} printf "\t\t\n" ${FAILED} >> ${HTML_LOG} printf "\t\n" >> ${HTML_LOG} printf "\t\n" >> ${HTML_LOG} time=`print_time ${total_not_run}` printf "\t\t\n" >> ${HTML_LOG} printf "\t\t\n" "${time}" >> ${HTML_LOG} printf "\t\t\n" ${NOT_RUN} >> ${HTML_LOG} printf "\t\n" >> ${HTML_LOG} printf "\t\n" >> ${HTML_LOG} time=`print_time $((total_passed+total_failed+total_not_run))` printf "\t\t\n" >> ${HTML_LOG} printf "\t\t\n" "${time}" >> ${HTML_LOG} printf "\t\t\n" ${TESTS} >> ${HTML_LOG} printf "\t\n" >> ${HTML_LOG} printf "
NameTimeNumber
Passed%s%d
Failed%s%d
Not run%s%d
Total%s%d
\n" >> ${HTML_LOG} printf "

Detailed execution with order

\n" >> ${HTML_LOG} printf "
\n" >> ${HTML_LOG}
    cat ${EXEC_LOG} >> ${HTML_LOG}
    rm -f ${EXEC_LOG}
    printf "
\n" >> ${HTML_LOG} printf "
\n" >> ${HTML_LOG} printf "More details in %s\n" ${LOGS_FOLDER} >> ${HTML_LOG} cp ${HTML_LOG} ${LOGS_FOLDER}/results.html rm -f ${HTML_LOG} ${HTML_PASSED_LOG} ${HTML_FAILED_LOG} ${HTML_NOT_RUN_LOG} } add_header() { echo "" >> $1 echo "--- ${2} tests ---" >> $1 printf "%-16s %-10s %-80s %20s %10s\n" "Test group" "Name" "Test description" "Exec time" "Result" >> $1 for I in {0..139}; do echo -n '-' >> $1 done echo "" >> $1 } sum_up_and_exit() { TMP_PASSED="/tmp/cas_passed.txt" TMP_FAILED="/tmp/cas_failed.txt" TMP_NOT_RUN="/tmp/cas_not_run.txt" rm -f ${TMP_PASSED} ${TMP_FAILED} ${TMP_NOT_RUN} touch ${TMP_PASSED} ${TMP_FAILED} ${TMP_NOT_RUN} add_header ${TMP_PASSED} "PASSED" add_header ${TMP_FAILED} "FAILED" add_header ${TMP_NOT_RUN} "NOT_RUN" total_passed=0 total_failed=0 total_not_run=0 for ((I = 0; I < $TESTS; I++)) ; do if [ "${TEST_RESULTS[$I]}" == "Passed" ]; then file=${TMP_PASSED} total_passed=$((${total_passed}+${TEST_TIMES[I]})) elif [ "${TEST_RESULTS[$I]}" == "Failed" ]; then file=${TMP_FAILED} total_failed=$((${total_failed}+${TEST_TIMES[$I]})) else file=${TMP_NOT_RUN} total_not_run=$((${total_not_run}+${TEST_TIMES[$I]})) fi printf "%-16s %-10s %-80s %20s %10s\n" "${TEST_CATEGORIES[$I]}" "${TEST_NAMES[$I]}" "${TEST_DESCRIPTIONS[$I]}" "`print_time ${TEST_TIMES[$I]}`" "${TEST_RESULTS[$I]}" >> ${file} done if [ ${PASSED} -gt 0 ]; then cat ${TMP_PASSED} fi if [ ${FAILED} -gt 0 ]; then cat ${TMP_FAILED} fi if [ ${NOT_RUN} -gt 0 ]; then cat ${TMP_NOT_RUN} fi rm -f ${TMP_PASSED} ${TMP_FAILED} ${TMP_NOT_RUN} echo "" time=`print_time $((total_passed+total_failed))` tests_no=`printf "%3d" $TESTS` echo "Tests number: ${tests_no} ${time}" tests_no=`printf "%3d" $PASSED` echo_green_n "Passed: ${tests_no} " print_time ${total_passed} echo "" tests_no=`printf "%3d" $FAILED` echo_red_n "Failed: ${tests_no} " print_time ${total_failed} echo "" tests_no=`printf "%3d" $NOT_RUN` echo_yellow_n "Not run: ${tests_no} " print_time ${total_not_run} echo "" echo "" echo "More details in $LOGS_FOLDER" export_results_to_html if [ $(($PASSED + $NOT_RUN)) == $TESTS ] ; then exit 0 else exit 1 fi } ############################################################ # MAIN # ############################################################ BVT_TEST_HEADER="# USE_IN_BVT" NIGHTLY_TEST_HEADER="# USE_IN_NIGHTLY" ATOMIC_TEST_HEADER="# USE_IN_ATOMIC" TEST_FILE_PATTERN="[0-9*]*" TEST_MODE="" TEST_FILES="" TEST_NAMES="" TEST_DESCRIPTIONS="" TEST_RESULTS="" TESTS_DIR="$(dirname $0)" . $TESTS_DIR/cas_lib if [ $# -eq 0 ] ; then usage exit 1 fi load_cas_lib parse_args $* check_config set_categories case $TEST_MODE in "all" | "dir" ) for CATEGORY in $CATEGORIES ; do TEST_FILES="$(find $CATEGORY -type f -name "$TEST_FILE_PATTERN" | sort) $TEST_FILES" done ;; "sanity" ) TEST_FILES=$(find $TESTS_DIR/sandbox -type f -name "$TEST_FILE_PATTERN" | sort) ;; "bvt" ) for CATEGORY in $CATEGORIES ; do TEST_FILES="$TEST_FILES $(find $CATEGORY -type f -name "$TEST_FILE_PATTERN" | xargs grep -l "$BVT_TEST_HEADER" | sort)" done ;; "nightly" ) for CATEGORY in $CATEGORIES ; do TEST_FILES="$TEST_FILES $(find $CATEGORY -type f -name "$TEST_FILE_PATTERN" | xargs grep -l "$NIGHTLY_TEST_HEADER" | sort)" done ;; * ) echo "Unsupported test mode $TEST_MODE" exit 1 esac echo "--- Starting test mode $TEST_MODE ---" echo "" rm -f ${EXEC_LOG} touch ${EXEC_LOG} for TEST in $TEST_FILES ; do logger "[CAS][DVT] ~~~ $TEST ~~~ [START]" &>/dev/null run_test $TEST logger "[CAS][DVT] ~~~ $TEST ~~~ [END]" &>/dev/null done sum_up_and_exit | tee -a $LOGS_FOLDER/$RESULT_FILE exec_result=${PIPESTATUS[0]} rm -f ${EXEC_LOG} exit ${exec_result}