cpp-common/bt2c/fmt.hpp: use `wise_enum::string_type` in `EnableIfIsWiseEnum` definition
[babeltrace.git] / tests / utils / utils.sh
index 3dddd60b141b2d4026cf67f7380768c5a3ad6eb4..692def5d7656d58e7b68e39b99481b038dbdf401 100644 (file)
 # An unbound variable is an error
 set -u
 
+# Sets the variable named `$1` to `$2` if it's not set, and exports it.
+_bt_tests_set_var_def() {
+       local -r varname=$1
+       local -r val=$2
+
+       if [[ -z ${!varname:-} ]]; then
+               eval "$varname='$val'"
+       fi
+
+       export "${varname?}"
+}
+
 # Name of the OS on which we're running, if not set.
 #
 # One of:
@@ -82,18 +94,10 @@ _set_vars_srcdir_builddir() {
        fi
 
        # Base source directory of tests
-       if [[ -z ${BT_TESTS_SRCDIR:-} ]]; then
-               BT_TESTS_SRCDIR=$testsdir
-       fi
-
-       export BT_TESTS_SRCDIR
+       _bt_tests_set_var_def BT_TESTS_SRCDIR "$testsdir"
 
        # Base build directory of tests
-       if [[ -z ${BT_TESTS_BUILDDIR:-} ]]; then
-               BT_TESTS_BUILDDIR=$testsdir
-       fi
-
-       export BT_TESTS_BUILDDIR
+       _bt_tests_set_var_def BT_TESTS_BUILDDIR "$testsdir"
 }
 
 _set_vars_srcdir_builddir
@@ -124,79 +128,47 @@ fi
 export BT_TESTS_BT2_BIN
 
 # This doesn't need to be exported, but it needs to remain set for
-# run_python_bt2() to use it.
+# bt_run_in_py_env() to use it.
 #
 # TODO: Remove when `tests/bindings/python/bt2/test_plugin.py` is fixed.
 _bt_tests_plugins_path=$BT_TESTS_BUILDDIR/../src/plugins
 
 # Colon-separated list of project plugin paths, if not set
-if [[ -z ${BT_TESTS_BABELTRACE_PLUGIN_PATH:-} ]]; then
-       BT_TESTS_BABELTRACE_PLUGIN_PATH=$_bt_tests_plugins_path/ctf:$_bt_tests_plugins_path/utils:$_bt_tests_plugins_path/text:$_bt_tests_plugins_path/lttng-utils
-fi
-
-export BT_TESTS_BABELTRACE_PLUGIN_PATH
+_bt_tests_set_var_def BT_TESTS_BABELTRACE_PLUGIN_PATH \
+       "$_bt_tests_plugins_path/ctf:$_bt_tests_plugins_path/utils:$_bt_tests_plugins_path/text:$_bt_tests_plugins_path/lttng-utils"
 
 # Directory containing the Python plugin provider library, if not set
-if [[ -z ${BT_TESTS_PROVIDER_DIR:-} ]]; then
-       BT_TESTS_PROVIDER_DIR=$BT_TESTS_BUILDDIR/../src/python-plugin-provider/.libs
-fi
-
-export BT_TESTS_PROVIDER_DIR
+_bt_tests_set_var_def BT_TESTS_PROVIDER_DIR "$BT_TESTS_BUILDDIR/../src/python-plugin-provider/.libs"
 
 # Directory containing the built `bt2` Python package, if not set
-if [[ -z ${BT_TESTS_PYTHONPATH:-} ]]; then
-       BT_TESTS_PYTHONPATH=$BT_TESTS_BUILDDIR/../src/bindings/python/bt2/build/build_lib
-fi
-
-export BT_TESTS_PYTHONPATH
+_bt_tests_set_var_def BT_TESTS_PYTHONPATH "$BT_TESTS_BUILDDIR/../src/bindings/python/bt2/build/build_lib"
 
 # Name of the `awk` command to use when testing, if not set
-if [[ -z ${BT_TESTS_AWK_BIN:-} ]]; then
-       BT_TESTS_AWK_BIN="awk"
-fi
-
-export BT_TESTS_AWK_BIN
+_bt_tests_set_var_def BT_TESTS_AWK_BIN awk
 
 # Name of the `grep` command to use when testing, if not set
