 acec05060d
			
		
	
	acec05060d
	
	
	
		
			
			Change license to BSD-3-Clause Signed-off-by: Rafal Stefanowski <rafal.stefanowski@intel.com>
		
			
				
	
	
		
			396 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			396 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| #
 | |
| # Copyright(c) 2012-2021 Intel Corporation
 | |
| # SPDX-License-Identifier: BSD-3-Clause
 | |
| #
 | |
| 
 | |
| ############################################################
 | |
| #                         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 "<h3>%s tests</h3>\n" ${2} >> ${1}
 | |
|     printf "<table style=\"width:100%%\">\n" >> ${1}
 | |
|     printf "\t<tr bgcolor=\"pink\" style=\"font-weight: bold\">\n" >> ${1}
 | |
|     printf "\t\t<td style=\"width: 20%%\">%s</td>\n" "Test file name" >> ${1}
 | |
|     printf "\t\t<td style=\"width: 60%%\">%s</td>\n" "Test description" >> ${1}
 | |
|     printf "\t\t<td style=\"width: 15%%\">%s</td>\n" "Exec time" >> ${1}
 | |
|     printf "\t\t<td>%s</td>\n" "Result" >> ${1}
 | |
|     printf "\t</tr>\n" >> ${1}
 | |
| }
 | |
| 
 | |
| stop_table() {
 | |
|     printf "</table><br />\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 "<h2>Summary for <u>Open-CAS-%s</u></h2>\n" "${BUILD}" >> ${HTML_LOG}
 | |
|     printf "<h2>Test mode: %s</h2>\n" "${TEST_MODE}" >> ${HTML_LOG}
 | |
|     printf "<h2>HOST: %s (%s)</h2>\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<tr>\n" >> ${file}
 | |
|         printf "\t\t<td>%s</td>\n" "${TEST_FILE_NAMES[$I]}" >> ${file}
 | |
|         printf "\t\t<td>%s</td>\n" "${TEST_DESCRIPTIONS[$I]}" >> ${file}
 | |
|         printf "\t\t<td>%s</td>\n" "`print_time ${TEST_TIMES[$I]}`" >> ${file}
 | |
|         printf "\t\t<td><font color=\"$COLOR\">%s</font></td>\n" "${TEST_RESULTS[$I]}" >> ${file}
 | |
|         printf "\t</tr>\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 "<br />\n" >> ${HTML_LOG}
 | |
| 
 | |
|     printf "<h3>Time stats</h3>\n" >> ${HTML_LOG}
 | |
|     printf "<table style=\"width: 500px\">\n" >> ${HTML_LOG}
 | |
| 
 | |
|     printf "\t<tr bgcolor=\"pink\" style=\"font-weight: bold\">\n" >> ${HTML_LOG}
 | |
|     printf "\t\t<td style=\"width: 40%%\">Name</td>\n" >> ${HTML_LOG}
 | |
|     printf "\t\t<td style=\"width: 40%%\">Time</td>\n" >> ${HTML_LOG}
 | |
|     printf "\t<td style=\"width: 20%%\">Number</td>\n" >> ${HTML_LOG}
 | |
|     printf "\t</tr>\n" >> ${HTML_LOG}
 | |
| 
 | |
|     printf "\t<tr>\n" >> ${HTML_LOG}
 | |
|     time=`print_time ${total_passed}`
 | |
|     printf "\t\t<td>Passed</td>\n" >> ${HTML_LOG}
 | |
|     printf "\t\t<td>%s</td>\n" "${time}" >> ${HTML_LOG}
 | |
|     printf "\t\t<td>%d</td>\n" ${PASSED} >> ${HTML_LOG}
 | |
|     printf "\t</tr>\n" >> ${HTML_LOG}
 | |
| 
 | |
|     printf "\t<tr>\n" >> ${HTML_LOG}
 | |
|     time=`print_time ${total_failed}`
 | |
|     printf "\t\t<td>Failed</td>\n" >> ${HTML_LOG}
 | |
|     printf "\t\t<td>%s</td>\n" "${time}" >> ${HTML_LOG}
 | |
|     printf "\t\t<td>%d</td>\n" ${FAILED} >> ${HTML_LOG}
 | |
|     printf "\t</tr>\n" >> ${HTML_LOG}
 | |
| 
 | |
|     printf "\t<tr>\n" >> ${HTML_LOG}
 | |
|     time=`print_time ${total_not_run}`
 | |
|     printf "\t\t<td>Not run</td>\n" >> ${HTML_LOG}
 | |
|     printf "\t\t<td>%s</td>\n" "${time}" >> ${HTML_LOG}
 | |
|     printf "\t\t<td>%d</td>\n" ${NOT_RUN} >> ${HTML_LOG}
 | |
|     printf "\t</tr>\n" >> ${HTML_LOG}
 | |
| 
 | |
|     printf "\t<tr style=\"font-weight: bold\">\n" >> ${HTML_LOG}
 | |
|     time=`print_time $((total_passed+total_failed+total_not_run))`
 | |
|     printf "\t\t<td>Total</td>\n" >> ${HTML_LOG}
 | |
|     printf "\t\t<td>%s</td>\n" "${time}" >> ${HTML_LOG}
 | |
|     printf "\t\t<td>%d</td>\n" ${TESTS} >> ${HTML_LOG}
 | |
|     printf "\t</tr>\n" >> ${HTML_LOG}
 | |
| 
 | |
|     printf "</table>\n" >> ${HTML_LOG}
 | |
| 
 | |
|     printf "<h3>Detailed execution with order</h3>\n" >> ${HTML_LOG}
 | |
| 
 | |
|     printf "<pre>\n" >> ${HTML_LOG}
 | |
|     cat ${EXEC_LOG} >> ${HTML_LOG}
 | |
|     rm -f ${EXEC_LOG}
 | |
|     printf "</pre>\n" >> ${HTML_LOG}
 | |
| 
 | |
|     printf "<br />\n" >> ${HTML_LOG}
 | |
| 
 | |
|     printf "<i>More details in %s</i>\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}
 |