 acec05060d
			
		
	
	acec05060d
	
	
	
		
			
			Change license to BSD-3-Clause Signed-off-by: Rafal Stefanowski <rafal.stefanowski@intel.com>
		
			
				
	
	
		
			541 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			541 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| #!/bin/bash
 | |
| 
 | |
| #
 | |
| # Copyright(c) 2012-2021 Intel Corporation
 | |
| # SPDX-License-Identifier: BSD-3-Clause
 | |
| #
 | |
| 
 | |
| export NAME=`basename $0`
 | |
| 
 | |
| export RESTORE='\033[0m'
 | |
| export RED='\033[00;31m'
 | |
| export GREEN='\033[00;32m'
 | |
| export YELLOW='\033[00;33m'
 | |
| 
 | |
| if [ -z $TESTS_DIR ] ; then
 | |
|     export TESTS_DIR="$(dirname $0)"
 | |
| fi
 | |
| 
 | |
| export LOGS_FOLDER="$TESTS_DIR/logs"
 | |
| 
 | |
| if [ -z "$TEST_LOG_DIR" ] ; then
 | |
|     export TEST_LOG_DIR="$TESTS_DIR/logs"
 | |
| fi
 | |
| export TEST_TIME=""
 | |
| 
 | |
| check_if_root_or_exit() {
 | |
|     if [[ $EUID -ne 0 ]] ; then
 | |
|         echo "You need to have root privileges to launch DVT tests"
 | |
|         exit 1
 | |
|     fi
 | |
| }
 | |
| 
 | |
| resolve_path() {
 | |
|     local BY_ID_DIR="/dev/disk/by-id"
 | |
|     local BY_ID_LINKS=$(ls $BY_ID_DIR)
 | |
| 
 | |
|     for BY_ID_PATH in $BY_ID_LINKS
 | |
|     do
 | |
|         FULL_PATH="${BY_ID_DIR}/${BY_ID_PATH}"
 | |
|         if [[ "$(realpath $FULL_PATH)" -ef "$(realpath $DEVICE)" ]]
 | |
|         then
 | |
|             DEVICE=$FULL_PATH
 | |
|             break
 | |
|         fi
 | |
|     done
 | |
| }
 | |
| 
 | |
| parse_args() {
 | |
|     while [ -n "$1" ] ; do
 | |
| 
 | |
|         case $1 in
 | |
|             -a | --all )        export TEST_MODE="all"
 | |
|                                 ;;
 | |
|             -x | --dir )        shift
 | |
|                                 export TEST_MODE="dir"
 | |
|                                 TEST_MODE_DIR="$1"
 | |
|                                 ;;
 | |
|             -b | --bvt )        export TEST_MODE="bvt"
 | |
|                                 ;;
 | |
|             -f | --atomic )     export TEST_MODE="atomic"
 | |
|                                 ;;
 | |
|             -n | --nightly )    export TEST_MODE="nightly"
 | |
|                                 ;;
 | |
|             -s | --sanity )     export TEST_MODE="sanity"
 | |
|                                 ;;
 | |
|             -i | --ignore )     export IGNORE_WARNINGS="1"
 | |
|                                 ;;
 | |
|             -c | --cache )      shift
 | |
|                                 DEVICE="$1"
 | |
|                                 resolve_path
 | |
|                                 CACHE_DEVICE=$DEVICE
 | |
|                                 ;;
 | |
|             -d | --core )       shift
 | |
|                                 DEVICE="$1"
 | |
|                                 resolve_path
 | |
|                                 CORE_DEVICE=$DEVICE
 | |
|                                 ;;
 | |
|             * )                 echo "Unrecognized option"
 | |
|                                 usage
 | |
|                                 exit 1
 | |
|         esac
 | |
|         shift
 | |
|     done
 | |
| }
 | |
| 
 | |