-if [[ -z ${BT_TESTS_GREP_BIN:-} ]]; then
-       BT_TESTS_GREP_BIN="grep"
-fi
-
-export BT_TESTS_GREP_BIN
+_bt_tests_set_var_def BT_TESTS_GREP_BIN grep
 
 # Name of the `python3` command to use when testing, if not set
-if [[ -z ${BT_TESTS_PYTHON_BIN:-} ]]; then
-       BT_TESTS_PYTHON_BIN=python3
-fi
-
-export BT_TESTS_PYTHON_BIN
+_bt_tests_set_var_def BT_TESTS_PYTHON_BIN python3
 
 # Major and minor version of the `python3` command to use when testing.
 #
 # This doesn't need to be exported, but it needs to remain set for
-# run_python() to use it.
-_bt_tests_py3_version=$("$BT_TESTS_PYTHON_BIN" -c 'import sys; print("{}.{}".format(sys.version_info.major, sys.version_info.minor))')
+# bt_run_in_py_utils_env() to use it.
+_bt_tests_py3_version=$($BT_TESTS_PYTHON_BIN -c 'import sys; print("{}.{}".format(sys.version_info.major, sys.version_info.minor))')
 
 # Name of the `python3-config` command to use when testing, if not set
-if [[ -z ${BT_TESTS_PYTHON_CONFIG_BIN:-} ]]; then
-       BT_TESTS_PYTHON_CONFIG_BIN=python3-config
-fi
-
-export BT_TESTS_PYTHON_CONFIG_BIN
+_bt_tests_set_var_def BT_TESTS_PYTHON_CONFIG_BIN python3-config
 
 # Name of the `sed` command to use when testing, if not set
-if [[ -z ${BT_TESTS_SED_BIN:-} ]]; then
-       BT_TESTS_SED_BIN="sed"
-fi
-
-export BT_TESTS_SED_BIN
+_bt_tests_set_var_def BT_TESTS_SED_BIN sed
 
 # Name of the `cc` command to use when testing, if not set
-if [[ -z ${BT_TESTS_CC_BIN:-} ]]; then
-       BT_TESTS_CC_BIN=cc
-fi
+_bt_tests_set_var_def BT_TESTS_CC_BIN cc
 
-export BT_TESTS_CC_BIN
+# Done with _bt_tests_set_var_def()
+unset -f _bt_tests_set_var_def
 
 # Whether or not to enable AddressSanitizer, `0` (disabled) if not set.
 #
@@ -247,10 +219,10 @@ bt_cli() {
 
        shift 2
 
-       local -args=("$@")
+       local -a bt_cli_args=("$@")
 
-       echo "Running: \`$BT_TESTS_BT2_BIN ${args[*]}\`" >&2
-       run_python_bt2 "$BT_TESTS_BT2_BIN" "${args[@]}" 1>"$stdout_file" 2>"$stderr_file"
+       echo "Running: \`$BT_TESTS_BT2_BIN ${bt_cli_args[*]}\`" >&2
+       bt_run_in_py_env "$BT_TESTS_BT2_BIN" "${bt_cli_args[@]}" 1>"$stdout_file" 2>"$stderr_file"
 }
 
 # Checks the differences between:
