From 3f52d2659e1fa04af8efcc7bd1a5bc3ba0836a0a Mon Sep 17 00:00:00 2001 From: Mike Gerdts Date: Mon, 6 Feb 2023 16:08:04 -0600 Subject: [PATCH] test/common: allow tests to use set -u Now autotest_common.sh is tolerant of tests that use "set -u" so that they quickly generate useful errors when variables are used but not set. Signed-off-by: Mike Gerdts Change-Id: I5d7709f3029fa8f52affecf68a4b9da97a84589d Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16703 Reviewed-by: Jim Harris Tested-by: SPDK CI Jenkins Reviewed-by: Michal Berger Reviewed-by: Ben Walker --- test/common/autotest_common.sh | 79 +++++++++++++++++----------------- 1 file changed, 40 insertions(+), 39 deletions(-) diff --git a/test/common/autotest_common.sh b/test/common/autotest_common.sh index 9fcf3ca1c..4d9d14602 100755 --- a/test/common/autotest_common.sh +++ b/test/common/autotest_common.sh @@ -2,11 +2,12 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (C) 2015 Intel Corporation # All rights reserved. +# Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # rpc_py=rpc_cmd function xtrace_fd() { - if [[ -n $BASH_XTRACEFD && -e /proc/self/fd/$BASH_XTRACEFD ]]; then + if [[ -n ${BASH_XTRACEFD:-} && -e /proc/self/fd/$BASH_XTRACEFD ]]; then # Close it first to make sure it's sane exec {BASH_XTRACEFD}>&- fi @@ -16,13 +17,13 @@ function xtrace_fd() { } function xtrace_disable() { - if [ "$XTRACE_DISABLED" != "yes" ]; then + if [ "${XTRACE_DISABLED:-}" != "yes" ]; then PREV_BASH_OPTS="$-" - if [[ "$PREV_BASH_OPTS" == *"x"* ]]; then + if [[ "${PREV_BASH_OPTS:-}" == *"x"* ]]; then XTRACE_DISABLED="yes" fi set +x - elif [ -z $XTRACE_NESTING_LEVEL ]; then + elif [ -z ${XTRACE_NESTING_LEVEL:-} ]; then XTRACE_NESTING_LEVEL=1 else XTRACE_NESTING_LEVEL=$((++XTRACE_NESTING_LEVEL)) @@ -59,8 +60,8 @@ function xtrace_enable() { # Keep it as alias to avoid xtrace_enable backtrace always pointing to xtrace_restore. # xtrace_enable will appear as called directly from the user script, from the same line # that "called" xtrace_restore. -alias xtrace_restore='if [ -z $XTRACE_NESTING_LEVEL ]; then - if [[ "$PREV_BASH_OPTS" == *"x"* ]]; then +alias xtrace_restore='if [ -z ${XTRACE_NESTING_LEVEL:-} ]; then + if [[ "${PREV_BASH_OPTS:-}" == *"x"* ]]; then XTRACE_DISABLED="no"; PREV_BASH_OPTS=""; set -x; xtrace_enable; fi else @@ -238,7 +239,7 @@ export LSAN_OPTIONS=suppressions="$asan_suppression_file" export DEFAULT_RPC_ADDR="/var/tmp/spdk.sock" -if [ -z "$DEPENDENCY_DIR" ]; then +if [ -z "${DEPENDENCY_DIR:-}" ]; then export DEPENDENCY_DIR=$HOME/spdk_dependencies else export DEPENDENCY_DIR @@ -291,7 +292,7 @@ fi export HUGEMEM=$HUGEMEM -if [ -z "$output_dir" ]; then +if [ -z "${output_dir:-}" ]; then mkdir -p "$rootdir/../output" export output_dir="$rootdir/../output" fi @@ -312,7 +313,7 @@ for i in "$@"; do done # start rpc.py coprocess if it's not started yet -if [[ -z $RPC_PIPE_PID ]] || ! kill -0 "$RPC_PIPE_PID" &> /dev/null; then +if [[ -z ${RPC_PIPE_PID:-} ]] || ! kill -0 "$RPC_PIPE_PID" &> /dev/null; then # Include list to all known plugins we use in the tests PYTHONPATH+=":$rootdir/test/rpc_plugins" coproc RPC_PIPE { PYTHONPATH="$PYTHONPATH" "$rootdir/scripts/rpc.py" --server; } @@ -339,12 +340,12 @@ function set_test_storage() { "$storage_fallback" ) - if [[ -n $ADD_TEST_STORAGE ]]; then + if [[ -n ${ADD_TEST_STORAGE:-} ]]; then # List of dirs|mounts separated by whitespaces storage_candidates+=($ADD_TEST_STORAGE) fi - if [[ -n $DEDICATED_TEST_STORAGE ]]; then + if [[ -n ${DEDICATED_TEST_STORAGE:-} ]]; then # Single, dedicated dir|mount storage_candidates=("$DEDICATED_TEST_STORAGE") fi @@ -433,7 +434,7 @@ function get_config_params() { if [[ $SPDK_TEST_UNITTEST -eq 0 && \ $SPDK_TEST_SCANBUILD -eq 0 && -z \ - $SPDK_TEST_AUTOBUILD ]]; then + ${SPDK_TEST_AUTOBUILD:-} ]]; then config_params+=' --disable-unit-tests' fi @@ -495,7 +496,7 @@ function get_config_params() { config_params+=' --with-uring' fi - if [ -n "$SPDK_RUN_EXTERNAL_DPDK" ]; then + if [ -n "${SPDK_RUN_EXTERNAL_DPDK:-}" ]; then config_params+=" --with-dpdk=$SPDK_RUN_EXTERNAL_DPDK" fi @@ -531,7 +532,7 @@ function get_fuzzer_target_config() { fuzzer_targets_to_config["vfio"]="--with-vfio-user" for target in $(get_fuzzer_targets); do - [[ -n ${fuzzer_targets_to_config["$target"]} ]] || continue + [[ -n ${fuzzer_targets_to_config["$target"]:-} ]] || continue config+=("${fuzzer_targets_to_config["$target"]}") done @@ -543,7 +544,7 @@ function get_fuzzer_target_config() { function get_fuzzer_targets() { local fuzzers=() - if [[ -n $SPDK_TEST_FUZZER_TARGET ]]; then + if [[ -n ${SPDK_TEST_FUZZER_TARGET:-} ]]; then IFS="," read -ra fuzzers <<< "$SPDK_TEST_FUZZER_TARGET" else fuzzers=("$rootdir/test/fuzz/llvm/"*) @@ -646,7 +647,7 @@ function NOT() { 11) es=0 ;; # SIGSEGV *) es=1 ;; esac - elif [[ -n $EXIT_STATUS ]] && ((es != EXIT_STATUS)); then + elif [[ -n ${EXIT_STATUS:-} ]] && ((es != EXIT_STATUS)); then es=0 fi @@ -661,8 +662,8 @@ function timing() { now=$(date +%s) if [ "$direction" = "enter" ]; then - export timing_stack="${timing_stack};${now}" - export test_stack="${test_stack};${testname}" + export timing_stack="${timing_stack:-};${now}" + export test_stack="${test_stack:-};${testname}" else touch "$output_dir/timing.txt" child_time=$(grep "^${test_stack:1};" $output_dir/timing.txt | awk '{s+=$2} END {print s}') @@ -772,7 +773,7 @@ function process_shm() { shm_files=$(find /dev/shm -name "*.${id}" -printf "%f\n") - if [[ -z $shm_files ]]; then + if [[ -z ${shm_files:-} ]]; then echo "SHM File for specified PID or shared memory id: ${id} not found!" return 1 fi @@ -787,7 +788,7 @@ function process_shm() { # $2 - rpc address (optional) # $3 - max retries (optional) function waitforlisten() { - if [ -z "$1" ]; then + if [ -z "${1:-}" ]; then exit 1 fi @@ -858,7 +859,7 @@ function waitforbdev() { local bdev_name=$1 local bdev_timeout=$2 local i - [[ -z $bdev_timeout ]] && bdev_timeout=2000 # ms + [[ -z ${bdev_timeout:-} ]] && bdev_timeout=2000 # ms $rpc_py bdev_wait_for_examine @@ -894,7 +895,7 @@ function make_filesystem() { function killprocess() { # $1 = process pid - if [ -z "$1" ]; then + if [ -z "${1:-}" ]; then return 1 fi @@ -951,11 +952,11 @@ function start_iscsi_service() { function rbd_setup() { # $1 = monitor ip address # $2 = name of the namespace - if [ -z "$1" ]; then + if [ -z "${1:-}" ]; then echo "No monitor IP address provided for ceph" exit 1 fi - if [ -n "$2" ]; then + if [ -n "${2:-}" ]; then if ip netns list | grep "$2"; then NS_CMD="ip netns exec $2" else @@ -986,11 +987,11 @@ function rbd_cleanup() { function daos_setup() { # $1 = pool name # $2 = cont name - if [ -z "$1" ]; then + if [ -z "${1:-}" ]; then echo "No pool name provided" exit 1 fi - if [ -z "$2" ]; then + if [ -z "${2:-}" ]; then echo "No cont name provided" exit 1 fi @@ -1055,7 +1056,7 @@ function run_test() { local test_name="$1" shift - if [ -n "$test_domain" ]; then + if [ -n "${test_domain:-}" ]; then export test_domain="${test_domain}.${test_name}" else export test_domain="$test_name" @@ -1078,7 +1079,7 @@ function run_test() { export test_domain=${test_domain%?} fi - if [ -z "$test_domain" ]; then + if [ -z "${test_domain:-}" ]; then echo "top_level $test_name" >> $output_dir/test_completions.txt else echo "$test_domain $test_name" >> $output_dir/test_completions.txt @@ -1141,7 +1142,7 @@ function print_backtrace() { function waitforserial() { local i=0 local nvme_device_counter=1 nvme_devices=0 - if [[ -n "$2" ]]; then + if [[ -n "${2:-}" ]]; then nvme_device_counter=$2 fi @@ -1232,7 +1233,7 @@ function fio_config_gen() { return 1 fi - if [ -z "$workload" ]; then + if [ -z "${workload:-}" ]; then workload=randrw fi @@ -1287,7 +1288,7 @@ function fio_plugin() { local asan_lib= for sanitizer in "${sanitizers[@]}"; do asan_lib=$(ldd $plugin | grep $sanitizer | awk '{print $3}') - if [[ -n "$asan_lib" ]]; then + if [[ -n "${asan_lib:-}" ]]; then break fi done @@ -1356,7 +1357,7 @@ function autotest_cleanup() { modprobe -r uio_pci_generic fi rm -rf "$asan_suppression_file" - if [[ -n $old_core_pattern ]]; then + if [[ -n ${old_core_pattern:-} ]]; then echo "$old_core_pattern" > /proc/sys/kernel/core_pattern fi if [[ -e /proc/$udevadm_pid/status ]]; then @@ -1397,7 +1398,7 @@ function autotest_cleanup() { function freebsd_update_contigmem_mod() { if [ $(uname) = FreeBSD ]; then kldunload contigmem.ko || true - if [ -n "$SPDK_RUN_EXTERNAL_DPDK" ]; then + if [ -n "${SPDK_RUN_EXTERNAL_DPDK:-}" ]; then cp -f "$SPDK_RUN_EXTERNAL_DPDK/kmod/contigmem.ko" /boot/modules/ cp -f "$SPDK_RUN_EXTERNAL_DPDK/kmod/contigmem.ko" /boot/kernel/ cp -f "$SPDK_RUN_EXTERNAL_DPDK/kmod/nic_uio.ko" /boot/modules/ @@ -1424,12 +1425,12 @@ function get_nvme_name_from_bdf() { blkname=() nvme_devs=$(lsblk -d --output NAME | grep "^nvme") || true - if [ -z "$nvme_devs" ]; then + if [ -z "${nvme_devs:-}" ]; then return fi for dev in $nvme_devs; do link_name=$(readlink /sys/block/$dev/device/device) || true - if [ -z "$link_name" ]; then + if [ -z "${link_name:-}" ]; then link_name=$(readlink /sys/block/$dev/device) fi bdf=$(basename "$link_name") @@ -1443,7 +1444,7 @@ function get_nvme_name_from_bdf() { function get_nvme_ctrlr_from_bdf() { bdf_sysfs_path=$(readlink -f /sys/class/nvme/nvme* | grep "$1/nvme/nvme") - if [[ -z "$bdf_sysfs_path" ]]; then + if [[ -z "${bdf_sysfs_path:-}" ]]; then return fi @@ -1455,7 +1456,7 @@ function get_nvme_ctrlr_from_bdf() { function get_nvme_bdfs() { xtrace_disable bdfs=$(jq -r .config[].params.traddr <<< $($rootdir/scripts/gen_nvme.sh)) - if [[ -z $bdfs ]]; then + if [[ -z ${bdfs:-} ]]; then echo "No devices to test on!" exit 1 fi @@ -1477,7 +1478,7 @@ function nvme_namespace_revert() { for bdf in $bdfs; do nvme_ctrlr=/dev/$(get_nvme_ctrlr_from_bdf ${bdf}) - if [[ -z "$nvme_ctrlr" ]]; then + if [[ -z "${nvme_ctrlr:-}" ]]; then continue fi @@ -1529,7 +1530,7 @@ function get_nvme_bdfs_by_id() { function opal_revert_cleanup() { # The OPAL CI tests is only used for P4510 devices. mapfile -t bdfs < <(get_nvme_bdfs_by_id 0x0a54) - if [[ -z ${bdfs[0]} ]]; then + if [[ -z ${bdfs[0]:-} ]]; then return 0 fi