
add lib functions for MPAM Signed-off-by: Wen Renjie <wenrenjie@huawei.com> --- testcases/feature-test/mpam/mpam_lib.sh | 84 +++++++++ testcases/feature-test/mpam/tst_test.sh | 229 ++++++++++++++++++++++++ 2 files changed, 313 insertions(+) create mode 100644 testcases/feature-test/mpam/mpam_lib.sh create mode 100755 testcases/feature-test/mpam/tst_test.sh diff --git a/testcases/feature-test/mpam/mpam_lib.sh b/testcases/feature-test/mpam/mpam_lib.sh new file mode 100644 index 00000000..0904c925 --- /dev/null +++ b/testcases/feature-test/mpam/mpam_lib.sh @@ -0,0 +1,84 @@ +#!/bin/bash + +. tst_test.sh +mpam_dir="/sys/fs/resctrl" + +# log file +LOG_MEMINFO="log_meminfo" + +ENV_L2_ID=() +ENV_L2_ID_NUM=0 +ENV_L3_ID=() +ENV_L3_ID_NUM=0 +ENV_NUMA_NUM=0 +ENV_CPU_NUM=0 + +RES_GROUP_MAX=31 # 32-1 +MON_GROUP_MAX=3 # 4-1 + +fn_get_env_l2_id(){ + local i found index list + + while read line; do + found=0 + for i in ${ENV_L2_ID[@]}; do + if [ "$i" == "$line" ]; then + found=1 + break + fi + done + if [ $found -eq 0 ]; then + ENV_L2_ID[${#ENV_L2_ID[@]}]=$line + fi + done < <(cat /sys/devices/system/cpu/cpu*/cache/index2/id) + + list=$(echo ${ENV_L2_ID[*]} | tr ' ' '\n' | sort -n) + + index=0 + for i in $list; do + ENV_L2_ID[$index]=$i + let index++ + done + + ENV_L2_ID_NUM=${#ENV_L2_ID[@]} +} + +fn_get_env_l3_id(){ + local i found index list + + while read line; do + found=0 + for i in ${ENV_L3_ID[@]}; do + if [ "$i" == "$line" ]; then + found=1 + break + fi + done + if [ $found -eq 0 ]; then + ENV_L3_ID[${#ENV_L3_ID[@]}]=$line + fi + done < <(cat /sys/devices/system/cpu/cpu*/cache/index3/id) + + list=$(echo ${ENV_L3_ID[*]} | tr ' ' '\n' | sort -n) + + index=0 + for i in $list; do + ENV_L3_ID[$index]=$i + let index++ + done + + ENV_L3_ID_NUM=${#ENV_L3_ID[@]} +} + +fn_get_env_numa_num(){ + ENV_NUMA_NUM=`lscpu | grep "NUMA node(s)" | awk '{print $3}'` +} + +fn_get_env_cpu_num(){ + ENV_CPU_NUM=`lscpu | grep "^CPU(s):" | awk '{print $2}'` +} + +fn_get_env_l2_id +fn_get_env_l3_id +fn_get_env_numa_num +fn_get_env_cpu_num \ No newline at end of file diff --git a/testcases/feature-test/mpam/tst_test.sh b/testcases/feature-test/mpam/tst_test.sh new file mode 100755 index 00000000..36cbc827 --- /dev/null +++ b/testcases/feature-test/mpam/tst_test.sh @@ -0,0 +1,229 @@ +#!/bin/bash +# +# This is a test library for shell. +# + +[ -n "$TST_LIB_LOADED" ] && return 0 + +export TST_PASS=0 +export TST_FAIL=0 +export TST_BROK=0 +export TST_WARN=0 +export TST_CONF=0 +export TST_COUNT=0 +export TST_COLOR_ENABLED=1 +export TST_LIB_LOADED=1 + +trap "tst_brk TBROK 'test interrupted'" INT + +tst_flag2color() +{ + local ansi_color_blue='\033[1;34m' + local ansi_color_green='\033[1;32m' + local ansi_color_magenta='\033[1;35m' + local ansi_color_red='\033[1;31m' + local ansi_color_yellow='\033[1;33m' + + case "$1" in + TPASS) printf $ansi_color_green;; + TFAIL) printf $ansi_color_red;; + TBROK) printf $ansi_color_red;; + TWARN) printf $ansi_color_magenta;; + TINFO) printf $ansi_color_blue;; + TCONF) printf $ansi_color_yellow;; + esac +} + +tst_color_enabled() +{ + [ $TST_COLOR_ENABLED -eq 1 ] && return 1 || return 0 +} + +tst_print_colored() +{ + tst_color_enabled + local color=$? + + [ "$color" = "1" ] && tst_flag2color "$1" + printf "$2" + [ "$color" = "1" ] && printf '\033[0m' +} + +tst_exit() +{ + local ret=0 + + if [ $TST_FAIL -gt 0 ]; then + ret=$((ret|1)) + fi + + if [ $TST_BROK -gt 0 ]; then + ret=$((ret|2)) + fi + + if [ $TST_WARN -gt 0 ]; then + ret=$((ret|4)) + fi + + if [ $TST_CONF -gt 0 ]; then + ret=$((ret|32)) + fi + + cat >&2 << EOF + +Summary: +passed $TST_PASS +failed $TST_FAIL +broken $TST_BROK +skipped $TST_CONF +warnings $TST_WARN +EOF + + exit $ret +} + +_tst_inc_res() +{ + case "$1" in + TPASS) TST_PASS=$((TST_PASS+1));; + TFAIL) TST_FAIL=$((TST_FAIL+1));; + TBROK) TST_BROK=$((TST_BROK+1));; + TWARN) TST_WARN=$((TST_WARN+1));; + TCONF) TST_CONF=$((TST_CONF+1));; + TINFO) ;; + *) tst_brk TBROK "Invalid res type '$1'";; + esac +} + +tst_res() +{ + local res=$1 + if type caller >/dev/null 2>&1;then + caller_info=$(caller 2) || + caller_info=$(caller 1) || + caller_info=$(caller 0) + + caller_info=$(echo "${caller_info}" | awk 'info=$NF":"$1 {print info}') + fi + + shift + + tst_color_enabled + local color=$? + + TST_COUNT=$(($TST_COUNT+1)) + + _tst_inc_res "$res" + printf "$(date) $TST_ID $TST_COUNT ${caller_info} " + tst_print_colored $res "$res: " + echo -e "$@" +} + +tst_brk() +{ + local res=$1 + shift + + tst_res "$res" "$@" + tst_exit +} + +tst_begin_test() +{ + if [ -w /dev/kmsg ]; then + export tst_date_time=`date +"%F %T%N"` + echo "run test at $tst_date_time" > /dev/kmsg + fi +} + +_dmesg_since_test_start() +{ + if which tac > /dev/null 2>&1; then + dmesg -T | tac | sed -ne "0,\#run test at $tst_date_time#p" | tac + else + dmesg -T >/dev/null 2>&1 && dmesg_cmd="dmesg -T" || dmesg_cmd="dmesg" + tac_cmd="awk '{ lines[NR] = \$0 } END { for (i = NR; i > 0; i--) print lines[i] }'" + eval "${dmesg_cmd} | ${tac_cmd} | sed -ne \"1,\#run test at ${tst_date_time}#p\" | ${tac_cmd}" + fi +} + +tst_check_dmesg_for() +{ + keywords=$@ + if [ -z "$keywords" ];then + tst_res TWARN "tst_check_dmesg_for parameter is null" + else + _dmesg_since_test_start | grep -E -q "$keywords" + fi +} + +_tst_expect_pass() +{ + local fnc="$1" + shift + + eval $@ + if [ $? -eq 0 ]; then + tst_res TPASS "$@ passed as expected" + return 0 + else + $fnc TFAIL "$@ failed unexpectedly" + return 1 + fi +} + +_tst_expect_fail() +{ + local fnc="$1" + shift + + eval $@ + if [ $? -ne 0 ]; then + tst_res TPASS "$@ failed as expected" + return 0 + else + $fnc TFAIL "$@ pass unexpectedly" + return 1 + fi +} + +tst_expect_pass() +{ + _tst_expect_pass tst_res "$@" +} + +tst_expect_fail() +{ + _tst_expect_fail tst_res "$@" +} + +# check dmesg log for WARNING/Oops/etc. +tst_check_dmesg() +{ + ret=$(_dmesg_since_test_start | grep -E -q \ + -e "kernel BUG at" \ + -e "WARNING:" \ + -e "BUG:" \ + -e "WARNING:" \ + -e "Oops:" \ + -e "possible recursive locking detected" \ + -e "Internal error" \ + -e "suspicious RCU usage" \ + -e "possible circular locking dependency detected" \ + -e "general protection fault" \ + -e "BUG.*remaining" \ + -e "UBSAN" \ + -e "KASAN" \ + -e "unregister_netdevice: waiting for" \ + -e "Call trace") + if [ $? -eq 0 ]; then + tst_res TWARN "_check_dmesg: something found in dmesg\n$(_dmesg_since_test_start)" + fi +} + +if [ -z "$TST_ID" ]; then + _tst_filename=$(basename $0) || \ + tst_brk TCONF "Failed to set TST_ID from \$0 ('$0')" + TST_ID=${_tst_filename%%.*} +fi +export TST_ID="$TST_ID" \ No newline at end of file -- 2.25.1