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 }