Blame test/test_dax_kmem.sh

Packit 345191
#!/bin/bash
Packit 345191
#
Packit 345191
#  Copyright (C) 2019 - 2020 Intel Corporation.
Packit 345191
#  All rights reserved.
Packit 345191
#
Packit 345191
#  Redistribution and use in source and binary forms, with or without
Packit 345191
#  modification, are permitted provided that the following conditions are met:
Packit 345191
#  1. Redistributions of source code must retain the above copyright notice(s),
Packit 345191
#     this list of conditions and the following disclaimer.
Packit 345191
#  2. Redistributions in binary form must reproduce the above copyright notice(s),
Packit 345191
#     this list of conditions and the following disclaimer in the documentation
Packit 345191
#     and/or other materials provided with the distribution.
Packit 345191
#
Packit 345191
#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
Packit 345191
#  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
Packit 345191
#  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
Packit 345191
#  EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
Packit 345191
#  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit 345191
#  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
Packit 345191
#  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Packit 345191
#  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
Packit 345191
#  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
Packit 345191
#  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit 345191
#
Packit 345191
Packit 345191
basedir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
Packit 345191
PROGNAME=`basename $0`
Packit 345191
Packit 345191
# Default path (to installation dir of memkind-tests RPM)
Packit 345191
TEST_PATH="$basedir/"
Packit 345191
Packit 345191
# Gtest binaries
Packit 345191
GTEST_BINARIES=(dax_kmem_test)
Packit 345191
Packit 345191
# Pytest files
Packit 345191
PYTEST_FILES=(dax_kmem_env_var_test.py)
Packit 345191
Packit 345191
red=`tput setaf 1`
Packit 345191
green=`tput setaf 2`
Packit 345191
yellow=`tput setaf 3`
Packit 345191
default=`tput sgr0`
Packit 345191
Packit 345191
err=0
Packit 345191
Packit 345191
function usage () {
Packit 345191
   cat <
Packit 345191
Packit 345191
Usage: $PROGNAME [-h]
Packit 345191
Packit 345191
OPTIONS
Packit 345191
    -h,
Packit 345191
        display script usage
Packit 345191
EOF
Packit 345191
}
Packit 345191
Packit 345191
function emit() {
Packit 345191
    if [ "$LOG_FILE" != "" ]; then
Packit 345191
        echo "$@" 2>&1 | tee -a $LOG_FILE;
Packit 345191
    else
Packit 345191
        echo "$@"
Packit 345191
    fi
Packit 345191
}
Packit 345191
Packit 345191
function normalize_path {
Packit 345191
    local PATH=$1
Packit 345191
    if [ ! -d $PATH ];
Packit 345191
    then
Packit 345191
        echo "Not a directory: '$PATH'"
Packit 345191
        usage
Packit 345191
        exit 1
Packit 345191
    fi
Packit 345191
    if [[ $PATH != /* ]]; then
Packit 345191
        PATH=`pwd`/$PATH
Packit 345191
    fi
Packit 345191
    echo $PATH
Packit 345191
}
Packit 345191
Packit 345191
function show_skipped_tests()
Packit 345191
{
Packit 345191
    SKIP_PATTERN=$1
Packit 345191
    DEFAULT_IFS=$IFS
Packit 345191
Packit 345191
    # Search for gtests that match given pattern
Packit 345191
    for i in ${!GTEST_BINARIES[*]}; do
Packit 345191
        GTEST_BINARY_PATH=$TEST_PATH${GTEST_BINARIES[$i]}
Packit 345191
        for LINE in $($GTEST_BINARY_PATH --gtest_list_tests); do
Packit 345191
            if [[ $LINE == *. ]]; then
Packit 345191
                TEST_SUITE=$LINE;
Packit 345191
            else
Packit 345191
                if [[ "$TEST_SUITE$LINE" == *"$SKIP_PATTERN"* ]]; then
Packit 345191
                    emit "$TEST_SUITE$LINE,${yellow}SKIPPED${default}"
Packit 345191
                fi
Packit 345191
            fi
Packit 345191
        done
Packit 345191
    done
Packit 345191
Packit 345191
    # Search for pytests that match given pattern
Packit 345191
    for i in ${!PYTEST_FILES[*]}; do
Packit 345191
        PTEST_BINARY_PATH=$TEST_PATH${PYTEST_FILES[$i]}
Packit 345191
        IFS=$'\n'
Packit 345191
        for LINE in $(py.test $PTEST_BINARY_PATH --collect-only); do
Packit 345191
            if [[ $LINE == *"
Packit 345191
                TEST_SUITE=$(sed "s/^.*'\(.*\)'.*$/\1/" <<< $LINE)
Packit 345191
            elif [[ $LINE == *"
Packit 345191
                LINE=$(sed "s/^.*'\(.*\)'.*$/\1/" <<< $LINE)
Packit 345191
                if [[ "$TEST_SUITE.$LINE" == *"$SKIP_PATTERN"* ]]; then
Packit 345191
                    emit "$TEST_SUITE.$LINE,${yellow}SKIPPED${default}"
Packit 345191
                fi
Packit 345191
            fi
Packit 345191
        done
Packit 345191
    done
Packit 345191
Packit 345191
    IFS=$DEFAULT_IFS
Packit 345191
    emit ""
Packit 345191
}
Packit 345191
Packit 345191
function execute_gtest()
Packit 345191
{
Packit 345191
    ret_val=1
Packit 345191
    TESTCMD=$1
Packit 345191
    TEST=$2
Packit 345191
    # Apply filter (if provided)
Packit 345191
    if [ "$TEST_FILTER" != "" ]; then
Packit 345191
        if [[ $TEST != $TEST_FILTER ]]; then
Packit 345191
            return
Packit 345191
        fi
Packit 345191
    fi
Packit 345191
    # Concatenate test command
Packit 345191
    TESTCMD=$(printf "$TESTCMD" "$TEST""$SKIPPED_GTESTS""$RUN_DISABLED_GTEST")
Packit 345191
    # And test prefix if applicable
Packit 345191
    if [ "$TEST_PREFIX" != "" ]; then
Packit 345191
        TESTCMD=$(printf "$TEST_PREFIX" "$TESTCMD")
Packit 345191
    fi
Packit 345191
    OUTPUT=`eval $TESTCMD`
Packit 345191
    PATOK='.*OK ].*'
Packit 345191
    PATFAILED='.*FAILED  ].*'
Packit 345191
        PATSKIPPED='.*PASSED  ] 0.*'
Packit 345191
    if [[ $OUTPUT =~ $PATOK ]]; then
Packit 345191
        RESULT="$TEST,${green}PASSED${default}"
Packit 345191
        ret_val=0
Packit 345191
    elif [[ $OUTPUT =~ $PATFAILED ]]; then
Packit 345191
        RESULT="$TEST,${red}FAILED${default}"
Packit 345191
    elif [[ $OUTPUT =~ $PATSKIPPED ]]; then
Packit 345191
        RESULT="$TEST,${yellow}SKIPPED${default}"
Packit 345191
        ret_val=0
Packit 345191
    else
Packit 345191
        RESULT="$TEST,${red}CRASH${default}"
Packit 345191
    fi
Packit 345191
    if [ "$CSV" != "" ]; then
Packit 345191
        emit "$OUTPUT"
Packit 345191
        echo $RESULT >> $CSV
Packit 345191
    else
Packit 345191
        echo $RESULT
Packit 345191
    fi
Packit 345191
    return $ret_val
Packit 345191
}
Packit 345191
Packit 345191
function execute_pytest()
Packit 345191
{
Packit 345191
    ret=1
Packit 345191
    TESTCMD=$1
Packit 345191
    TEST_SUITE=$2
Packit 345191
    TEST=$3
Packit 345191
    # Apply filter (if provided)
Packit 345191
    if [ "$TEST_FILTER" != "" ]; then
Packit 345191
        if [[ $TEST_SUITE.$TEST != $TEST_FILTER ]]; then
Packit 345191
            return
Packit 345191
        fi
Packit 345191
    fi
Packit 345191
    # Concatenate test command
Packit 345191
    TESTCMD=$(printf "$TESTCMD" "$TEST$SKIPPED_PYTESTS")
Packit 345191
    # And test prefix if applicable
Packit 345191
    if [ "$TEST_PREFIX" != "" ]; then
Packit 345191
        TESTCMD=$(printf "$TEST_PREFIX" "$TESTCMD")
Packit 345191
    fi
Packit 345191
    OUTPUT=`eval $TESTCMD`
Packit 345191
    PATOK='.*1 passed.*'
Packit 345191
    PATFAILED='.*1 failed.*'
Packit 345191
    PATSKIPPED='.*deselected.*'
Packit 345191
    if [[ $OUTPUT =~ $PATOK ]]; then
Packit 345191
        RESULT="$TEST_SUITE.$TEST,${green}PASSED${default}"
Packit 345191
        ret=0
Packit 345191
    elif [[ $OUTPUT =~ $PATFAILED ]]; then
Packit 345191
        RESULT="$TEST_SUITE.$TEST,${red}FAILED${default}"
Packit 345191
    elif [[ $OUTPUT =~ $PATSKIPPED ]]; then
Packit 345191
        return 0
Packit 345191
    else
Packit 345191
        RESULT="$TEST_SUITE.$TEST,${red}CRASH${default}"
Packit 345191
    fi
Packit 345191
    if [ "$CSV" != "" ]; then
Packit 345191
        emit "$OUTPUT"
Packit 345191
        echo $RESULT >> $CSV
Packit 345191
    else
Packit 345191
        echo $RESULT
Packit 345191
    fi
Packit 345191
    return $ret
Packit 345191
}
Packit 345191
Packit 345191
#Check support for numa nodes (at least two)
Packit 345191
function check_numa()
Packit 345191
{
Packit 345191
    numactl --hardware | grep "^node 1" > /dev/null
Packit 345191
    if [ $? -ne 0 ]; then
Packit 345191
        echo "ERROR: $0 requires a NUMA enabled system with more than one node."
Packit 345191
        exit 1
Packit 345191
    fi
Packit 345191
}
Packit 345191
Packit 345191
#Check automatic support for persistent memory NUMA node - simulate one if no one was found
Packit 345191
function check_auto_dax_kmem_nodes()
Packit 345191
{
Packit 345191
    if [ ! -f /usr/bin/memkind-auto-dax-kmem-nodes ]; then
Packit 345191
        if [ -x ./memkind-auto-dax-kmem-nodes ]; then
Packit 345191
            export PATH=$PATH:$PWD
Packit 345191
        else
Packit 345191
            echo "Cannot find 'memkind-auto-dax-kmem-nodes' in $PWD. Did you run 'make'?"
Packit 345191
            exit 1
Packit 345191
        fi
Packit 345191
    fi
Packit 345191
Packit 345191
    ret=$(memkind-auto-dax-kmem-nodes)
Packit 345191
    emit "The binary memkind-auto-dax-kmem-nodes returned code $ret."
Packit 345191
    if [[ $ret == "" ]]; then
Packit 345191
        export MEMKIND_DAX_KMEM_NODES=1
Packit 345191
    fi
Packit 345191
}
Packit 345191
Packit 345191
#begin of main script
Packit 345191
Packit 345191
check_numa
Packit 345191
Packit 345191
check_auto_dax_kmem_nodes
Packit 345191
Packit 345191
OPTIND=1
Packit 345191
Packit 345191
while getopts ":h" opt; do
Packit 345191
    case "$opt" in
Packit 345191
        h)
Packit 345191
            usage;
Packit 345191
            exit 0;
Packit 345191
            ;;
Packit 345191
    esac
Packit 345191
done
Packit 345191
Packit 345191
TEST_PATH=`normalize_path "$TEST_PATH"`
Packit 345191
Packit 345191
# Clear any remnants of previous execution(s)
Packit 345191
rm -rf $CSV
Packit 345191
rm -rf $LOG_FILE
Packit 345191
Packit 345191
# Run tests written in gtest
Packit 345191
for i in ${!GTEST_BINARIES[*]}; do
Packit 345191
    GTEST_BINARY_PATH=$TEST_PATH${GTEST_BINARIES[$i]}
Packit 345191
    emit
Packit 345191
    emit "### Processing gtest binary '$GTEST_BINARY_PATH' ###"
Packit 345191
    for LINE in $($GTEST_BINARY_PATH --gtest_list_tests); do
Packit 345191
        if [[ $LINE == *. ]]; then
Packit 345191
            TEST_SUITE=$LINE;
Packit 345191
        else
Packit 345191
            TEST_CMD="$GTEST_BINARY_PATH --gtest_filter=%s 2>&1"
Packit 345191
            execute_gtest "$TEST_CMD" "$TEST_SUITE$LINE"
Packit 345191
            ret=$?
Packit 345191
            if [ $err -eq 0 ]; then err=$ret; fi
Packit 345191
        fi
Packit 345191
    done
Packit 345191
done
Packit 345191
Packit 345191
# Run tests written in pytest
Packit 345191
for i in ${!PYTEST_FILES[*]}; do
Packit 345191
    PTEST_BINARY_PATH=$TEST_PATH${PYTEST_FILES[$i]}
Packit 345191
    emit
Packit 345191
    emit "### Processing pytest file '$PTEST_BINARY_PATH' ###"
Packit 345191
    IFS=$'\n'
Packit 345191
    for LINE in $(py.test $PTEST_BINARY_PATH --collect-only); do
Packit 345191
        if [[ $LINE == *"
Packit 345191
            TEST_SUITE=$(sed "s/^.*'\(.*\)'.*$/\1/" <<< $LINE)
Packit 345191
        elif [[ $LINE == *"
Packit 345191
            LINE=$(sed "s/^.*'\(.*\)'.*$/\1/" <<< $LINE)
Packit 345191
            TEST_CMD="py.test $PTEST_BINARY_PATH -k='%s' 2>&1"
Packit 345191
            execute_pytest "$TEST_CMD" "$TEST_SUITE" "$LINE"
Packit 345191
            ret=$?
Packit 345191
            if [ $err -eq 0 ]; then err=$ret; fi
Packit 345191
        fi
Packit 345191
    done
Packit 345191
done
Packit 345191
Packit 345191
exit $err