#!/system/bin/sh G_LOOP_COUNT=12 G_RECORD_LOCAL_CSV=TRUE G_VERBOSE_OUTPUT=FALSE G_RESULT_NOT_RECORD=FALSE F_RAW_DATA_CSV="/data/local/tmp/lava_test_shell_raw_data.csv" F_STATISTIC_DATA_CSV="/data/local/tmp/lava_test_shell_statistic_data.csv" var_test_func="" ## Description: ## output the max value of the passed 2 parameters ## Usage: ## f_max "${val1}" "${val2}" ## Example: ## max=$(f_max "1.5" "2.0") f_max(){ val1=$1 val2=$2 [ -z "$val1" ] && echo "$val2" [ -z "$val2" ] && echo "$val1" echo "$val1,$val2"|awk -F, '{if($1<$2) print $2; else print $1}' } ## Description: ## output the min value of the passed 2 parameters ## Usage: ## f_min "${val1}" "${val2}" ## Example: ## min=$(f_min "1.5" "2.0") f_min(){ val1=$1 val2=$2 [ -z "$val1" ] && echo "$val1" [ -z "$val2" ] && echo "$val2" echo "$val1,$val2"|awk -F, '{if($1>$2) print $2; else print $1}' } ## Description: ## calculate the average value for specified csv file. ## The first field of that csv file should be the key/name of that line, ## Lines have the same key should be together. ## Usage: ## statistic "${csv_file_path}" "${file_number}" ## Example: ## statistic "$f_res_starttime" 2 ## Note: ## if less than 4 samples for that key/item there, average will be calculated as total/count ## if 4 or more samples for that key/item there, average will be calculated with max and min excluded statistic(){ f_data=$1 if ! [ -f "$f_data" ]; then return fi field_no=$2 if [ -z "$field_no" ]; then field_no=2 fi total=0 max=0 min=0 old_key="" new_key="" count=0 units="" sort "${f_data}" >"${f_data}.sort" while read -r line; do line=$(echo "$line"|tr ' ' '~') if ! echo "$line"|grep -q ,; then continue fi new_key=$(echo "$line"|cut -d, -f1) measurement_units=$(echo "$line"|cut -d, -f${field_no}) if echo "${measurement_units}"|grep -q '~'; then value=$(echo "${measurement_units}"|cut -d~ -f1) else value=${measurement_units} fi if [ "X${new_key}" = "X${old_key}" ]; then total=$(echo "${total},${value}"|awk -F, '{printf "%.2f",$1+$2;}') count=$(echo "${count},1"|awk -F, '{printf $1+$2;}') max=$(f_max "$max" "$value") min=$(f_min "$min" "$value") else if [ "X${old_key}" != "X" ]; then if [ "${count}" -ge 4 ]; then average=$(echo "${total},${max},${min},$count"|awk -F, '{printf "%.2f",($1-$2-$3)/($4-2);}') else average=$(echo "${total},$count"|awk -F, '{printf "%.2f",$1/$2;}') fi if [ -z "${units}" ]; then echo "${old_key}=${average}" else echo "${old_key}=${average},${units}" fi fi total="${value}" max="${value}" min="${value}" old_key="${new_key}" count=1 if echo "${measurement_units}"|grep -q '~'; then units=$(echo "${measurement_units}"|cut -d~ -f2) else units="" fi fi done < "${f_data}.sort" if [ "X${new_key}" != "X" ]; then if [ $count -ge 4 ]; then average=$(echo "${total},${max},${min},$count"|awk -F, '{printf "%.2f",($1-$2-$3)/($4-2);}') else average=$(echo "${total},$count"|awk -F, '{printf "%.2f",$1/$2;}') fi if [ -z "${units}" ]; then echo "${new_key}=${average}" else echo "${new_key}=${average},${units}" fi fi rm "${f_data}.sort" } ## Description: ## output the test result to console and add for lava-test-shell, ## also write into one csv file for comparing manually ## Usage: ## output_test_result $test_name $result [ $measurement [ $units ] ] ## Note: ## G_RECORD_LOCAL_CSV: when this environment variant is set to "TRUE", ## the result will be recorded in a csv file in the following path: ## rawdata/final_result.csv ## G_VERBOSE_OUTPUT: when this environment variant is set to "TRUE", and only it is TRUE, ## the verbose informain about the result will be outputed output_test_result(){ test_name=$1 result=$2 measurement=$3 units=$4 if [ -z "${test_name}" ] || [ -z "$result" ]; then return fi output="" lava_paras="" output_csv="" if [ -z "$units" ]; then units="points" fi if [ -z "${measurement}" ]; then output="${test_name}=${result}" lava_paras="${test_name} --result ${result}" else output="${test_name}=${measurement} ${units}" lava_paras="${test_name} --result ${result} --measurement ${measurement} --units ${units}" output_csv="${test_name},${measurement} ${units}" fi if [ "X${G_VERBOSE_OUTPUT}" = "XTRUE" ];then echo "${output}" fi cmd="lava-test-case" if [ "X${G_RESULT_NOT_RECORD}" = "XFALSE" ] && [ -n "$(which $cmd)" ];then # shellcheck disable=SC2086 $cmd ${lava_paras} elif [ "X${G_VERBOSE_OUTPUT}" = "XTRUE" ];then echo "$cmd ${lava_paras}" fi if [ "X${G_RECORD_LOCAL_CSV}" = "XTRUE" ]; then if [ -n "${output_csv}" ]; then echo "${output_csv}">>${F_RAW_DATA_CSV} fi fi } func_print_usage_common(){ script_name=$(basename "$0") echo "${script_name} [--record-csv TRUE|others] [--loop-count LOOP_COUNT]" echo " --record-csv: specify if record the result in csv format in file ${F_RAW_DATA_CSV}" echo " Only record the file when TRUE is specified." echo " --loop-count: specify the number that how many times should be run for each application to get the average result, default is 12" echo " --verbose-output: output the result and lava-test-case command for each test case each time it is run" echo "${script_name} [--help|-h]" echo " print out this usage." } func_parse_parameters_common(){ para_loop_count="" while [ -n "$1" ]; do case "X$1" in X--record-csv) para_record_csv=$2 if [ -z "${para_record_csv}" ]; then echo "Please specify the value for --record-csv option" exit 1 fi shift 2 ;; X--verbose-output) para_verbose_output=$2 if [ -z "${para_verbose_output}" ]; then echo "Please specify the value for --verbose-output option" exit 1 fi shift 2 ;; X--loop-count) para_loop_count=$2 if [ -z "${para_loop_count}" ]; then echo "Please specify the value for --loop-count option" exit 1 fi shift 2 ;; X-h|X--help) func_print_usage_common exit 1 ;; X-*) echo "Unknown option: $1" func_print_usage_common exit 1 ;; X*) func_print_usage_common exit 1 ;; esac done if [ -n "${para_loop_count}" ]; then tmp_str=$(echo "${para_loop_count}"|tr -d '[:digit:]') if [ -z "${tmp_str}" ]; then G_LOOP_COUNT=${para_loop_count} else echo "The specified LOOP_COUNT(${para_loop_count}) is not valid" exit 1 fi fi if [ -n "${para_record_csv}" ] && [ "X${para_record_csv}" = "XTRUE" ];then G_RECORD_LOCAL_CSV=TRUE elif [ -n "${para_record_csv}" ];then G_RECORD_LOCAL_CSV=FALSE fi if [ -n "${para_verbose_output}" ] && [ "X${para_verbose_output}" = "XTRUE" ];then G_VERBOSE_OUTPUT=TRUE elif [ -n "${para_record_csv}" ];then G_VERBOSE_OUTPUT=FALSE fi } ## Description: ## common framework to run test multiple times ## also write result into one csv file for comparing manually ## Usage: ## output_test_result $test_name $result [ $measurement [ $units ] ] ## Note: ## RECORD_RESULT_LOCAL: when this environment variant is set to "TRUE", ## the result will be recorded in a csv file in the following path: ## rawdata/final_result.csv run_test(){ func_parse_parameters_common "$@" if [ "X${G_RECORD_LOCAL_CSV}" = "XTRUE" ]; then [ -f "${F_RAW_DATA_CSV}" ] && rm "${F_RAW_DATA_CSV}" [ -f "${F_STATISTIC_DATA_CSV}" ] && rm "${F_STATISTIC_DATA_CSV}" mkdir -p "$(dirname ${F_RAW_DATA_CSV})" fi loop_index=0 while [ "${loop_index}" -lt "${G_LOOP_COUNT}" ]; do if [ -n "${var_test_func}" ]; then ${var_test_func} fi loop_index=$((loop_index + 1)) done if [ "X${G_RECORD_LOCAL_CSV}" = "XTRUE" ]; then statistic ${F_RAW_DATA_CSV} 2 |tee ${F_STATISTIC_DATA_CSV} sed -i 's/=/,/' "${F_STATISTIC_DATA_CSV}" attach_cmd="lava-test-run-attach" if [ -n "$(which ${attach_cmd})" ]; then if [ -f "${F_RAW_DATA_CSV}" ]; then ${attach_cmd} ${F_RAW_DATA_CSV} text/plain fi if [ -f "${F_STATISTIC_DATA_CSV}" ]; then ${attach_cmd} ${F_STATISTIC_DATA_CSV} text/plain fi fi fi }