| usage() {
 | |
|     echo "example: ./${NAME} -b"
 | |
|     echo "  -a | --all - run all TESTS"
 | |
|     echo "  -b | --bvt - run BVT"
 | |
|     echo "  -n | --nightly - run nightly"
 | |
|     echo "  -s | --sanity - sanity check"
 | |
|     echo "  -i | --ignore - ignore config warnings"
 | |
|     echo "  -c | --cache - override cache device from settings file"
 | |
|     echo "  -d | --core - override core device from settings file"
 | |
|     echo "  -x | --dir <dir> - performs tests for specified directory (e.g. --dir basic)"
 | |
| }
 | |
| 
 | |
| load_cas_lib() {
 | |
|     if [ -z $CAS_CONFIGURATION_LOADED ] ; then
 | |
|         . $TESTS_DIR/cas_config
 | |
|     fi
 | |
|     if [ -z $CAS_FUNCTIONS_LOADED ] ; then
 | |
|         . $TESTS_DIR/cas_functions
 | |
|     fi
 | |
|     if [ -z $CAS_OPTIONS_LOADED ] ; then
 | |
|         . $TESTS_DIR/cas_options
 | |
|     fi
 | |
|     if [ -f ~/cas_local_config ] ; then
 | |
|         . ~/cas_local_config
 | |
|         echo "--- Using home config file ---"
 | |
|     elif [ -f $TESTS_DIR/cas_local_config ] ; then
 | |
|         . $TESTS_DIR/cas_local_config
 | |
|         echo "--- Using local config file ---"
 | |
|     fi
 | |
| }
 | |
| 
 | |
| start_test() {
 | |
|     if [ -z $LOG_FILE ] ; then
 | |
|         load_cas_lib
 | |
|     else
 | |
|         load_cas_lib >> $LOG_FILE
 | |
|     fi
 | |
|     parse_args $*
 | |
|     check_config
 | |
| 
 | |
|     if [ -z $DESCRIPTION ]
 | |
|     then
 | |
|         DESCRIPTION=$(cat $0 | grep "# DESCRIPTION" | sed 's/# DESCRIPTION //g')
 | |
|         export DESCRIPTION="$DESCRIPTION"
 | |
|     fi
 | |
| 
 | |
|     STORE_CONFIG_OPTION=1 clear_config
 | |
| 
 | |
|     clear_options
 | |
|     echo  "*** Starting test $0 - $DESCRIPTION ***"
 | |
|     TEST_TIME="$(date +%s)"
 | |
| }
 | |
| 
 | |