@@ -346,7 +318,7 @@ bt_diff_details_ctf_gen_single() {
 
        shift 2
 
-       local -r extra_details_args=("$@")
+       local -r gen_extra_details_args=("$@")
        local -r temp_trace_dir=$(mktemp -d)
 
        # Run the CTF trace generator program to get a CTF trace
@@ -358,7 +330,7 @@ bt_diff_details_ctf_gen_single() {
 
        # Compare using the CLI with `sink.text.details`
        bt_diff_details_ctf_single "$expected_stdout_file" "$temp_trace_dir" \
-               "${extra_details_args[@]+${extra_details_args[@]}}"
+               "${gen_extra_details_args[@]+${gen_extra_details_args[@]}}"
 
        local -r ret=$?
 
@@ -404,7 +376,7 @@ _bt_tests_check_coverage() {
 
 # Executes a command within an environment which can import the testing
 # Python modules (in `tests/utils/python`).
-run_python() {
+bt_run_in_py_utils_env() {
        local our_pythonpath=$BT_TESTS_SRCDIR/utils/python
 
        if [[ $_bt_tests_py3_version =~ 3.[45] ]]; then
@@ -419,7 +391,7 @@ run_python() {
 
 # Executes a command within an environment which can import the testing
 # Python modules (in `tests/utils/python`) and the `bt2` Python package.
-run_python_bt2() {
+bt_run_in_py_env() {
        local -x BABELTRACE_PLUGIN_PATH=$BT_TESTS_BABELTRACE_PLUGIN_PATH
        local -x LIBBABELTRACE2_PLUGIN_PROVIDER_DIR=$BT_TESTS_PROVIDER_DIR
        local -x BT_TESTS_DATADIR=$BT_TESTS_DATADIR
@@ -444,7 +416,7 @@ run_python_bt2() {
        if [[ $BT_TESTS_OS_TYPE == mingw ]]; then
                local -x PYTHONHOME
 
-               PYTHONHOME=$("$BT_TESTS_PYTHON_CONFIG_BIN" --prefix)
+               PYTHONHOME=$($BT_TESTS_PYTHON_CONFIG_BIN --prefix)
        fi
 
        # If AddressSanitizer is used, we must preload `libasan.so` so that
@@ -456,24 +428,25 @@ run_python_bt2() {
        # Append it to existing `ASAN_OPTIONS` variable, such that we
        # override the user's value if it contains `detect_leaks=1`.
        if [[ ${BT_TESTS_ENABLE_ASAN:-} == 1 ]]; then
-               if "$BT_TESTS_CC_BIN" --version | head -n 1 | bt_grep -q '^gcc'; then
-                       local -r lib_asan=$("$BT_TESTS_CC_BIN" -print-file-name=libasan.so)
-                       local -x LD_PRELOAD=$lib_asan${LD_PRELOAD:+:}${LD_PRELOAD:-}
+               if $BT_TESTS_CC_BIN --version | head -n 1 | bt_grep -q '^gcc'; then
+                       local -r lib_asan=$($BT_TESTS_CC_BIN -print-file-name=libasan.so)
+                       local -r lib_stdcxx=$($BT_TESTS_CC_BIN -print-file-name=libstdc++.so)
+                       local -x LD_PRELOAD=$lib_asan:$lib_stdcxx${LD_PRELOAD:+:}${LD_PRELOAD:-}
                fi
 
                local -x ASAN_OPTIONS=${ASAN_OPTIONS:-}${ASAN_OPTIONS:+,}detect_leaks=0
        fi
 
-       run_python "$@"
+       bt_run_in_py_utils_env "$@"
 }
 
 # Runs the Python tests matching the pattern `$2` (optional, `*` if
 # missing) in the directory `$1` using `testrunner.py`.
 #
-# This function uses run_python_bt2(), therefore such tests can import
+# This function uses bt_run_in_py_env(), therefore such tests can import
 # the testing Python modules (in `tests/utils/python`) and the `bt2`
 # Python package.
-run_python_bt2_test() {
+bt_run_py_test() {
        local -r test_dir=$1
        local -r test_pattern=${2:-*}
        local python_exec
@@ -484,7 +457,7 @@ run_python_bt2_test() {
                python_exec=$BT_TESTS_PYTHON_BIN
        fi
 
-       run_python_bt2 \
+       bt_run_in_py_env \
                "$python_exec" "$BT_TESTS_SRCDIR/utils/python/testrunner.py" \
                --pattern "$test_pattern" "$test_dir"
 
@@ -503,7 +476,7 @@ run_python_bt2_test() {
 
 # Generates a CTF trace into the directory `$2` from the moultipart
 # document `$1` using `mctf.py`.
-gen_mctf_trace() {
+bt_gen_mctf_trace() {
        local -r input_file=$1
        local -r base_dir=$2
        local -r cmd=(
@@ -513,5 +486,11 @@ gen_mctf_trace() {
        )
 
        echo "Running: \`${cmd[*]}\`" >&2
-       run_python "${cmd[@]}"
+       bt_run_in_py_utils_env "${cmd[@]}"
+}
+
+# Call `diag` with the contents of file `$1`.
+
+diag_file() {
+       diag "$(cat "$1")"
 }
This page took 0.027225 seconds and 4 git commands to generate.