From 0b1270d4d33fffdf35f479454b2300b976ffd3c8 Mon Sep 17 00:00:00 2001 From: Jason Lee Date: Tue, 12 Sep 2023 14:16:14 -0600 Subject: [PATCH] Run ShellSheck in Actions updated scripts to fix issues --- .github/workflows/ci.yml | 18 +++- src/bx/test_bxt.sh | 28 +++-- tests/common.sh | 52 ++++----- tests/debug/test_xdd_debug_init.sh | 16 +-- tests/functional/test_xdd_createnewfiles.sh | 18 ++-- tests/functional/test_xdd_createnewfiles2.sh | 18 ++-- tests/functional/test_xdd_heartbeat_byte.sh | 102 ++++++++---------- .../functional/test_xdd_heartbeat_elapsed.sh | 29 +++-- tests/functional/test_xdd_heartbeat_lf.sh | 17 ++- tests/functional/test_xdd_heartbeat_output.sh | 17 +-- tests/functional/test_xdd_heartbeat_target.sh | 24 ++--- tests/functional/test_xdd_heartbeat_tod.sh | 61 ++++++----- tests/functional/test_xdd_lockstep1.sh | 26 ++--- tests/functional/test_xdd_lockstep2.sh | 15 ++- tests/functional/test_xdd_passdelay.sh | 19 ++-- tests/functional/test_xdd_pretruncate.sh | 16 +-- tests/functional/test_xdd_reopen.sh | 40 +++---- tests/functional/test_xdd_runtime.sh | 25 +++-- tests/functional/test_xdd_startdelay.sh | 19 ++-- tests/functional/test_xdd_startoffset.sh | 18 ++-- tests/functional/test_xdd_syncwrite.sh | 17 +-- tests/functional/test_xdd_timelimit.sh | 30 +++--- 22 files changed, 303 insertions(+), 322 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2b390a41..108dba38 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: run: contrib/CI/centos8.sh - name: Configure - run: cmake -B ${{github.workspace}}/build + run: cmake -B ${{github.workspace}}/build - name: Make run: make -C ${{github.workspace}}/build @@ -38,6 +38,18 @@ jobs: run: make -C ${{github.workspace}}/build install - name: Run Tests - run: | - cd ${{github.workspace}}/build + run: | + cd ${{github.workspace}}/build ctest --output-on-failure + + shellcheck: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: apt update + run: sudo apt-get update + - name: Install ShellCheck + run: sudo apt -y install shellcheck + - name: Run ShellCheck + run: shellcheck -s bash -e SC1091 $(find -name "*.sh" | sort) diff --git a/src/bx/test_bxt.sh b/src/bx/test_bxt.sh index 89af4847..f3770ff7 100755 --- a/src/bx/test_bxt.sh +++ b/src/bx/test_bxt.sh @@ -1,15 +1,15 @@ -/* - * XDD - a data movement and benchmarking toolkit - * - * Copyright (C) 1992-23 I/O Performance, Inc. - * Copyright (C) 2009-23 UT-Battelle, LLC - * - * This is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License version 2, as published by the Free Software - * Foundation. See file COPYING. - * - */ +# +# XDD - a data movement and benchmarking toolkit +# +# Copyright (C) 1992-23 I/O Performance, Inc. +# Copyright (C) 2009-23 UT-Battelle, LLC +# +# This is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public +# License version 2, as published by the Free Software +# Foundation. See file COPYING. +# +# # --target # #WorkerThreads # --target # #WorkerThreads file # --target # #WorkerThreads network @@ -19,7 +19,3 @@ --target 2 out 2 file /tmp/test_output_file2 1234567 1048576 bio \ --buffers 3 \ --sequence 0 1 2 - - - - diff --git a/tests/common.sh b/tests/common.sh index 2ded81de..d1c0bbcf 100644 --- a/tests/common.sh +++ b/tests/common.sh @@ -11,8 +11,11 @@ # - generates correct test data files # - generates correct test file names # +# +# curly braces with global variables +# break in this file for some reason -TESTNAME=$(basename $0 |cut -f 1 -d .) +TESTNAME=$(basename "$0" | cut -f 1 -d .) common_next_file="" # @@ -20,20 +23,19 @@ common_next_file="" # initialize_test() { # Ensure that the test config has been sourced - if [ -z "$XDDTEST_LOG_DIR" ]; then + if [[ -z "$XDDTEST_LOG_DIR" ]]; then echo "No properly sourced test_config during initialization. Missing log file path." finalize_test 2 fi # Create directories associated with local tests - mkdir -p $XDDTEST_LOCAL_MOUNT/$TESTNAME - if [ 0 -ne $? ]; then + if ! mkdir -p "$XDDTEST_LOCAL_MOUNT/$TESTNAME" ; then echo "Unable to create $XDDTEST_LOCAL_MOUNT/$TESTNAME" finalize_test 2 fi # Create the log directory - mkdir -p $XDDTEST_LOG_DIR + mkdir -p "$XDDTEST_LOG_DIR" # Initialize the uid for data files common_next_file="0" @@ -51,10 +53,10 @@ finalize_test() { local message=$@ local rc=1 - if [ $status -eq 0 ]; then + if [[ "${status}" -eq "0" ]]; then pass rc=0 - elif [ $status -eq -1 ]; then + elif [[ "${status}" -eq "-1" ]]; then skip $message rc=255 else @@ -62,7 +64,7 @@ finalize_test() { fi cleanup_test_data - exit $rc + exit ${rc} } # @@ -78,8 +80,8 @@ get_log_file() { generate_local_filename() { local varname="$1" local name="$XDDTEST_LOCAL_MOUNT/$TESTNAME/file${common_next_file}.tdt" - eval "$varname=$name" - common_next_file=$((common_next_file + 1)) + eval "${varname}=${name}" + common_next_file="$((common_next_file + 1))" return 0 } @@ -90,31 +92,32 @@ generate_local_file() { local varname="$1" local size="$2" - if [ -z "$size" ]; then + if [[ -z "${size}" ]]; then echo "No test file data size specified." finalize_test 2 fi local lfname="" generate_local_filename lfname - $XDDTEST_XDD_EXE -op write -target $lfname -reqsize 1 -blocksize $((1024*1024)) -bytes $size -datapattern random >/dev/null 2>&1 + "${XDDTEST_XDD_EXE}" -op write -target "${lfname}" -reqsize 1 -blocksize "$((1024*1024))" -bytes "${size}" -datapattern random >/dev/null 2>&1 # Ensure the file size is correct - asize=$($XDDTEST_XDD_GETFILESIZE_EXE $lfname) - if [ "$asize" != "$size" ]; then - echo "Unable to generate test file data of size: $size" + # shellcheck disable=SC2086 + asize="$(${XDDTEST_XDD_GETFILESIZE_EXE} ${lfname})" + if [[ "${asize}" != "${size}" ]]; then + echo "Unable to generate test file data of size: ${size}" finalize_test 2 fi # Ensure the file isn't all zeros read -r -n 4 < /dev/zero - local data=$REPLY - read -r -n 4 < $lfname - if [ "$REPLY" = "$data" ]; then + local data="${REPLY}" + read -r -n 4 < "${lfname}" + if [[ "${REPLY}" = "${data}" ]]; then echo "Unable to generate random test file data" finalize_test 2 fi - eval "$varname=$lfname" + eval "${varname}=${lfname}" return 0 } @@ -123,7 +126,8 @@ generate_local_file() { # cleanup_test_data() { # Remove files associated with local tests - rm -r $XDDTEST_LOCAL_MOUNT/$TESTNAME + # shellcheck disable=SC2115 + rm -r "$XDDTEST_LOCAL_MOUNT/$TESTNAME" } # @@ -131,20 +135,20 @@ cleanup_test_data() { # fail() { local message=$@ - printf "%-20s\t%10s: %s\n" $TESTNAME "FAIL" "$message" + printf "%-20s\t%10s: %s\n" "$TESTNAME" "FAIL" "$message" } # # Indicate a test has passed # pass() { - printf "%-20s\t%10s\n" $TESTNAME "PASS" + printf "%-20s\t%10s\n" "$TESTNAME" "PASS" } # # Indicate a test was skipped # skip() { - local message=$@ - printf "%-20s\t%10s: %s\n" $TESTNAME "SKIPPED" "$message" + local message="$@" + printf "%-20s\t%10s: %s\n" "$TESTNAME" "SKIPPED" "$message" } diff --git a/tests/debug/test_xdd_debug_init.sh b/tests/debug/test_xdd_debug_init.sh index fbfc6b77..f10ef1de 100755 --- a/tests/debug/test_xdd_debug_init.sh +++ b/tests/debug/test_xdd_debug_init.sh @@ -14,21 +14,9 @@ source ../common.sh initialize_test -${XDDTEST_XDD_EXE} -op write -reqsize 128 -numreqs 1 -targets 1 /dev/null -verbose -debug INIT \ - 2>&1 | grep "bound to NUMA node" +("${XDDTEST_XDD_EXE}" -op write -reqsize 128 -numreqs 1 -targets 1 /dev/null -verbose -debug INIT 2>&1 | grep "bound to NUMA node") || finalize_test 1 "XDD output is missing NUMA node pinning info" -if [[ $? -ne 0 ]]; then - # test failed - finalize_test 1 "XDD output is missing NUMA node pinning info" -fi - -${XDDTEST_XDD_EXE} -op write -reqsize 128 -numreqs 1 -targets 1 /dev/null -verbose \ - 2>&1 | grep "bound to NUMA node" - -if [[ $? -ne 1 ]]; then - # test failed - finalize_test 1 "XDD output should not have NUMA node pinning info because -debug INIT was not used" -fi +("${XDDTEST_XDD_EXE}" -op write -reqsize 128 -numreqs 1 -targets 1 /dev/null -verbose 2>&1 | grep "bound to NUMA node") || finalize_test 1 "XDD output should not have NUMA node pinning info because -debug INIT was not used" # test passed finalize_test 0 diff --git a/tests/functional/test_xdd_createnewfiles.sh b/tests/functional/test_xdd_createnewfiles.sh index daa8e263..78d1a41d 100755 --- a/tests/functional/test_xdd_createnewfiles.sh +++ b/tests/functional/test_xdd_createnewfiles.sh @@ -14,31 +14,31 @@ source ../common.sh # Create the test location initialize_test -data_file=$XDDTEST_LOCAL_MOUNT/$TESTNAME/test +data_file="${XDDTEST_LOCAL_MOUNT}/${TESTNAME}"/test # ReqSize 4096, Bytes 1GiB, Targets 1, QueueDepth 4, Passes 4 -$XDDTEST_XDD_EXE -op write -reqsize 4096 -mbytes 1024 -targets 1 $data_file -qd 4 -createnewfiles -passes 4 -datapattern random +"${XDDTEST_XDD_EXE}" -op write -reqsize 4096 -mbytes 1024 -targets 1 "${data_file}" -qd 4 -createnewfiles -passes 4 -datapattern random # Validate output test_passes=1 correct_size=1073741824 error_message="" -data_files="$data_file.00000001 $data_file.00000002 $data_file.00000003 $data_file.00000004" -for f in $data_files; do - file_size=$(stat -c %s $f) - if [ "$correct_size" != "$file_size" ]; then +data_files="${data_file}.00000001 ${data_file}.00000002 ${data_file}.00000003 ${data_file}.00000004" +for f in ${data_files}; do + file_size=$(stat -c '%s' "${f}") + if [[ "${correct_size}" != "${file_size}" ]]; then test_passes=0 - error_message="Incorrect file size for $f. Size is $file_size but should be $correct_size." + error_message="Incorrect file size for ${f}. Size is $file_size but should be ${correct_size}." break fi done # Output test result -if [ "1" == "$test_passes" ]; then +if [[ "1" == "${test_passes}" ]]; then # test passed finalize_test 0 else # test failed - finalize_test 1 "$error_message" + finalize_test 1 "${error_message}" fi diff --git a/tests/functional/test_xdd_createnewfiles2.sh b/tests/functional/test_xdd_createnewfiles2.sh index b8234133..979a611c 100755 --- a/tests/functional/test_xdd_createnewfiles2.sh +++ b/tests/functional/test_xdd_createnewfiles2.sh @@ -13,30 +13,30 @@ source ../test_config source ../common.sh initialize_test -data_file=$XDDTEST_LOCAL_MOUNT/$TESTNAME/test +data_file="${XDDTEST_LOCAL_MOUNT}/${TESTNAME}/test" # ReqSize 4096, Bytes 1GiB, Targets 1, QueueDepth 4, Passes 4 -$XDDTEST_XDD_EXE -op write -reqsize 4096 -bytes 100000000 -targets 1 $data_file -qd 4 -createnewfiles -passes 4 -datapattern random -dio +"${XDDTEST_XDD_EXE}" -op write -reqsize 4096 -bytes 100000000 -targets 1 "${data_file}" -qd 4 -createnewfiles -passes 4 -datapattern random -dio # Validate output test_passes=1 correct_size=100000000 error_message="" -data_files="$data_file.00000001 $data_file.00000002 $data_file.00000003 $data_file.00000004" -for f in $data_files; do - file_size=$(stat -c %s $f) - if [ "$correct_size" != "$file_size" ]; then +data_files="${data_file}.00000001 ${data_file}.00000002 ${data_file}.00000003 ${data_file}.00000004" +for f in ${data_files}; do + file_size=$(stat -c '%s' "${f}") + if [[ "${correct_size}" != "${file_size}" ]]; then test_passes=0 - error_message="Incorrect file size for $f. Size is $file_size but should be $correct_size." + error_message="Incorrect file size for ${f}. Size is ${file_size} but should be ${correct_size}." fi done # Output test result -if [ "1" == "$test_passes" ]; then +if [[ "1" == "${test_passes}" ]]; then # test passed finalize_test 0 else # test failed - finalize_test 1 "$error_message" + finalize_test 1 "${error_message}" fi diff --git a/tests/functional/test_xdd_heartbeat_byte.sh b/tests/functional/test_xdd_heartbeat_byte.sh index 2149a9a7..5466fe8b 100755 --- a/tests/functional/test_xdd_heartbeat_byte.sh +++ b/tests/functional/test_xdd_heartbeat_byte.sh @@ -12,11 +12,11 @@ source ../common.sh # Pre-test set-up initialize_test -test_file=$XDDTEST_LOCAL_MOUNT/$TESTNAME/data1 -test_dir=$XDDTEST_LOCAL_MOUNT/$TESTNAME -log_file=$(get_log_file) +test_file="${XDDTEST_LOCAL_MOUNT}/${TESTNAME}/data1" +test_dir="${XDDTEST_LOCAL_MOUNT}/${TESTNAME}" +log_file="$(get_log_file)" -os=`uname` +os="$(uname)" xdd_byte_cmd="-hb bytes -hb kbytes -hb mbytes -hb gbytes" req_size=2000 @@ -25,96 +25,86 @@ block_size=1024 times_test=0 -$XDDTEST_XDD_EXE -target $test_file -op write -reqsize $req_size -numreqs $num_reqs -blocksize $block_size $xdd_byte_cmd -hb lf -hb output $test_dir/data2 100& -pid=$! +# shellcheck disable=SC2086 +"${XDDTEST_XDD_EXE}" -target "${test_file}" -op write -reqsize "${req_size}" -numreqs "${num_reqs}" -blocksize "${block_size}" ${xdd_byte_cmd} -hb lf -hb output "${test_dir}/data2" 100& +pid="$!" num_ele=0 process=1 -if [ "$os" == "Darwin" ]; then -while [[ "$process" -eq 1 ]]; do +if [[ "${os}" == "Darwin" ]]; then +while [[ "${process}" -eq 1 ]]; do sleep 1 # sleep 1 to sync with xdd since hb outputs every second - num_ele=$(($num_ele+1)) - process=$(ps -A | grep $pid | wc -l) - xdd_get_size[$num_ele]=$(stat -c %s $test_file) + num_ele=$((num_ele+1)) + # shellcheck disable=SC2009 + process=$(ps -A | grep -c "${pid}") + xdd_get_size[${num_ele}]=$(stat -c '%s' "${test_file}") done # Linux gets the process differently -elif [ "$os" == "Linux" ]; then -while [[ "$process" -eq 1 ]]; do +elif [[ "${os}" == "Linux" ]]; then +while [[ "${process}" -eq 1 ]]; do sleep 1 # sleep 1 to sync with xdd since hb outputs every second - num_ele=$(($num_ele+1)) - process=$(ps -A | grep $pid | wc -l) - xdd_get_size[$num_ele]=$(stat -c %s $test_file) + num_ele=$((num_ele+1)) + # shellcheck disable=SC2009 + process=$(ps -A | grep -c "${pid}") + xdd_get_size[${num_ele}]=$(stat -c '%s' "${test_file}") done fi -echo "xdd_get_file elements : $num_ele" > $log_file +echo "xdd_get_file elements : ${num_ele}" > "${log_file}" # copy data2.T0000.csv to data3 without the empty first line -sed 1d $test_dir/data2.T0000.csv > $test_dir/data3 +sed 1d "${test_dir}/data2.T0000.csv" > "${test_dir}/data3" -line_count=$(wc $test_dir/data3) -line_count=$(echo $line_count | cut -f 1 -d ' ') +line_count=$(wc -l "${test_dir}/data3" | awk '{ print $1 }' ) # determine whether the array containing data from xdd_getfilesize or heartbeat has more elements -if [ $num_ele -le $line_count ]; then -times_test=$num_ele +if [[ "${num_ele}" -le "${line_count}" ]]; then + times_test="${num_ele}" else -times_test=$line_count + times_test="${line_count}" fi -echo "num_ele $num_ele lines $line_count" >> $log_file -echo "used: $times_test" >> $log_file +echo "num_ele ${num_ele} lines ${line_count}" >> "${log_file}" +echo "used: ${times_test}" >> "${log_file}" declare -a byte -declare -a kbyte -declare -a mbyte -declare -a gbyte -for i in $(seq 1 $line_count); do - byte=$(sed -n "$i"p $test_dir/data3 | cut -f 4 -d ',') # remove trailing 0s - byte[$i]=$(echo $byte | sed 's/^0*//') - - kbyte=$(sed -n "$i"p $test_dir/data3 | cut -f 6 -d ',') # remove trailing 0s and truncate - kbyte[$i]=$(echo ${kbyte%.*} | sed 's/^0*//') - - mbyte=$(sed -n "$i"p $test_dir/data3 | cut -f 8 -d ',') # remove trailing 0s and truncate - mbyte[$i]=$(echo ${mbyte%.*} | sed 's/^0*//') - - gbyte=$(sed -n "$i"p $test_dir/data3 | cut -f 10 -d ',') # multiply gbytes by 10 and remove - gbyte=$(echo "$gbyte*10" | bc) # decimal to get rid floating points - gbyte[$i]=$(echo ${gbyte%.*}) +for i in $(seq "${line_count}"); do + b=$(sed -n "${i}"p "${test_dir}/data3" | cut -f 4 -d ',') # remove trailing 0s + # shellcheck disable=SC2001 + byte["${i}"]=$(echo "${b}" | sed 's/^0*//') done # find the percent error in actual vs approx file size -sum_errors=0 error_bound=20 outlier_count=0 -outlier_bound=$(($times_test/3)) # cannot have more than a third of the results be outliers +outlier_bound=$((times_test/3)) # cannot have more than a third of the results be outliers -for i in $(seq 1 $times_test); do - error=$((${byte[$i]}-${xdd_get_size[$i]})) - abs_error=$(echo ${error#-}) - rel_error=$(($error*100)) - rel_error=$(($rel_error/${xdd_get_size[$i]})) - rel_error=$(echo ${rel_error#-}) # remove negative sign +for i in $(seq "${times_test}"); do + error="$((${byte[${i}]}-${xdd_get_size[${i}]}))" + # shellcheck disable=SC2116 + abs_error="$(echo ${error#-})" + rel_error=$((error*100)) + rel_error="$((rel_error/${xdd_get_size[${i}]}))" + # shellcheck disable=SC2116 + rel_error="$(echo ${rel_error#-})" # remove negative sign - echo "rel_error : $rel_error from_hb: ${byte[$i]} from_xdd: ${xdd_get_size[$i]} hb-xdd: $abs_error" >> $log_file + echo "rel_error : ${rel_error} from_hb: ${byte[${i}]} from_xdd: ${xdd_get_size[${i}]} hb-xdd: ${abs_error}" >> "${log_file}" - if [ $rel_error -ge $error_bound ]; then - outlier_count=$(($outlier_count+1)) + if [[ "${rel_error}" -ge "${error_bound}" ]]; then + outlier_count=$((outlier_count+1)) fi done +echo "results count: ${times_test} outlier count: ${outlier_count}" >> "${log_file}" -echo "results count: $times_test outlier count: $outlier_count" >> $log_file - -if [ $outlier_count -le $outlier_bound ]; then +if [[ "${outlier_count}" -le "${outlier_bound}" ]]; then # test passed finalize_test 0 else # test failed - finalize_test 1 "$outlier_count is greater than $outlier_bound which is a greater than a third of results being outliers" + finalize_test 1 "${outlier_count} is greater than ${outlier_bound} which is a greater than a third of results being outliers" fi diff --git a/tests/functional/test_xdd_heartbeat_elapsed.sh b/tests/functional/test_xdd_heartbeat_elapsed.sh index 8291e4de..cda90632 100755 --- a/tests/functional/test_xdd_heartbeat_elapsed.sh +++ b/tests/functional/test_xdd_heartbeat_elapsed.sh @@ -10,35 +10,34 @@ source ../common.sh # Pre-test set-up initialize_test -test_file=$XDDTEST_LOCAL_MOUNT/$TESTNAME/test -test_dir=$XDDTEST_LOCAL_MOUNT/$TESTNAME +test_file="${XDDTEST_LOCAL_MOUNT}/${TESTNAME}/test" +test_dir="${XDDTEST_LOCAL_MOUNT}/${TESTNAME}" +test_file="${test_dir}/data1" +touch "${test_file}" -test_file=$test_dir/data1 -touch $test_file - -data_loc=$test_dir/data2.T0000.csv +data_loc="${test_dir}/data2.T0000.csv" delay_time=3 passes=3 -theoretical_seconds=$(($delay_time * $passes)) +theoretical_seconds="$((delay_time * passes))" -$XDDTEST_XDD_EXE -target $test_file -op write -passes $passes -reqsize 1 -numreqs 1 -startdelay $delay_time -hb elapsed -hb output $test_dir/data2 -hb lf +"${XDDTEST_XDD_EXE}" -target "${test_file}" -op write -passes "${passes}" -reqsize 1 -numreqs 1 -startdelay "${delay_time}" -hb elapsed -hb output "${test_dir}/data2" -hb lf -actual_seconds=$(cat $data_loc | wc -l) -error="$(($actual_seconds-$theoretical_seconds))" -abs_error=${error#-} -percent_error=$(echo "scale=2 ; $abs_error / $theoretical_seconds * 100" | bc) +actual_seconds=$(wc -l < "${data_loc}") +error="$((actual_seconds-theoretical_seconds))" +abs_error="${error#-}" +percent_error=$(echo "scale=2 ; ${abs_error} / ${theoretical_seconds} * 100" | bc) error_bound=20 pass_count=0 -if (( $(echo "$percent_error < $error_bound" | bc -l) )); then +if (( $(echo "${percent_error} < ${error_bound}" | bc -l) )); then pass_count=1 fi -if [[ $pass_count -eq 1 ]]; then +if [[ "${pass_count}" -eq "1" ]]; then # test passed finalize_test 0 else # test failed - finalize_test 1 "$percent_error >= $error_bound which means there exists an issue with -heartbeat (-hb) elapsed output" + finalize_test 1 "${percent_error} >= ${error_bound} which means there exists an issue with -heartbeat (-hb) elapsed output" fi diff --git a/tests/functional/test_xdd_heartbeat_lf.sh b/tests/functional/test_xdd_heartbeat_lf.sh index 5c6559db..2c21a6b8 100755 --- a/tests/functional/test_xdd_heartbeat_lf.sh +++ b/tests/functional/test_xdd_heartbeat_lf.sh @@ -11,22 +11,21 @@ source ../common.sh # pre-test set-up initialize_test -test_dir=$XDDTEST_LOCAL_MOUNT/$TESTNAME -test_file=$test_dir/data1 -touch $test_file +test_dir="${XDDTEST_LOCAL_MOUNT}/${TESTNAME}" +test_file="${test_dir}/data1" +touch "${test_file}" run_time=6 -lines=$(($run_time-1)) -$XDDTEST_XDD_EXE -target $test_file -reqsize 1024 -numreqs 1024 -runtime $run_time -hb lf -hb output $test_dir/data2 +lines="$((run_time-1))" +"${XDDTEST_XDD_EXE}" -target "${test_file}" -reqsize 1024 -numreqs 1024 -runtime "${run_time}" -hb lf -hb output "${test_dir}/data2" # get number of lines printed -head -$lines $test_dir/data2.T0000.csv >> $test_dir/data3 -num_lines=`wc -l $test_dir/data3` -match=$(echo $lines | cut -f 1 -d ' ') +head "-${lines}" "${test_dir}/data2.T0000.csv" >> "${test_dir}/data3" +match=$(echo "${lines}" | cut -f 1 -d ' ') # verify output -if [ $match -eq $lines ]; then +if [[ "${match}" -eq "${lines}" ]]; then # test passed finalize_test 0 else diff --git a/tests/functional/test_xdd_heartbeat_output.sh b/tests/functional/test_xdd_heartbeat_output.sh index 9de24d2b..446002d4 100755 --- a/tests/functional/test_xdd_heartbeat_output.sh +++ b/tests/functional/test_xdd_heartbeat_output.sh @@ -10,21 +10,22 @@ source ../common.sh # Pre-test set-up initialize_test -test_dir=$XDDTEST_LOCAL_MOUNT/$TESTNAME +test_dir="${XDDTEST_LOCAL_MOUNT}/${TESTNAME}" -test_file=$test_dir/data1 -touch $test_file +test_file="${test_dir}/data1" +touch "${test_file}" # -hb should output to file data2.T0000.csv file_name=data2.T0000.csv -$XDDTEST_XDD_EXE -target $test_file -op write -reqsize 512 -numreqs 512 -hb 1 -hb output $test_dir/data2 +"${XDDTEST_XDD_EXE}" -target "${test_file}" -op write -reqsize 512 -numreqs 512 -hb 1 -hb output "${test_dir}/data2" #determine whether file exists -f_file=`find $test_dir -name $file_name` -f_file=$(echo ${f_file##/*/}) +f_file=$(find "${test_dir}" -name "${file_name}") +# shellcheck disable=SC2116 +f_file=$(echo "${f_file##/*/}") -if [ "$f_file" == "$file_name" ]; then +if [[ "${f_file}" == "${file_name}" ]]; then test_success=1 else test_success=0 @@ -32,7 +33,7 @@ fi # Verify output -if [ $test_success -ge 1 ]; then +if [[ "${test_success}" -ge "1" ]]; then # test passed finalize_test 0 else diff --git a/tests/functional/test_xdd_heartbeat_target.sh b/tests/functional/test_xdd_heartbeat_target.sh index 07bc8e7b..23ce839a 100755 --- a/tests/functional/test_xdd_heartbeat_target.sh +++ b/tests/functional/test_xdd_heartbeat_target.sh @@ -10,25 +10,25 @@ source ../common.sh # pre-test set-up initialize_test -test_dir=$XDDTEST_LOCAL_MOUNT/$TESTNAME -mkdir -p $test_dir +test_dir="${XDDTEST_LOCAL_MOUNT}/${TESTNAME}" +mkdir -p "${test_dir}" -test_file=$test_dir/data1 -test_file2=$test_dir/data2 -touch $test_file -touch $test_file2 +test_file="${test_dir}/data1" +test_file2="${test_dir}/data2" +touch "${test_file}" +touch "${test_file2}" -$XDDTEST_XDD_EXE -targets 2 $test_file $test_file2 -op target 0 write -op target 1 write -reqsize 1024 -numreqs 512 -runtime 2 -hb 1 -hb tgt -hb output $test_dir/data3 +"${XDDTEST_XDD_EXE}" -targets 2 "${test_file}" "${test_file2}" -op target 0 write -op target 1 write -reqsize 1024 -numreqs 512 -runtime 2 -hb 1 -hb tgt -hb output "${test_dir}/data3" # get target numbers -target=`grep -m1 tgt $test_dir/data3.T0000.csv` -target_num=$(echo $target |cut -f 4 -d ',' | cut -c 4) +target=$(grep -m1 tgt "${test_dir}/data3.T0000.csv") +target_num=$(echo "${target}" | cut -f 4 -d ',' | cut -c 4) -target2=`grep -m1 tgt $test_dir/data3.T0001.csv` -target_num2=$(echo $target2 |cut -f 4 -d ',' | cut -c 4) +target2=$(grep -m1 tgt "${test_dir}/data3.T0001.csv") +target_num2=$(echo "${target2}" | cut -f 4 -d ',' | cut -c 4) # Verify output -if [ $target_num -eq 0 ] && [ $target_num2 -eq 1 ]; then +if [[ "${target_num}" -eq 0 ]] && [[ "${target_num2}" -eq 1 ]]; then # test passed finalize_test 0 else diff --git a/tests/functional/test_xdd_heartbeat_tod.sh b/tests/functional/test_xdd_heartbeat_tod.sh index c5f5aaa9..7177c639 100755 --- a/tests/functional/test_xdd_heartbeat_tod.sh +++ b/tests/functional/test_xdd_heartbeat_tod.sh @@ -10,13 +10,13 @@ source ../common.sh # pre-test set-up initialize_test -test_dir=$XDDTEST_LOCAL_MOUNT/$TESTNAME -mkdir -p $test_dir +test_dir="${XDDTEST_LOCAL_MOUNT}/${TESTNAME}" +mkdir -p "${test_dir}" -test_file=$test_dir/data1 -test_file2=$test_dir/data2 +test_file="${test_dir}/data1" +test_file2="${test_dir}/data2" -touch $test_file +touch "${test_file}" declare -a rc_time @@ -25,68 +25,67 @@ cs_time=55 run_time=5 # loops until current seconds is less than 40 -while [ $cs_time -gt 40 ]; do - cs_time=`date | cut -f 3 -d ':' | cut -f 1 -d ' '` +while [ "${cs_time}" -gt 40 ]; do + cs_time=$(date | cut -f 3 -d ':' | cut -f 1 -d ' ') done -$XDDTEST_XDD_EXE -target $test_file -op write -reqsize 9999 -numreqs 9999 -runtime $run_time -hb tod -hb output $test_file2 +"${XDDTEST_XDD_EXE}" -target "${test_file}" -op write -reqsize 9999 -numreqs 9999 -runtime "${run_time}" -hb tod -hb output "${test_file2}" # gets displayed date from output file -for ((j=1; j<$run_time; j++)); do - rc_time[$j]=`cut -f $(($field*$j)) -d ',' $test_file2.T0000.csv` +for ((j=1; j&1 strace -cfq -e trace=open $xdd_cmd |grep open| tail -1 | cut -b 32-40) - sys_call_open=$(2>&1 strace -cfq -e trace=openat $xdd_cmd | grep openat| cut -b 32-40) - sys_call_close=$(2>&1 strace -cfq -e trace=close $xdd_cmd | grep close | cut -b 32-40) - #sys_call_close=$(2>&1 strace -cfq -e trace=close $xdd_cmd |grep close |cut -b 32-40) + # shellcheck disable=SC2086 + sys_call_open=$(2>&1 strace -cfq -e trace=openat ${xdd_cmd} | grep openat| cut -b 32-40) + # shellcheck disable=SC2086 + sys_call_close=$(2>&1 strace -cfq -e trace=close ${xdd_cmd} | grep close | cut -b 32-40) + #sys_call_close=$(2>&1 strace -cfq -e trace=close ${xdd_cmd} |grep close |cut -b 32-40) - sys_open[$num_passes]=$sys_call_open - sys_close[$num_passes]=$sys_call_close + sys_open["${num_passes}"]="${sys_call_open}" + sys_close["${num_passes}"]="${sys_call_close}" done pass_count=0 # Check if the first element is 1 less than the next and so on for n-1 elements -for ((i=$min_passes;i<=$(($max_passes-1));i++)); do +for ((i=min_passes; i $log_file -echo "sleep $sleep_seconds" >> $log_file -sleep $sleep_seconds +echo "xdd started, pid=${pid}" > "${log_file}" +echo "sleep ${sleep_seconds}" >> "${log_file}" +sleep "${sleep_seconds}" # Validate output test_passes=1 -pkill -P $ppid $pid -if [ $? -eq 0 ]; then +if pkill -P "${ppid}" "${pid}" ; then test_passes=0 - echo "Had to kill $pid." >> $log_file + echo "Had to kill $pid." >> "${log_file}" fi # Perform post-test cleanup # Output test result -if [ 1 -eq $test_passes ]; then +if [[ "1" -eq "${test_passes}" ]]; then # test passed finalize_test 0 else diff --git a/tests/functional/test_xdd_startdelay.sh b/tests/functional/test_xdd_startdelay.sh index 6f4b6da1..89370b27 100755 --- a/tests/functional/test_xdd_startdelay.sh +++ b/tests/functional/test_xdd_startdelay.sh @@ -12,24 +12,25 @@ source ../common.sh # Pre-test set-up initialize_test -test_dir=$XDDTEST_LOCAL_MOUNT/$TESTNAME +test_dir="${XDDTEST_LOCAL_MOUNT}/${TESTNAME}" -test_file=$test_dir/data1 -touch $test_file +test_file="${test_dir}/data1" +touch "${test_file}" # Determine correct and elapsed time num_passes=2 start_delay=4 -correct_time=$(($num_passes*$start_delay)) -xdd_cmd="$XDDTEST_XDD_EXE -target $test_file -op write -reqsize 1024 -numreqs 10 -passes $num_passes -startdelay $start_delay" -timed_pass_output="$(2>&1 ${TIME_CMD} -p $xdd_cmd)" -elapsed_time=$(echo "$timed_pass_output" |grep '^real' |awk '{print $2}') +correct_time=$((num_passes*start_delay)) +xdd_cmd="${XDDTEST_XDD_EXE} -target ${test_file} -op write -reqsize 1024 -numreqs 10 -passes ${num_passes} -startdelay ${start_delay}" +# shellcheck disable=SC2086 +timed_pass_output="$(2>&1 ${TIME_CMD} -p ${xdd_cmd})" +elapsed_time=$(echo "${timed_pass_output}" | grep '^real' | awk '{print $2}') # Truncate elapsed_time -elapsed_time=$(echo $elapsed_time| cut -d '.' -f 1) +elapsed_time=$(echo "${elapsed_time}" | cut -d '.' -f 1) # Verify output -if [ "$elapsed_time" -ge "$correct_time" ]; then +if [[ "${elapsed_time}" -ge "${correct_time}" ]]; then # test passed finalize_test 0 else diff --git a/tests/functional/test_xdd_startoffset.sh b/tests/functional/test_xdd_startoffset.sh index 6d599cf3..7419024b 100755 --- a/tests/functional/test_xdd_startoffset.sh +++ b/tests/functional/test_xdd_startoffset.sh @@ -12,27 +12,27 @@ source ../common.sh # Pre-test set-up initialize_test -test_dir=$XDDTEST_LOCAL_MOUNT/$test_name +test_dir="${XDDTEST_LOCAL_MOUNT}/${TESTNAME}" -test_file=$test_dir/data1 -touch $test_file +test_file="${test_dir}/data1" +touch "${test_file}" #ratio of req_size to start_offset must be 2:1 req_size=10 start_offset=5 num_reqs=1 -$XDDTEST_XDD_EXE -target $test_file -op write -reqsize $req_size -numreqs $num_reqs -startoffset $start_offset +"${XDDTEST_XDD_EXE}" -target "${test_file}" -op write -reqsize "${req_size}" -numreqs "${num_reqs}" -startoffset "${start_offset}" # Determine file requested transfer size and actual size -transfer_size=$(($req_size*1024)) -actual_size=$(stat -c %s $test_file) -calc_actual_size=$(($actual_size-$transfer_size)) +transfer_size=$((req_size*1024)) +actual_size=$(stat -c '%s' "${test_file}") +calc_actual_size=$((actual_size-transfer_size)) # Verify results -if [ $calc_actual_size -eq $(($transfer_size/2)) ]; then +if [[ "${calc_actual_size}" -eq "$((transfer_size/2))" ]]; then # test passed finalize_test 0 else # test failed - finalize_test 1 "File size $calc_actual_size != $((transfer_size/2)) when doing -startoffset $start_offset -reqsize $req_size -numreqs $num_reqs" + finalize_test 1 "File size ${calc_actual_size} != $((transfer_size/2)) when doing -startoffset ${start_offset} -reqsize ${req_size} -numreqs $num_reqs" fi diff --git a/tests/functional/test_xdd_syncwrite.sh b/tests/functional/test_xdd_syncwrite.sh index da5ff19e..a07dea08 100755 --- a/tests/functional/test_xdd_syncwrite.sh +++ b/tests/functional/test_xdd_syncwrite.sh @@ -10,27 +10,28 @@ source ../test_config source ../common.sh #skip test on non-Linux platforms -if [ `uname` != "Linux" ]; then +if [[ "$(uname)" != "Linux" ]]; then # test passed finalize_test -1 fi # Pre-test set-up initialize_test -test_dir=$XDDTEST_LOCAL_MOUNT/$TESTNAME +test_dir="${XDDTEST_LOCAL_MOUNT}/${TESTNAME}" -test_file=$test_dir/data1 -touch $test_file +test_file="${test_dir}/data1" +touch "${test_file}" num_passes=10 # get the amount of fdatasyncs -xdd_cmd="$XDDTEST_XDD_EXE -target $test_file -op write -numreqs 10 -passes $num_passes -syncwrite" -sys_call=$(2>&1 strace -cfq -e trace=fdatasync $xdd_cmd |grep "fdatasync") -sync_num=$(echo $sys_call |cut -f 4 -d ' ') +xdd_cmd="${XDDTEST_XDD_EXE} -target ${test_file} -op write -numreqs 10 -passes $num_passes -syncwrite" +# shellcheck disable=SC2086 +sys_call=$(2>&1 strace -cfq -e trace=fdatasync ${xdd_cmd} | grep "fdatasync") +sync_num=$(echo "${sys_call}" | cut -f 4 -d ' ') # Verify output -if [ $sync_num -eq $num_passes ]; then +if [[ "${sync_num}" -eq "${num_passes}" ]]; then # test passed finalize_test 0 else diff --git a/tests/functional/test_xdd_timelimit.sh b/tests/functional/test_xdd_timelimit.sh index f5d3b611..32eb8902 100755 --- a/tests/functional/test_xdd_timelimit.sh +++ b/tests/functional/test_xdd_timelimit.sh @@ -13,43 +13,43 @@ source ../common.sh # Perform pre-test initialize_test -test_dir=$XDDTEST_LOCAL_MOUNT/$TESTNAME -log_file=$(get_log_file) +test_dir="${XDDTEST_LOCAL_MOUNT}/${TESTNAME}" +log_file="$(get_log_file)" # ReqSize 4096, Bytes 1GB, Targets 1, QueueDepth 4, Passes 1 -data_file=$test_dir/test +data_file="${test_dir}/test" # write a file -$XDDTEST_XDD_EXE -op write -reqsize 4096 -mbytes 1024 -targets 1 $data_file -qd 4 -passes 1 -datapattern random +"${XDDTEST_XDD_EXE}" -op write -reqsize 4096 -mbytes 1024 -targets 1 "${data_file}" -qd 4 -passes 1 -datapattern random # now read forever, small random I/O with a timelimit timelimit="10.0" sleep_seconds=12 -$XDDTEST_XDD_EXE -op read -reqsize 1 -numreqs 999999 -targets 1 $data_file -qd 4 -timelimit $timelimit -passes 1 -seek random -seek range 1024 & +"${XDDTEST_XDD_EXE}" -op read -reqsize 1 -numreqs 999999 -targets 1 "${data_file}" -qd 4 -timelimit "${timelimit}" -passes 1 -seek random -seek range 1024 & pid=$! # sleep for 12 seconds before checking if XDD process is still running -echo "xdd started, pid=$pid" > $log_file -echo "sleep $sleep_seconds" >> $log_file -sleep $sleep_seconds +echo "xdd started, pid=${pid}" > "${log_file}" +echo "sleep ${sleep_seconds}" >> "${log_file}" +sleep "${sleep_seconds}" # Validate output test_passes=1 -pkill $pid -pkill_status=$? -if [ $pkill_status -eq 0 ]; then +pkill "${pid}" +pkill_status="$?" +if [[ "${pkill_status}" -eq "0" ]]; then test_passes=0 - echo "Had to kill $pid." >> $log_file + echo "Had to kill ${pid}." >> "${log_file}" fi -# wait $pid +# wait "${pid}" # Output test result -if [ 1 -eq $test_passes ]; then +if [[ "1" -eq "${test_passes}" ]]; then # test passed finalize_test 0 else # test failed - finalize_test 1 "Requested -timelimit $timelimit, but XDD reading process was still running after $sleep_seconds seconds" + finalize_test 1 "Requested -timelimit ${timelimit}, but XDD reading process was still running after ${sleep_seconds} seconds" fi