| end_test() {
 | |
|     TEST_TIME="$(($(date +%s) - TEST_TIME))"
 | |
|     echo  "*** Finished test $NAME ***"
 | |
|     echo  "*** The test took $TEST_TIME seconds ***"
 | |
|     echo "result : $1"
 | |
| 
 | |
|     restore_config
 | |
| 
 | |
|     if [ $1 -ne 0 ] ; then
 | |
|         # Try to cleanup in case of failure - it might not always work, but could help to
 | |
|         # execute remaining tests
 | |
|         umount ${CORE_DEVICE}* &>/dev/null
 | |
|         remove_caches
 | |
|         test_log_stop
 | |
|     fi
 | |
|     # Delete all temporary files
 | |
|     rm -rf $TMP_DIR/*
 | |
|     # Delete created symlinks for NVMes
 | |
|     if [[ $CACHE_DEVICE != "/dev/nvme"* ]] ; then
 | |
|         exit $1
 | |
|     fi
 | |
| 
 | |
|     local L_NVME_SYM_LINKS=`ls /dev/ | grep -E -w "${CACHE_DEVICE:5}[1-9][1-9]?"`
 | |
| 
 | |
|     for SYM_LINK in $L_NVME_SYM_LINKS
 | |
|     do
 | |
|             if [ -L "/dev/${SYM_LINK}" ]
 | |
|             then
 | |
|                 rm -f "/dev/${SYM_LINK}"
 | |
|             fi
 | |
|     done
 | |
| 
 | |
|     exit $1
 | |
| }
 | |
| 
 | |
| echo_green() {
 | |
|     echo -e "${GREEN}$*${RESTORE}"
 | |
| }
 | |
| 
 | |
| echo_red() {
 | |
|     echo -e "${RED}$*${RESTORE}"
 | |
| }
 | |
| 
 | |
| echo_yellow() {
 | |
|     echo -e "${YELLOW}$*${RESTORE}"
 | |
| }
 | |
| 
 | |
| echo_green_n() {
 | |
|     echo -ne "${GREEN}$*${RESTORE}"
 | |
| }
 | |
| 
 | |
| echo_red_n() {
 | |
|     echo -ne "${RED}$*${RESTORE}"
 | |
| }
 | |
| 
 | |
| echo_yellow_n() {
 | |
|     echo -ne "${YELLOW}$*${RESTORE}"
 | |
| }
 | |
| 
 | |
| success() {
 | |
|     echo -n "$*"
 | |
|     echo_green "[OK]"
 | |
| }
 | |
| 
 | |
| error() {
 | |
|     echo -n "$*"
 | |
|     echo_red "[ERROR]"
 | |
| }
 | |
| 
 | |
| not_run() {
 | |
|     echo -n "$*"
 | |
|     echo_yellow "[NOT RUN]"
 | |
| }
 | |
| 
 | |
| warning() {
 | |
|     echo -n "$*"
 | |
|     echo_yellow "[WARNING]"
 | |
| }
 | |
| 
 | |
| # This function should be used by all API wrappers and may be also used
 | |
| # directly in tests. It runs the command passed to it and checks the return
 | |
| # code against NEGATIVE_TEST_OPTION. If the NEGATIVE_TEST_OPTION is set, then
 | |
| # we assume the command should fail - otherwise the command should succeed.
 | |
| # If the output is correct, the command is printed and the test continues;
 | |
| # if not, we print an error message and end the test immediately.
 | |
| run_cmd() {
 | |
|     export RUN_CMD_OUTPUT=""
 | |
|     local L_RUN_CMD_START=$SECONDS
 | |
|     if [ -z "$SILENT_COMMAND_OPTION" ] ; then
 | |
|         echo -n "$(date +%Y-%m-%d_%H:%M:%S)  "
 | |
|         echo -n "Running $* "
 | |
|     fi
 | |
|     OUTPUT=$(eval "$*" 2>&1)
 | |
|     STATUS=$?
 | |
|     export RUN_CMD_OUTPUT="${OUTPUT}"
 | |
|     export RUN_CMD_TIME=$(( $SECONDS - $L_RUN_CMD_START ))
 | |
|     if [ -z "$SILENT_COMMAND_OPTION" ] ; then
 | |
|         if [ -n "$NEGATIVE_TEST_OPTION" ] && [ "$NEGATIVE_TEST_OPTION" -ne 0 ] ; then
 | |
|             echo -n "(negative test) "
 | |
|             if [ $STATUS -ne 0 ] ; then
 | |
|                 success
 | |
|             else
 | |
|                 error
 | |
|                 echo "--- Command output:"
 | |
|                 echo "$OUTPUT"
 | |
|                 if [ -z $DONT_FAIL_ON_ERROR_OPTION ]; then
 | |
|                     end_test 1
 | |
|                 fi
 | |
|                 return 1
 | |
|             fi
 | |
|         else
 | |
|             if [ $STATUS -eq 0 ]  ; then
 | |
|                 success
 | |
|             else
 | |
|                 error
 | |
|                 echo "--- Command output:"
 | |
|                 echo "$OUTPUT"
 | |
|                 if [ -z $DONT_FAIL_ON_ERROR_OPTION ]; then
 | |
|                     end_test 1
 | |
|                 fi
 | |
|                 return 1
 | |
|             fi
 | |
|         fi
 | |
|     fi
 | |
| }
 | |
| 
 | |
| # This function converts size to bytes amount. It takes one parameter and
 | |
| # the format of it is: [0-9][b|kB|kiB|k|M|MiB|MB|G|GiB|GB|T|TiB|TB]
 | |
| #
 | |
| # example of usage: BYTES=$(get_bytes 128kB)
 | |
| # return          : 128*1024 = 131,072
 | |
| #
 | |
| get_bytes () {
 | |
|     local PARAM
 | |
|     local FACTOR
 | |
|     local BYTES
 | |
| 
 | |
|     if [[ $1 =~ ^([0-9]*)$ ]] ; then
 | |
|         PARAM=${BASH_REMATCH[1]}
 | |
|         FACTOR=1
 | |
|     elif [[ $1 =~ ^(b)$ ]] ; then
 | |
|         PARAM=1
 | |
|         FACTOR=512
 | |
|     elif [[ $1 =~ ^([0-9]*)(b)$ ]] ; then
 | |
|         PARAM=${BASH_REMATCH[1]}
 | |
|         FACTOR=512
 | |
|     elif [[ $1 =~ ^(kB)$ ]] ; then
 | |
|         PARAM=1
 | |
|         FACTOR=1000
 | |
|     elif [[ $1 =~ ^(k|kiB)$ ]] ; then
 | |
|         PARAM=1
 | |
|         FACTOR=1024
 | |
|     elif [[ $1 =~ ^([0-9]*)(kB)$ ]] ; then
 | |
|         PARAM=${BASH_REMATCH[1]}
 | |
|         FACTOR=1000
 | |
|     elif [[ $1 =~ ^([0-9]*)(k|kiB)$ ]] ; then
 | |
|         PARAM=${BASH_REMATCH[1]}
 | |
|         FACTOR=1024
 | |
|     elif [[ $1 =~ ^(MB)$ ]] ; then
 | |
|         PARAM=1
 | |
|         FACTOR=1000*1000
 | |
|     elif [[ $1 =~ ^(M|MiB)$ ]] ; then
 | |
|         PARAM=1
 | |
|         FACTOR=1024*1024
 | |
|     elif [[ $1 =~ ^([0-9]*)(MB)$ ]] ; then
 | |
|         PARAM=${BASH_REMATCH[1]}
 | |
|         FACTOR=1000*1000
 | |
|     elif [[ $1 =~ ^([0-9]*)(M|MiB)$ ]] ; then
 | |
|         PARAM=${BASH_REMATCH[1]}
 | |
|         FACTOR=1024*1024
 | |
|     elif [[ $1 =~ ^(GB)$ ]] ; then
 | |
|         PARAM=1
 | |
|         FACTOR=1000*1000*1000
 | |
|     elif [[ $1 =~ ^(G|GiB)$ ]] ; then
 | |
|         PARAM=1
 | |
|         FACTOR=1024*1024*1024
 | |
|     elif [[ $1 =~ ^([0-9]*)(GB)$ ]] ; then
 | |
|         PARAM=${BASH_REMATCH[1]}
 | |
|         FACTOR=1000*1000*1000
 | |
|     elif [[ $1 =~ ^([0-9]*)(G|GiB)$ ]] ; then
 | |
|         PARAM=${BASH_REMATCH[1]}
 | |
|         FACTOR=1024*1024*1024
 | |
|     elif [[ $1 =~ ^(T|TiB)$ ]] ; then
 | |
|         PARAM=1
 | |
|         FACTOR=1024*1024*1024*1024
 | |
|     elif [[ $1 =~ ^(TB)$ ]] ; then
 | |
|         PARAM=1
 | |
|         FACTOR=1000*1000*1000*1000
 | |
|     elif [[ $1 =~ ^([0-9]*)(T|TiB)$ ]] ; then
 | |
|         PARAM=${BASH_REMATCH[1]}
 | |
|         FACTOR=1024*1024*1024*1024
 | |
|     elif [[ $1 =~ ^([0-9]*)(TB)$ ]] ; then
 | |
|         PARAM=${BASH_REMATCH[1]}
 | |
|         FACTOR=1000*1000*1000*1000
 | |
|     else
 | |
|         echo "Input parameter error, ($1) is not [0-9](b|kB|kiB|k|M|MiB|MB|G|GiB|GB|T|TiB|TB)"
 | |
|         exit 1
 | |
|     fi
 | |
| 
 | |
|     let BYTES=$PARAM*$FACTOR
 | |
| 
 | |
|     echo $BYTES
 | |
| }
 | |
| 
 | |
| # This function returns pages amount for specified byte size. It takes
 | |
| # folowing parameters:
 | |
| # size - size that will be computed to number of pages
 | |
| # [page_size] - optional, if ommited then page size is 4k
 | |
| #
 | |
| # example of usage: PAGES=$(get_bytes 128kB [$PAGE_SIZE=4k])
 | |
| # return          : 128kB / $PAGE_SIZE = 32
 | |
| #
 | |
| get_pages () {
 | |
|     local PAGES
 | |
|     local PAGE_SIZE
 | |
|     local BYTES
 | |
| 
 | |
|     if [ -z "$2" ]
 | |
|     then
 | |
|         PAGE_SIZE=4096
 | |
|     else
 | |
|         PAGE_SIZE=$2
 | |
|     fi
 | |
| 
 | |
|     PAGE_SIZE=$(get_bytes $PAGE_SIZE)
 | |
|     BYTES=$(get_bytes $1)
 | |
| 
 | |
|     let PAGES=$BYTES/$PAGE_SIZE
 | |
| 
 | |
|     echo $PAGES
 | |
| }
 | |
| 
 | |
| TEST_LOG_PID="${TEST_LOG_DIR}/.test_log_pid"
 | |
| 
 | |
| # Start print log to the STD
 | |
| #
 | |
| # usage:
 | |
| # test_log_tail <log file>
 | |
| test_log_tail () {
 | |
|     #
 | |
|     # Check if traicing in progress
 | |
|     #
 | |
|     if [ -f $TEST_LOG_PID ]
 | |
|     then
 | |
|         local L_PID=$(ps | grep tail | grep $(cat $TEST_LOG_PID))
 | |
|         if [ "" != "$L_PID" ]
 | |
|         then
 | |
|             return 0
 | |
|         fi
 | |
|     fi
 | |
| 
 | |
|     tail -f $1 &
 | |
|     echo $! > $TEST_LOG_PID
 | |
|     return 0
 | |
| }
 | |
| 
 | |
| # Test Log Utils Function
 | |
| # It shall be used in following order
 | |
| # test_log_start()
 | |
| #
 | |
| #
 | |
| # test_log_trace() # Do tracing
 | |
| #
 | |
| #
 | |
| # test_log_stop()
 | |
| #
 | |
| # Start trace loging. Function takes following parameters:
 | |
| # [TEST_LOG_FILE_NAME] File where log will be captured. If omitted log file name
 | |
| #                      id "cas_test_log"
 | |
| #
 | |
| # example of usage: test_log_start [$TEST_LOG_FILE_NAME]
 | |
| #
 | |
| test_log_start() {
 | |
|     if [ -n "$1" ]
 | |
|     then
 | |
|         export TEST_LOG="${TEST_LOG_DIR}/$1"
 | |
|     else
 | |
|         export TEST_LOG="${TEST_LOG_DIR}/cas_test_log_ext"
 | |
|     fi
 | |
| 
 | |
|     if [ ! -d $TEST_LOG_DIR ] ; then
 | |
|         mkdir -p $TEST_LOG_DIR
 | |
|     fi
 | |
|     echo >> $TEST_LOG
 | |
|     echo "********************************************************" >> $TEST_LOG
 | |
|     echo "* Test log start : $(date)"  >> $TEST_LOG
 | |
|     echo "* $DESCRIPTION - $TEST_LOG" >> $TEST_LOG
 | |
|     echo "********************************************************" >> $TEST_LOG
 | |
| 
 | |
|     if [ -z $DISABLE_EXTERNAL_LOGGING ]
 | |
|     then
 | |
|         test_log_tail $TEST_LOG
 | |
|     fi
 | |
| }
 | |
| 
 | |
| # Stop trace loging
 | |
| test_log_stop() {
 | |
| 
 | |
|     if [ -n "${TEST_LOG}" ]; then
 | |
|         echo "########################################################" >> $TEST_LOG
 | |
|         echo "* $DESCRIPTION - $TEST_LOG" >> $TEST_LOG
 | |
|         echo "# Test log stop : $(date)"  >> $TEST_LOG
 | |
|         echo "########################################################" >> $TEST_LOG
 | |
|         echo >> $TEST_LOG
 | |
|         sleep 1
 | |
|     fi
 | |
| 
 | |
|     if [ -f $TEST_LOG_PID ]
 | |
|     then
 | |
|         local L_PID=$(ps | grep tail | grep $(cat $TEST_LOG_PID))
 | |
|         if [ "" != "$L_PID" ]
 | |
|         then
 | |
|             kill $(cat $TEST_LOG_PID)
 | |
|             rm -f $TEST_LOG_PID
 | |
|         fi
 | |
|     fi
 | |
| }
 | |
| 
 | |
| #
 | |
| # Trace log message.
 | |
| #
 | |
| # example of usage: test_log_trace "Some message to store in file"
 | |
| #
 | |
| test_log_trace() {
 | |
|     if [[ ! -z $1 ]]
 | |
|     then
 | |
|         echo "$DESCRIPTION : $1" >> $TEST_LOG
 | |
|     fi
 | |
| }
 | |
| 
 | |
| set_categories() {
 | |
|      if [ "" != "$TEST_MODE_DIR" ]
 | |
|      then
 | |
|          export CATEGORIES=$TEST_MODE_DIR
 | |
|          return 0
 | |
|     fi
 | |
| 
 | |
|     local TMP_CATEGORIES="$(find $TESTS_DIR -type d | grep -v old | grep -v logs | grep -v ^.$)"
 | |
|     for CATEGORY in $TMP_CATEGORIES ; do
 | |
|         CATEGORIES="$(basename $CATEGORY) $CATEGORIES"
 | |
|     done
 | |
|     export CATEGORIES=$(echo $CATEGORIES | tr ' ' '\n' | sort | tr '\n' ' ' && echo)
 | |
| }
 | |
| 
 | |
| #
 | |
| # Warmup device
 | |
| #
 | |
| #param1 - Input
 | |
| #param2 - Output
 | |
| #param3 - Block Size
 | |
| #param4 - Count
 | |
| #param5 - Seek
 | |
| #param6 - Skip
 | |
| warmup() {
 | |
|     local L_IF=$1
 | |
|     local L_OF=$2
 | |
|     local L_BS=$3
 | |
|     local L_COUNT=$4
 | |
|     local L_SEEK=$5
 | |
|     local L_SKIP=$6
 | |
|     local I_SEEK
 | |
|     local I_SKIP
 | |
| 
 | |
|     if [ "$L_OF" = "/dev/null" ] ; then
 | |
|         DD_CONF='if=${L_IF} of=${L_OF} count=1 bs=${L_BS} skip=$I_SKIP iflag=direct'
 | |
|     else
 | |
|         DD_CONF='if=${L_IF} of=${L_OF} count=1 bs=${L_BS} seek=$I_SEEK skip=$I_SKIP oflag=direct iflag=direct conv=notrunc'
 | |
|     fi
 | |
| 
 | |
|     for (( I=0; I<$L_COUNT; I=I+2 ))
 | |
|     do
 | |
|         let I_SEEK=${L_SEEK}+${I}
 | |
|         let I_SKIP=${L_SKIP}+${I}
 | |
| 
 | |
|         eval "dd $DD_CONF &>/dev/null"
 | |
|         if [ $? != 0 ]
 | |
|         then
 | |
|             return 1
 | |
|         fi
 | |
|     done
 | |
| 
 | |
|     for (( I=1; I<$L_COUNT; I=I+2 ))
 | |
|     do
 | |
|         let I_SEEK=${L_SEEK}+${I}
 | |
|         let I_SKIP=${L_SKIP}+${I}
 | |
| 
 | |
|         eval "dd $DD_CONF &>/dev/null"
 | |
|         if [ $? != 0 ]
 | |
|         then
 | |
|             return 1
 | |
|         fi
 | |
|     done
 | |
| 
 | |
|     return 0
 | |
| }
 | |
| 
 | |
| cas_version () {
 | |
|     local L_CAS_VERSION=$(LANG=1 casadm -V -o csv 2>/dev/null | grep "CLI" | cut -d ',' -f2)
 | |
|     echo $L_CAS_VERSION
 | |
| }
 | |
| 
 | |
| check_if_root_or_exit
 |