github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/tests/includes/run.sh (about)

     1  # run a command and immediately terminate the script when any error occurs.
     2  run() {
     3  	CMD="${1}"
     4  
     5  	if [[ -n ${RUN_SUBTEST} ]]; then
     6  		# shellcheck disable=SC2143
     7  		if [[ ! "$(echo "${RUN_SUBTEST}" | grep -E "^${CMD}$")" ]]; then
     8  			echo "SKIPPING: ${RUN_SUBTEST} ${CMD}"
     9  			return 0
    10  		fi
    11  	fi
    12  
    13  	DESC=$(echo "${1}" | sed -E "s/^run_//g" | sed -E "s/_/ /g")
    14  
    15  	echo "===> [   ] Running: ${DESC}"
    16  
    17  	START_TIME=$(date +%s)
    18  
    19  	set_verbosity
    20  
    21  	if [[ ${VERBOSE} -gt 1 ]]; then
    22  		touch "${TEST_DIR}/${TEST_CURRENT}.log"
    23  		tail -f "${TEST_DIR}/${TEST_CURRENT}.log" 2>/dev/null &
    24  		pid=$!
    25  
    26  		# SIGKILL it with fire, as we don't know what state we're in.
    27  		trap 'kill -9 "${pid}" >/dev/null 2>&1 || true' EXIT
    28  	fi
    29  
    30  	"${CMD}" "$@" >"${TEST_DIR}/${TEST_CURRENT}.log" 2>&1
    31  	if [[ ${VERBOSE} -gt 1 ]]; then
    32  		# SIGKILL because it should be safe to do so.
    33  		kill -9 "${pid}" >/dev/null 2>&1 || true
    34  	fi
    35  
    36  	END_TIME=$(date +%s)
    37  
    38  	echo -e "\r\033[1A\033[0K===> [ $(green "✔") ] Success: ${DESC} ($((END_TIME - START_TIME))s)"
    39  }
    40  
    41  # run_linter will run until the end of a pipeline even if there is a failure.
    42  # This is different from `run` as we require the output of a linter.
    43  run_linter() {
    44  	CMD="${1}"
    45  
    46  	if [[ -n ${RUN_SUBTEST} ]]; then
    47  		# shellcheck disable=SC2143
    48  		if [[ ! "$(echo "${RUN_SUBTEST}" | grep -E "^${CMD}$")" ]]; then
    49  			echo "SKIPPING: ${RUN_SUBTEST} ${CMD}"
    50  			exit 0
    51  		fi
    52  	fi
    53  
    54  	DESC=$(echo "${1}" | sed -E "s/^run_//g" | sed -E "s/_/ /g")
    55  
    56  	echo "===> [   ] Running: ${DESC}"
    57  
    58  	START_TIME=$(date +%s)
    59  
    60  	# Prevent the sub-shell from killing our script if that sub-shell fails on an
    61  	# error. We need this so that we can capture the full output and collect the
    62  	# exit code when it does fail.
    63  	# Do not remove or none of the tests will report correctly!
    64  	set +e
    65  	set -o pipefail
    66  
    67  	cmd_output=$("${CMD}" "$@" 2>&1)
    68  	cmd_status=$?
    69  
    70  	set_verbosity
    71  	set +o pipefail
    72  
    73  	# Only output if it's not empty.
    74  	if [[ -n ${cmd_output} ]]; then
    75  		echo -e "${cmd_output}" | OUTPUT "${TEST_DIR}/${TEST_CURRENT}.log"
    76  	fi
    77  
    78  	END_TIME=$(date +%s)
    79  
    80  	if [[ ${cmd_status} -eq 0 ]]; then
    81  		echo -e "\r\033[1A\033[0K===> [ $(green "✔") ] Success: ${DESC} ($((END_TIME - START_TIME))s)"
    82  	else
    83  		echo -e "\r\033[1A\033[0K===> [ $(red "x") ] Fail: ${DESC} ($((END_TIME - START_TIME))s)"
    84  		exit 1
    85  	fi
    86  }
    87  
    88  skip() {
    89  	CMD="${1}"
    90  
    91  	if [[ -n ${RUN_LIST} ]]; then
    92  		# shellcheck disable=SC2143,SC2046
    93  		if [[ ! $(echo "${RUN_LIST}" | grep -w "${CMD}") ]]; then
    94  			echo "SKIP"
    95  			exit 1
    96  		fi
    97  	fi
    98  
    99  	# shellcheck disable=SC2143,SC2046
   100  	if [[ $(echo "${SKIP_LIST:-}" | grep -w "${CMD}") ]]; then
   101  		echo "SKIP"
   102  		exit 1
   103  	fi
   104  	return
   105  }