summaryrefslogtreecommitdiff
path: root/lib/sh-test-lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sh-test-lib')
-rwxr-xr-xlib/sh-test-lib337
1 files changed, 337 insertions, 0 deletions
diff --git a/lib/sh-test-lib b/lib/sh-test-lib
new file mode 100755
index 0000000..299964d
--- /dev/null
+++ b/lib/sh-test-lib
@@ -0,0 +1,337 @@
+#!/bin/sh
+
+LANG=C
+export LANG
+
+error_msg() {
+ msg="$1"
+ [ -z "${msg}" ] && msg="Unknown error"
+ printf "ERROR: %s\n" "${msg}" >&2
+ exit 1
+}
+
+warn_msg() {
+ msg="$1"
+ [ -z "${msg}" ] && msg="Unknown error"
+ printf "WARNING: %s\n" "${msg}" >&2
+}
+
+info_msg() {
+ msg="$1"
+ [ -z "${msg}" ] && msg="Unknown info"
+ printf "INFO: %s\n" "${msg}" >&1
+}
+
+check_root() {
+ if [ "$(id -ru)" -eq 0 ]; then
+ return 0
+ else
+ return 1
+ fi
+}
+
+exit_on_fail() {
+ exit_code="$?"
+ [ "$#" -lt 1 ] && error_msg "Usage: exit_on_fail test_case [skip_list]"
+ test_case="$1"
+ skip_list="$2"
+
+ if [ "${exit_code}" -ne 0 ]; then
+ echo "${test_case} fail" | tee -a "${RESULT_FILE}"
+
+ # skip_list is a list of tests sepereated by space. This might be
+ # useful when exiting on prerequisite not met.
+ if [ -n "${skip_list}" ]; then
+ for i in ${skip_list}; do
+ echo "$i skip" | tee -a "${RESULT_FILE}"
+ done
+ fi
+
+ # Exit normally to continue to run the following steps defined in test
+ # definition file.
+ exit 0
+ else
+ echo "${test_case} pass" | tee -a "${RESULT_FILE}"
+ return 0
+ fi
+}
+
+exit_on_skip() {
+ exit_code="$?"
+ [ "$#" -lt 1 ] && error_msg "Usage: exit_on_skip test_case [msg]"
+ test_case="$1"
+ msg="$2"
+
+ if [ "${exit_code}" -ne 0 ]; then
+ echo "${test_case} skip" | tee -a "${RESULT_FILE}"
+
+ if [ -n "${msg}" ]; then
+ warn_msg "${msg}"
+ fi
+
+ # Exit normally to continue to run the following steps defined in test
+ # definition file.
+ exit 0
+ else
+ echo "${test_case} pass" | tee -a "${RESULT_FILE}"
+ return 0
+ fi
+}
+
+check_return() {
+ exit_code="$?"
+ [ "$#" -ne 1 ] && error_msg "Usage: check_return test_case"
+ test_case="$1"
+
+ if [ "${exit_code}" -ne 0 ]; then
+ echo "${test_case} fail" | tee -a "${RESULT_FILE}"
+ return "${exit_code}"
+ else
+ echo "${test_case} pass" | tee -a "${RESULT_FILE}"
+ return 0
+ fi
+}
+
+# When shell argument "-e" set in test script, check_return and exit_on_fail
+# would NOT work. run_test_case should be used instead.
+run_test_case() {
+ [ "$#" -lt 2 ] && error_msg "Usage: run_test_case <test_command> <test_case_id> [skip_list]"
+ test_command="$1"
+ test_case_id="$2"
+ skip_list="$3"
+
+ if eval "${test_command}"; then
+ echo "${test_case_id} pass" | tee -a "${RESULT_FILE}"
+ else
+ echo "${test_case_id} fail" | tee -a "${RESULT_FILE}"
+ # When skip_list isn't empty, skip the tests and exit.
+ if [ -n "${skip_list}" ]; then
+ for i in ${skip_list}; do
+ echo "$i skip" | tee -a "${RESULT_FILE}"
+ done
+ exit 0
+ fi
+ fi
+
+ return 0
+}
+
+report_pass() {
+ [ "$#" -ne 1 ] && error_msg "Usage: report_pass test_case"
+ test_case="$1"
+ echo "${test_case} pass" | tee -a "${RESULT_FILE}"
+}
+
+report_fail() {
+ [ "$#" -ne 1 ] && error_msg "Usage: report_fail test_case"
+ test_case="$1"
+ echo "${test_case} fail" | tee -a "${RESULT_FILE}"
+}
+
+add_metric() {
+ if [ "$#" -lt 3 ]; then
+ warn_msg "The number of parameters less then 3"
+ error_msg "Usage: add_metric test_case result measurement [units]"
+ fi
+ test_case="$1"
+ result="$2"
+ measurement="$3"
+ units="$4"
+
+ echo "${test_case} ${result} ${measurement} ${units}" | tee -a "${RESULT_FILE}"
+}
+
+detect_abi() {
+ abi=$(uname -m)
+ case "${abi}" in
+ armv7|armv7l|armv7el|armv7lh) abi="armeabi" ;;
+ arm64|armv8|arm64-v8a|aarch64) abi="arm64" ;;
+ *) error_msg "Unknown architecture: ${abi}" ;;
+ esac
+}
+
+dist_name() {
+ if [ -f /etc/os-release ]; then
+ # shellcheck disable=SC1091
+ dist=$(. /etc/os-release && echo "${ID}")
+ elif [ -x /usr/bin/lsb_release ]; then
+ dist="$(lsb_release -si)"
+ elif [ -f /etc/lsb-release ]; then
+ # shellcheck disable=SC1091
+ dist="$(. /etc/lsb-release && echo "${DISTRIB_ID}")"
+ elif [ -f /etc/debian_version ]; then
+ dist="debian"
+ elif [ -f /etc/fedora-release ]; then
+ dist="fedora"
+ elif [ -f /etc/centos-release ]; then
+ dist="centos"
+ else
+ dist="unknown"
+ warn_msg "Unsupported distro: cannot determine distribution name"
+ fi
+
+ # convert dist to lower case
+ dist=$(echo ${dist} | tr '[:upper:]' '[:lower:]')
+ case "${dist}" in
+ rpb*) dist="oe-rpb" ;;
+ esac
+}
+
+install_deps() {
+ pkgs="$1"
+ [ -z "${pkgs}" ] && error_msg "Usage: install_deps pkgs"
+ # skip_install parmater is optional.
+ skip_install="$2"
+
+ if [ "${skip_install}" = "True" ] || [ "${skip_install}" = "true" ]; then
+ info_msg "install_deps skipped"
+ else
+ ! check_root && \
+ error_msg "About to install packages, please run this script as root."
+ info_msg "Installing ${pkgs}"
+ dist_name
+ case "${dist}" in
+ debian|ubuntu)
+ # Use the default answers for all questions.
+ DEBIAN_FRONTEND=noninteractive apt-get update -q -y
+ # shellcheck disable=SC2086
+ DEBIAN_FRONTEND=noninteractive apt-get install -q -y ${pkgs}
+ ;;
+ centos)
+ # shellcheck disable=SC2086
+ yum -e 0 -y install ${pkgs}
+ ;;
+ fedora)
+ # shellcheck disable=SC2086
+ dnf -e 0 -y install ${pkgs}
+ ;;
+ *)
+ warn_msg "Unsupported distro: ${dist}! Package installation skipped."
+ ;;
+ esac
+ fi
+}
+
+# Return the exit code of the first command when using pipe.
+pipe0_status() {
+ [ "$#" -ne 2 ] && error_msg "Usage: pipe0_status cmd1 cmd2"
+ cmd1="$1"
+ cmd2="$2"
+
+ exec 4>&1
+ ret_val=$({ { eval "${cmd1}" 3>&-; echo "$?" 1>&3; } 4>&- \
+ | eval "${cmd2}" 1>&4; } 3>&1)
+ exec 4>&-
+
+ return "${ret_val}"
+}
+
+validate_check_sum() {
+ if [ "$#" -ne 2 ]; then
+ warn_msg "The number of parameters should be 2"
+ error_msg "Usage: validate_check_sum filename known_sha256sum"
+ return 1
+ fi
+ OUTPUT_FILE_NAME="$1"
+ SHA256SUM_CHECK="$2"
+ # Get sha256sum of output_file
+ GET_SHA256SUM=$(sha256sum "${OUTPUT_FILE_NAME}" | awk '{print $1}')
+ echo "GET_SHA256SUM is ${GET_SHA256SUM}"
+ if [ "${SHA256SUM_CHECK}" = "${GET_SHA256SUM}" ] ; then
+ return 0
+ else
+ echo "checksum did not match"
+ return 1
+ fi
+}
+
+convert_to_mb() {
+ [ "$#" -ne 2 ] && error_msg "Usage: convert_to_mb value units"
+ if ! echo "$1" | egrep -q "^[0-9.]+$"; then
+ error_msg "The first argument isn't a number"
+ fi
+ value="$1"
+ units="$2"
+
+ case "${units}" in
+ KB|kb) value=$(echo "${value}" | awk '{print $1/1024}') ;;
+ MB|mb) ;;
+ GB|gb) value=$(echo "${value}" | awk '{print $1*1024}') ;;
+ TB|tb) value=$(echo "${value}" | awk '{print $1*1024*1024}') ;;
+ *) error_msg "Unsupported units" ;;
+ esac
+
+ echo "${value}"
+}
+
+dist_info() {
+ if ! command -v lsb_release > /dev/null; then
+ dist_name
+ case "${dist}" in
+ debian|ubuntu) install_deps "lsb-release" ;;
+ centos|fedora) install_deps "redhat-lsb-core" ;;
+ *) warn_msg "Unsupported distro: dist_info skipped"
+ esac
+ fi
+
+ # shellcheck disable=SC2034
+ Release=$(lsb_release -r | awk '{print $2}')
+ Codename=$(lsb_release -c | awk '{print $2}')
+}
+
+add_key() {
+ [ "$#" -ne 1 ] && error_msg "Usage: add_key url"
+ url="$1"
+
+ ! check_root && \
+ error_msg "About to use apt-key, please run this script as root."
+ dist_name
+ case "${dist}" in
+ debian|ubuntu) wget -O - "${url}" | apt-key add - ;;
+ centos|fedora) infor_msg "add_key isn't needed on ${dist}" ;;
+ *) warn_msg "Unsupported distro: add_key skipped"
+ esac
+}
+
+add_repo() {
+ [ "$#" -lt 1 ] && error_msg "Usage: add_repo <url> [backports]"
+ url="$1"
+
+ ! check_root && \
+ error_msg "About to add a repo, please run this script as root."
+ dist_name
+ case "${dist}" in
+ # Detect Debian/Ubuntu codename and add repo automatically. The same url
+ # should work on all distributions supported by the repo.
+ debian|ubuntu)
+ dist_info
+ if [ -z "$2" ]; then
+ backports=""
+ elif [ "$2" = "backports" ]; then
+ backports="-backports"
+ else
+ echo "Usage: add_repo <url> [backports]"
+ error_msg "$2 is not a supported argument, should be 'backports'"
+ fi
+ echo "deb ${url} ${Codename}${backports} main" \
+ >> "/etc/apt/sources.list.d/3rd-party-repo.list"
+ ;;
+ # It is not easy to amend url with distro version as its format may vary
+ # by repo. Test definition/plan should provide a correct repo url.
+ centos|fedora)
+ wget -O - "${url}" >> "/etc/yum.repos.d/3rd-party.repo"
+ ;;
+ *)
+ warn_msg "Unsupported distro: ${dist}! add_repo skipped"
+ ;;
+ esac
+}
+
+create_out_dir() {
+ [ -z "$1" ] && error_msg "Usage: create_out_dir output_dir"
+ OUTPUT=$1
+ [ -d "${OUTPUT}" ] &&
+ mv "${OUTPUT}" "${OUTPUT}_$(date -r "${OUTPUT}" +%Y%m%d%H%M%S)"
+ mkdir -p "${OUTPUT}"
+ [ -d "${OUTPUT}" ] || error_msg "Could not create output directory ${OUTPUT}"
+}