X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=tests%2Futils%2Futils.sh;h=0e8ec54dd4f102b99424466eafc5275f0ba10092;hb=HEAD;hp=2752b0f7a76c84eec8ad2f70db5c9340c7162022;hpb=bade86436a3004fc696c5dc4d17607f63653b933;p=lttng-tools.git diff --git a/tests/utils/utils.sh b/tests/utils/utils.sh index 2752b0f7a..9bb557ad8 100644 --- a/tests/utils/utils.sh +++ b/tests/utils/utils.sh @@ -13,8 +13,14 @@ RELAYD_BIN="lttng-relayd" RELAYD_MATCH=".*lttng-relayd.*" LTTNG_BIN="lttng" BABELTRACE_BIN="babeltrace2" -OUTPUT_DEST=/dev/null -ERROR_OUTPUT_DEST=/dev/null +LTTNG_TEST_LOG_DIR="${LTTNG_TEST_LOG_DIR:-}" +LTTNG_TEST_VERBOSE_BABELTRACE="${LTTNG_TEST_VERBOSE_BABELTRACE:-}" +LTTNG_TEST_BABELTRACE_VERBOSITY="${LTTNG_TEST_BABELTRACE_VERBOSITY:-I}" +LTTNG_TEST_VERBOSE_CLIENT="${LTTNG_TEST_VERBOSE_CLIENT:-}" +LTTNG_TEST_VERBOSE_RELAYD="${LTTNG_TEST_VERBOSE_RELAYD:-}" +LTTNG_TEST_VERBOSE_SESSIOND="${LTTNG_TEST_VERBOSE_SESSIOND:-}" +OUTPUT_DEST="${OUTPUT_DEST:-}" # For 'lttng', some scripts set this to catch a command output +ERROR_OUTPUT_DEST="${ERROR_OUTPUT_DEST:-}" # For 'lttng', some scripts set this to catch a command error output MI_XSD_MAJOR_VERSION=4 MI_XSD_MINOR_VERSION=1 MI_XSD_PATH="$TESTDIR/../src/common/mi-lttng-${MI_XSD_MAJOR_VERSION}.${MI_XSD_MINOR_VERSION}.xsd" @@ -127,6 +133,47 @@ if [ -z "$PGREP" ]; then PGREP=pgrep fi +function _lttng_client_log_file () +{ + local output_dest="${1}" + if [[ -n "${output_dest}" ]]; then + if [[ "${output_dest}" != "-" ]]; then + echo "${output_dest}" + fi + elif [[ -n "${LTTNG_TEST_LOG_DIR}" ]]; then + if [[ "${LTTNG_TEST_LOG_DIR}" != "-" ]]; then + mktemp -p "${LTTNG_TEST_LOG_DIR}" "lttng.XXXXXX" + fi + else + echo "/dev/null" + fi +} + +function lttng_client_log_file () +{ + _lttng_client_log_file "${OUTPUT_DEST}" +} + +function lttng_client_err_file () +{ + _lttng_client_log_file "${ERROR_OUTPUT_DEST}" +} + +function lttng_log_file () +{ + local app="${1:-}" + if [[ -z "${app}" ]] || [[ -z "${LTTNG_TEST_LOG_DIR}" ]]; then + echo "/dev/null" + return + fi + + if [[ "${LTTNG_TEST_LOG_DIR}" == "-" ]]; then + return + fi + + mktemp -p "${LTTNG_TEST_LOG_DIR}" "${app}.XXXXXX.log" +} + # Due to the renaming of threads we need to use the full command (pgrep -f) to # identify the pids for multiple lttng related processes. The problem with "pgrep # -f" is that it ends up also looking at the arguments. We use a two stage @@ -148,7 +195,7 @@ function lttng_pgrep () while IFS= read -r pid ; do # /proc/pid/cmdline is null separated. - if full_command_no_argument=$(cut -d '' -f 1 2>/dev/null < /proc/"$pid"/cmdline); then + if full_command_no_argument=$( (tr '\0' '\n' < /proc/"$pid"/cmdline) 2>/dev/null | head -n1); then command_basename=$(basename "$full_command_no_argument") if grep -q "$pattern" <<< "$command_basename"; then echo "$pid" @@ -204,11 +251,126 @@ function validate_kernel_version () # $2 = include special characters; 1 = yes, 0 = no; defaults to yes function randstring() { + local len="${1:-16}" + [ "$2" == "0" ] && CHAR="[:alnum:]" || CHAR="[:graph:]" - cat /dev/urandom 2>/dev/null | tr -cd "$CHAR" 2>/dev/null | head -c ${1:-16} 2>/dev/null + # /dev/urandom isn't guaranteed to generate valid multi-byte characters. + # Specifying the C locale eliminates the "Illegal byte sequence" error + # that 'tr' outputs in such cases. + LC_CTYPE=C tr -cd "$CHAR" < /dev/urandom 2>/dev/null | head -c "$len" 2>/dev/null echo } +function get_pipe_max_size() +{ + if grep -q 'FreeBSD' /etc/os-release ; then + # Kernel configuration dependant, but defaults to 64 * 1024 + # https://github.com/freebsd/freebsd-src/blob/5b0dc991093c82824f6fe566af947f64f5072264/sys/sys/pipe.h#L33 + echo 65536 + else + cat /proc/sys/fs/pipe-max-size + fi +} + +# Return a space-separated string of online CPU IDs, based on +# /sys/devices/system/cpu/online, or from 0 to nproc - 1 otherwise. +function get_online_cpus() +{ + local cpus=() + local range_re + if [ -f /sys/devices/system/cpu/online ]; then + range_re='([0-9]+)-([0-9]+)' + while read -r range ; do + if [[ "${range}" =~ ${range_re} ]] ; then + mapfile -t -O "${#cpus[*]}" cpus <<< $(seq "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}") + else + cpus+=("${range}") + fi + done < <(tr ',' $'\n' < /sys/devices/system/cpu/online) + else + read -r -a cpus <<< $(seq 0 $(( $(conf_proc_count) - 1 )) ) + fi + echo "${cpus[*]}" +} + +# Helpers for get_possible_cpus. +function get_possible_cpus_count_from_sysfs_possible_mask() +{ + local max_possible_cpu_id + + # The Awk script extracts the highest CPU id from the possible CPU + # mask. Assuming a numerical order, a field separator '-' and a record + # separator ','. The last value parsed is the highest id. + if [ -f /sys/devices/system/cpu/possible ]; then + max_possible_cpu_id=$(awk -F '-' 'BEGIN { RS = ","} { last = $NF } END { printf("%d\n", last) }' \ + /sys/devices/system/cpu/possible) + echo "$((max_possible_cpu_id+1))" + else + echo "0" + fi +} + +# This is a fallback if the possible CPU mask is not available. This will not +# take into account unplugged CPUs. +function get_max_cpus_count_from_sysfs_cpu_directories() +{ + local max_possible_cpu_id=0 + local current_cpu_id + + for i in /sys/devices/system/cpu/cpu[0-9]*; do + current_cpu_id="${i#/sys/devices/system/cpu/cpu}" + if [ "$current_cpu_id" -gt "$max_possible_cpu_id" ]; then + max_possible_cpu_id="$current_cpu_id" + fi + done + + echo "$((max_possible_cpu_id+1))" +} + +# Return the number of possible CPUs. +function get_possible_cpus_count() +{ + local possible_cpus_count + possible_cpus_count=$(get_possible_cpus_count_from_sysfs_possible_mask) + + if [ "$possible_cpus_count" -eq "0" ]; then + local configured_cpus_count + configured_cpus_count=$(getconf _NPROCESSORS_CONF) + possible_cpus_count=$(get_max_cpus_count_from_sysfs_cpu_directories) + possible_cpus_count=$((configured_cpus_count > possible_cpus_count \ + ? configured_cpus_count \ + : possible_cpus_count)) + fi + + echo "$possible_cpus_count" +} + +# Return the list of exposed CPU. +# +# NOTE! Use it like so: +# +# IFS=" " read -r -a VARIABLE <<< "$(get_exposed_cpus_list)" +function get_exposed_cpus_list() +{ + local list=() + + for i in /sys/devices/system/cpu/cpu[0-9]*; do + list+=("${i#/sys/devices/system/cpu/cpu}") + done + + echo "${list[@]}" +} + +# Return any available CPU found. Do not make assumption about the returned +# value, e.g. that it could be 0. +function get_any_available_cpu() +{ + for cpu in $(get_online_cpus); do + echo "${cpu}" + break; + done +} + # Return the number of _configured_ CPUs. function conf_proc_count() { @@ -219,6 +381,41 @@ function conf_proc_count() echo } +# Usage: +# check_skip_kernel_test [NB_TESTS] [SKIP_MESSAGE] +# Return 0 if LTTNG_TOOLS_DISABLE_KERNEL_TESTS was set or the current user is not a root user +# If NB_TESTS is set, call skip() to skip number of tests. +# If NB_TESTS is empty, just output a reason with diag. +# An optional message can be added. + +function check_skip_kernel_test () +{ + local num_tests="$1" + local skip_message="$2" + + # Check for skip test kernel flag + if [ "$LTTNG_TOOLS_DISABLE_KERNEL_TESTS" == "1" ]; then + if ! test -z "$num_tests"; then + skip 0 "LTTNG_TOOLS_DISABLE_KERNEL_TESTS was set.${skip_message+ }${skip_message}" "$num_tests" + else + diag "LTTNG_TOOLS_DISABLE_KERNEL_TESTS was set.${skip_message+ }${skip_message}" + fi + return 0 + fi + + # Check if we are running as root + if [ "$(id -u)" != "0" ]; then + if ! test -z "$num_tests"; then + skip 0 "Root access is needed for kernel testing.${skip_message+ }${skip_message}" "$num_tests" + else + diag "Root access is needed for kernel testing.${skip_message+ }${skip_message}" + fi + return 0 + fi + + return 1 +} + # Check if base lttng-modules are present. # Bail out on failure function validate_lttng_modules_present () @@ -230,7 +427,7 @@ function validate_lttng_modules_present () fi # Check for builtin modules. - ls /proc/lttng > /dev/null 2>&1 + ls /proc/lttng >/dev/null 2>&1 if [ $? -eq 0 ]; then return 0 fi @@ -238,6 +435,27 @@ function validate_lttng_modules_present () LTTNG_BAIL_OUT "LTTng modules not detected." } +# Run the babeltrace binary +function _run_babeltrace_cmd () +{ + local err_log + local opts + + err_log="$(lttng_log_file babeltrace.err)" + + opts=("${@}") + if [[ -n "${LTTNG_TEST_VERBOSE_BABELTRACE}" ]]; then + opts=('-l' "${LTTNG_TEST_BABELTRACE_VERBOSITY}" "${opts[@]}") + fi + + diag "${BABELTRACE_BIN} ${opts[*]} # Error log: '${err_log:-N/A}'" >&2 + if [[ -n "${err_log}" ]]; then + "${BABELTRACE_BIN}" "${opts[@]}" 2>"${err_log}" + else + "${BABELTRACE_BIN}" "${opts[@]}" + fi +} + # Run the lttng binary. # # The first two arguments are stdout and stderr redirect paths, respectively. @@ -248,8 +466,21 @@ function _run_lttng_cmd local stderr_dest="$2" shift 2 - diag "$TESTDIR/../src/bin/lttng/$LTTNG_BIN $*" - $TESTDIR/../src/bin/lttng/$LTTNG_BIN "$@" 1> "$stdout_dest" 2> "$stderr_dest" + opts=("${@}") + if [[ -n "${LTTNG_TEST_VERBOSE_CLIENT}" ]] ; then + opts=('-vvv' "${opts[@]}") + fi + + diag "$TESTDIR/../src/bin/lttng/$LTTNG_BIN ${opts[*]}" + if [[ -n "${stdout_dest}" ]] && [[ -n "${stderr_dest}" ]] ; then + $TESTDIR/../src/bin/lttng/$LTTNG_BIN "${opts[@]}" >"${stdout_dest}" 2>"${stderr_dest}" + elif [[ -n "${stdout_dest}" ]] && [[ -z "${stderr_dest}" ]]; then + $TESTDIR/../src/bin/lttng/$LTTNG_BIN "${opts[@]}" >"${stdout_dest}" + elif [[ -z "${stdout_dest}" ]] && [[ -n "${stderr_dest}" ]] ; then + $TESTDIR/../src/bin/lttng/$LTTNG_BIN "${opts[@]}" 2>"${stderr_dest}" + else + $TESTDIR/../src/bin/lttng/$LTTNG_BIN "${opts[@]}" + fi } function enable_kernel_lttng_event @@ -272,7 +503,7 @@ function enable_kernel_lttng_event chan="-c $channel_name" fi - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ enable-event "$event_name" $chan -s $sess_name -k ret=$? if [[ $expected_to_fail -eq "1" ]]; then @@ -328,7 +559,7 @@ function lttng_enable_kernel_syscall() chan="-c $channel_name" fi - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ enable-event --syscall "$syscall_name" $chan -s $sess_name -k ret=$? if [[ $expected_to_fail -eq "1" ]]; then @@ -368,7 +599,7 @@ function lttng_disable_kernel_syscall() chan="-c $channel_name" fi - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ disable-event --syscall "$syscall_name" $chan -s $sess_name -k ret=$? @@ -397,7 +628,7 @@ function lttng_enable_kernel_function_event () local target="$3" local event_name="$4" - "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" enable-event --kernel --function="$target" "$event_name" -s "$sess_name" > "$OUTPUT_DEST" 2> "$ERROR_OUTPUT_DEST" + "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" enable-event --kernel --function="$target" "$event_name" -s "$sess_name" >"$(lttng_client_log_file)" 2>"$(lttng_client_err_file)" ret=$? if [[ $expected_to_fail -eq "1" ]]; then test $ret -ne "0" @@ -419,7 +650,7 @@ function lttng_enable_kernel_userspace_probe_event () local target="$3" local event_name="$4" - "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" enable-event --kernel --userspace-probe="$target" "$event_name" -s "$sess_name" > "$OUTPUT_DEST" 2> "$ERROR_OUTPUT_DEST" + "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" enable-event --kernel --userspace-probe="$target" "$event_name" -s "$sess_name" >"$(lttng_client_log_file)" 2>"$(lttng_client_err_file)" ret=$? if [[ $expected_to_fail -eq "1" ]]; then test $ret -ne "0" @@ -444,7 +675,7 @@ function disable_kernel_lttng_userspace_probe_event_ok () local sess_name="$1" local event_name="$2" - "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" disable-event --kernel "$event_name" -s "$sess_name" > "$OUTPUT_DEST" 2> "$ERROR_OUTPUT_DEST" + "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" disable-event --kernel "$event_name" -s "$sess_name" >"$(lttng_client_log_file)" 2>"$(lttng_client_err_file)" ok $? "Disable kernel event $target for session $sess_name" } function lttng_enable_kernel_channel() @@ -455,7 +686,7 @@ function lttng_enable_kernel_channel() local channel_name=$4 local opts="${@:5}" - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ enable-channel -k $channel_name -s $sess_name $opts ret=$? if [[ $expected_to_fail -eq "1" ]]; then @@ -497,7 +728,7 @@ function lttng_disable_kernel_channel() local sess_name=$2 local channel_name=$3 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ disable-channel -k $channel_name -s $sess_name ret=$? if [[ $expected_to_fail -eq "1" ]]; then @@ -522,26 +753,37 @@ function start_lttng_relayd_opt() { local withtap=$1 local process_mode=$2 - local opt=$3 + shift 2 || true + # This is intentionally not quoted inside the array so something like '-o /tmp/x' is split + # shellcheck disable=SC2206 + local opts=(${@}) + local log_file="${RELAYD_ERROR_OUTPUT_DEST:-$(lttng_log_file relayd)}" DIR=$(readlink -f "$TESTDIR") + if [[ -n "${LTTNG_TEST_VERBOSE_RELAYD}" ]] ; then + opts+=('-vvv') + fi + + if [[ -n "${log_file}" ]] ; then + diag "Relayd log file: ${log_file}" + fi + if [ -z $(lttng_pgrep "$RELAYD_MATCH") ]; then # shellcheck disable=SC2086 - $DIR/../src/bin/lttng-relayd/$RELAYD_BIN $process_mode $opt 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST - #$DIR/../src/bin/lttng-relayd/$RELAYD_BIN $opt -vvv >>/tmp/relayd.log 2>&1 & - if [ $? -eq 1 ]; then - if [ $withtap -eq "1" ]; then - fail "Start lttng-relayd (process mode: $process_mode opt: $opt)" - fi - return 1 + if [[ -n "${log_file}" ]]; then + $DIR/../src/bin/lttng-relayd/$RELAYD_BIN $process_mode "${opts[@]}" >"${log_file}" 2>&1 else - if [ $withtap -eq "1" ]; then - pass "Start lttng-relayd (process mode: $process_mode opt: $opt)" - fi + $DIR/../src/bin/lttng-relayd/$RELAYD_BIN $process_mode "${opts[@]}" + fi + local ret="${?}" + if [ $withtap -eq "1" ]; then + ok $ret "Start lttng-relayd (process mode: $process_mode opt: ${opts[*]})" + else + return $ret fi else - pass "Start lttng-relayd (opt: $opt)" + pass "Start lttng-relayd (opt: ${opts[*]})" fi } @@ -571,8 +813,9 @@ function stop_lttng_relayd_opt() # Multiply time by 2 to simplify integer arithmetic + # Multiply time by 5 to adjust for sleeping every 0.1s if [ -n "$timeout_s" ]; then - dtimeleft_s=$((timeout_s * 2)) + dtimeleft_s=$((timeout_s * 2 * 5)) fi @@ -591,7 +834,7 @@ function stop_lttng_relayd_opt() diag "Killing (signal $signal) lttng-relayd (pid: $pids)" # shellcheck disable=SC2086 - if ! kill -s $signal $pids 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST; then + if ! kill -s $signal $pids; then retval=1 if [ "$withtap" -eq "1" ]; then fail "Kill relay daemon" @@ -607,7 +850,7 @@ function stop_lttng_relayd_opt() fi dtimeleft_s=$((dtimeleft_s - 1)) fi - sleep 0.5 + sleep 0.1 done if [ "$withtap" -eq "1" ]; then if [ "$retval" -eq "0" ]; then @@ -644,6 +887,8 @@ function start_lttng_sessiond_opt() # The rest of the arguments will be passed directly to lttng-sessiond. shift 2 + local opts=("${@}") + local log_file="$(lttng_log_file sessiond)" local env_vars="" local consumerd="" @@ -656,6 +901,13 @@ function start_lttng_sessiond_opt() return fi + if [[ -n "${LTTNG_TEST_VERBOSE_SESSIOND}" ]]; then + opts+=( + '-vvv' + '--verbose-consumer' + ) + fi + DIR=$(readlink -f "$TESTDIR") # Get long_bit value for 32/64 consumerd @@ -678,8 +930,8 @@ function start_lttng_sessiond_opt() env_vars="${env_vars}$DIR/../src/bin/lttng-sessiond/$SESSIOND_BIN" if ! validate_kernel_version; then - fail "Start session daemon" - LTTNG_BAIL_OUT "*** Kernel too old for session daemon tests ***" + fail "Start session daemon" + LTTNG_BAIL_OUT "*** Kernel too old for session daemon tests ***" fi diag "export LTTNG_SESSION_CONFIG_XSD_PATH=${DIR}/../src/common/" @@ -689,15 +941,24 @@ function start_lttng_sessiond_opt() if [ -z "$(lttng_pgrep "${SESSIOND_MATCH}")" ]; then # Have a load path ? if [ -n "$load_path" ]; then - diag "env $env_vars --load $load_path --background $consumerd $@" - # shellcheck disable=SC2086 - env $env_vars --load "$load_path" --background "$consumerd" "$@" + diag "env $env_vars --load $load_path --background $consumerd ${opts[*]}" + if [[ -n "${log_file}" ]]; then + # shellcheck disable=SC2086 + env $env_vars --load "$load_path" --background "$consumerd" "${opts[@]}" >"${log_file}" 2>&1 + else + # shellcheck disable=SC2086 + env $env_vars --load "$load_path" --background "$consumerd" "${opts[@]}" + fi else - diag "env $env_vars --background $consumerd $@" - # shellcheck disable=SC2086 - env $env_vars --background "$consumerd" "$@" + diag "env $env_vars --background $consumerd ${opts[*]}" + if [[ -n "${log_file}" ]]; then + # shellcheck disable=SC2086 + env $env_vars --background "$consumerd" "${opts[@]}" >"${log_file}" 2>&1 + else + # shellcheck disable=SC2086 + env $env_vars --background "$consumerd" "${opts[@]}" + fi fi - #$DIR/../src/bin/lttng-sessiond/$SESSIOND_BIN --background --consumerd32-path="$DIR/../src/bin/lttng-consumerd/lttng-consumerd" --consumerd64-path="$DIR/../src/bin/lttng-consumerd/lttng-consumerd" --verbose-consumer >>/tmp/sessiond.log 2>&1 status=$? if [ "$withtap" -eq "1" ]; then ok $status "Start session daemon" @@ -731,8 +992,9 @@ function stop_lttng_sessiond_opt() fi # Multiply time by 2 to simplify integer arithmetic + # Multiply time by 5 to adjust for sleeping every 0.1s if [ -n "$timeout_s" ]; then - dtimeleft_s=$((timeout_s * 2)) + dtimeleft_s=$((timeout_s * 2 * 5)) fi if [ -n "$TEST_NO_SESSIOND" ] && [ "$TEST_NO_SESSIOND" == "1" ]; then @@ -761,7 +1023,7 @@ function stop_lttng_sessiond_opt() diag "Killing (signal $signal) $SESSIOND_BIN and lt-$SESSIOND_BIN pids: $(echo "$pids" | tr '\n' ' ')" # shellcheck disable=SC2086 - if ! kill -s $signal $pids 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST; then + if ! kill -s $signal $pids; then retval=1 if [ "$withtap" -eq "1" ]; then fail "Kill sessions daemon" @@ -777,7 +1039,7 @@ function stop_lttng_sessiond_opt() fi dtimeleft_s=$((dtimeleft_s - 1)) fi - sleep 0.5 + sleep 0.1 done out=1 while [ -n "$out" ]; do @@ -789,7 +1051,7 @@ function stop_lttng_sessiond_opt() fi dtimeleft_s=$((dtimeleft_s - 1)) fi - sleep 0.5 + sleep 0.1 done if [ "$withtap" -eq "1" ]; then @@ -848,7 +1110,7 @@ function sigstop_lttng_sessiond_opt() fi # shellcheck disable=SC2086 - if ! kill -s $signal $pids 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST; then + if ! kill -s $signal $pids; then if [ "$withtap" -eq "1" ]; then fail "Sending SIGSTOP to session daemon" fi @@ -899,8 +1161,9 @@ function stop_lttng_consumerd_opt() fi # Multiply time by 2 to simplify integer arithmetic + # Multiply time by 5 to adjust for sleeping every 0.1s if [ -n "$timeout_s" ]; then - dtimeleft_s=$((timeout_s * 2)) + dtimeleft_s=$((timeout_s * 2 * 5)) fi pids="$(lttng_pgrep "$CONSUMERD_MATCH")" @@ -919,7 +1182,7 @@ function stop_lttng_consumerd_opt() diag "Killing (signal $signal) $CONSUMERD_BIN pids: $(echo "$pids" | tr '\n' ' ')" # shellcheck disable=SC2086 - if ! kill -s $signal $pids 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST; then + if ! kill -s $signal $pids; then retval=1 if [ "$withtap" -eq "1" ]; then fail "Kill consumer daemon" @@ -945,7 +1208,7 @@ function stop_lttng_consumerd_opt() fi dtimeleft_s=$((dtimeleft_s - 1)) fi - sleep 0.5 + sleep 0.1 done if [ "$withtap" -eq "1" ]; then if [ "$retval" -eq "0" ]; then @@ -985,7 +1248,7 @@ function sigstop_lttng_consumerd_opt() diag "Sending SIGSTOP to $CONSUMERD_BIN pids: $(echo "$pids" | tr '\n' ' ')" # shellcheck disable=SC2086 - kill -s $signal $pids 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + kill -s $signal $pids retval=$? if [ $retval -eq 1 ]; then @@ -1032,7 +1295,7 @@ function list_lttng_with_opts () local withtap=$1 shift local opts=$1 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ list $opts ret=$? if [ $withtap -eq "1" ]; then @@ -1055,7 +1318,7 @@ function create_lttng_session_no_output () local sess_name=$1 local opts="${@:2}" - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ create $sess_name --no-output $opts ok $? "Create session $sess_name in no-output mode" } @@ -1065,7 +1328,7 @@ function create_lttng_session_uri () { local uri=$2 local opts="${@:3}" - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ create $sess_name -U $uri $opts ok $? "Create session $sess_name with uri:$uri and opts: $opts" } @@ -1085,7 +1348,7 @@ function create_lttng_session () trace_path="-o $trace_path" fi - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ create "$sess_name" $trace_path $opt ret=$? if [ $expected_to_fail -eq "1" ]; then @@ -1126,7 +1389,7 @@ function enable_ust_lttng_channel () local channel_name=$4 local opts="${@:5}" - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ enable-channel -u $channel_name -s $sess_name $opts ret=$? if [[ $expected_to_fail -eq "1" ]]; then @@ -1163,7 +1426,7 @@ function disable_ust_lttng_channel() local sess_name=$1 local channel_name=$2 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ disable-channel -u $channel_name -s $sess_name ok $? "Disable channel $channel_name for session $sess_name" } @@ -1173,7 +1436,7 @@ function enable_lttng_mmap_overwrite_kernel_channel() local sess_name=$1 local channel_name=$2 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ enable-channel -s $sess_name $channel_name -k --output mmap --overwrite ok $? "Enable channel $channel_name for session $sess_name" } @@ -1183,7 +1446,7 @@ function enable_lttng_mmap_discard_small_kernel_channel() local sess_name=$1 local channel_name=$2 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ enable-channel -s $sess_name $channel_name -k --output mmap --discard --subbuf-size=$(getconf PAGE_SIZE) --num-subbuf=2 ok $? "Enable small discard channel $channel_name for session $sess_name" } @@ -1193,9 +1456,9 @@ function enable_lttng_mmap_overwrite_small_kernel_channel() local sess_name=$1 local channel_name=$2 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ enable-channel -s $sess_name $channel_name -k --output mmap --overwrite --subbuf-size=$(getconf PAGE_SIZE) --num-subbuf=2 - ok $? "Enable small discard channel $channel_name for session $sess_name" + ok $? "Enable small overwrite channel $channel_name for session $sess_name" } function enable_lttng_mmap_overwrite_ust_channel() @@ -1203,7 +1466,7 @@ function enable_lttng_mmap_overwrite_ust_channel() local sess_name=$1 local channel_name=$2 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ enable-channel -s $sess_name $channel_name -u --output mmap --overwrite ok $? "Enable channel $channel_name for session $sess_name" } @@ -1223,7 +1486,7 @@ function enable_ust_lttng_event () chan="-c $channel_name" fi - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ enable-event "$event_name" $chan -s "$sess_name" -u ret=$? if [[ $expected_to_fail -eq "1" ]]; then @@ -1268,7 +1531,7 @@ function enable_jul_lttng_event() chan="-c $channel_name" fi - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ enable-event "$event_name" $chan -s $sess_name -j ok $? "Enable JUL event $event_name for session $sess_name" } @@ -1287,7 +1550,7 @@ function enable_jul_lttng_event_loglevel() chan="-c $channel_name" fi - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ enable-event --loglevel $loglevel "$event_name" $chan -s $sess_name -j ok $? "Enable JUL event $event_name for session $sess_name with loglevel $loglevel" } @@ -1305,7 +1568,7 @@ function enable_log4j_lttng_event() chan_opt=("-c" "$channel_name") fi - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ enable-event "$event_name" "${chan_opt[@]}" -s "$sess_name" --log4j ok $? "Enable LOG4J event '$event_name' for session '$sess_name'" } @@ -1316,7 +1579,7 @@ function enable_log4j_lttng_event_filter() local event_name=$2 local filter=$3 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ enable-event "$event_name" -s "$sess_name" --log4j --filter "$filter" ok $? "Enable LOG4J event '$event_name' with filter '$filter' for session '$sess_name'" } @@ -1328,7 +1591,7 @@ function enable_log4j_lttng_event_filter_loglevel_only() local filter=$3 local loglevel=$4 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ enable-event --loglevel-only "$loglevel" "$event_name" -s "$sess_name" -l --filter "$filter" ok $? "Enable LOG4J event '$event_name' with filter '$filter' and loglevel-only '$loglevel' for session '$sess_name'" } @@ -1346,7 +1609,7 @@ function enable_log4j_lttng_event_loglevel() chan_opt=("-c" "$channel_name") fi - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ enable-event --loglevel "$loglevel" "$event_name" "${chan_opt[@]}" -s "$sess_name" --log4j ok $? "Enable LOG4J event '$event_name' for session '$sess_name' with loglevel '$loglevel'" } @@ -1365,11 +1628,90 @@ function enable_log4j_lttng_event_loglevel_only() chan_opt=("-c" "$channel_name") fi - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ enable-event --loglevel-only "$loglevel" "$event_name" "${chan_opt[@]}" -s "$sess_name" --log4j ok $? "Enable LOG4J event '$event_name' for session '$sess_name' with loglevel-only '$loglevel'" } +function enable_log4j2_lttng_event() +{ + local sess_name=$1 + local event_name=$2 + local channel_name=$3 + + local chan_opt=() + + # default channel if none specified + if [ -n "$channel_name" ]; then + chan_opt=("-c" "$channel_name") + fi + + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + enable-event "$event_name" "${chan_opt[@]}" -s "$sess_name" --log4j2 + ok $? "Enable LOG4J2 event '$event_name' for session '$sess_name'" +} + +function enable_log4j2_lttng_event_filter() +{ + local sess_name=$1 + local event_name=$2 + local filter=$3 + + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + enable-event "$event_name" -s "$sess_name" --log4j2 --filter "$filter" + ok $? "Enable LOG4J2 event '$event_name' with filter '$filter' for session '$sess_name'" +} + +function enable_log4j2_lttng_event_filter_loglevel_only() +{ + local sess_name=$1 + local event_name=$2 + local filter=$3 + local loglevel=$4 + + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + enable-event --loglevel-only "$loglevel" "$event_name" -s "$sess_name" --log4j2 --filter "$filter" + ok $? "Enable LOG4J2 event '$event_name' with filter '$filter' and loglevel-only '$loglevel' for session '$sess_name'" +} + +function enable_log4j2_lttng_event_loglevel() +{ + local sess_name=$1 + local event_name=$2 + local loglevel=$3 + local channel_name=$4 + + local chan_opt=() + + # default channel if none specified + if [ -n "$channel_name" ]; then + chan_opt=("-c" "$channel_name") + fi + + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + enable-event --loglevel "$loglevel" "$event_name" "${chan_opt[@]}" -s "$sess_name" --log4j2 + ok $? "Enable LOG4J2 event '$event_name' for session '$sess_name' with loglevel '$loglevel'" +} + +function enable_log4j2_lttng_event_loglevel_only() +{ + local sess_name=$1 + local event_name=$2 + local loglevel=$3 + local channel_name=$4 + + local chan_opt=() + + # default channel if none specified + if [ -n "$channel_name" ]; then + chan_opt=("-c" "$channel_name") + fi + + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + enable-event --loglevel-only "$loglevel" "$event_name" "${chan_opt[@]}" -s "$sess_name" --log4j2 + ok $? "Enable LOG4J2 event '$event_name' for session '$sess_name' with loglevel-only '$loglevel'" +} + function enable_python_lttng_event() { sess_name=$1 @@ -1383,7 +1725,7 @@ function enable_python_lttng_event() chan="-c $channel_name" fi - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ enable-event "$event_name" $chan -s $sess_name -p ok $? "Enable Python event $event_name for session $sess_name" } @@ -1402,7 +1744,7 @@ function enable_python_lttng_event_loglevel() chan="-c $channel_name" fi - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ enable-event --loglevel $loglevel "$event_name" $chan -s $sess_name -p ok $? "Enable Python event $event_name for session $sess_name with loglevel $loglevel" } @@ -1421,7 +1763,7 @@ function enable_ust_lttng_event_filter() chan="-c $channel_name" fi - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ enable-event $chan "$event_name" -s $sess_name -u --filter "$filter" ok $? "Enable event $event_name with filtering for session $sess_name" } @@ -1431,9 +1773,14 @@ function enable_ust_lttng_event_loglevel() local sess_name="$1" local event_name="$2" local loglevel="$3" + local channel_name="$4" + local chan=() + if [ -n "${channel_name}" ] ; then + chan=('-c' "${channel_name}") + fi - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ - enable-event "$event_name" -s $sess_name -u --loglevel $loglevel + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ + enable-event "${chan[@]}" "$event_name" -s "${sess_name}" -u --loglevel="${loglevel}" ok $? "Enable event $event_name with loglevel $loglevel" } @@ -1442,9 +1789,14 @@ function enable_ust_lttng_event_loglevel_only() local sess_name="$1" local event_name="$2" local loglevel="$3" + local channel_name="$4" + local chan=() + if [ -n "${channel_name}" ] ; then + chan=('-c' "${channel_name}") + fi - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ - enable-event "$event_name" -s $sess_name -u --loglevel-only $loglevel + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ + enable-event "${chan[@]}" "$event_name" -s "${sess_name}" -u --loglevel-only "${loglevel}" ok $? "Enable event $event_name with loglevel-only $loglevel" } @@ -1461,7 +1813,7 @@ function disable_ust_lttng_event () chan="-c $channel_name" fi - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ disable-event "$event_name" -s $sess_name $chan -u ok $? "Disable event $event_name for session $sess_name" } @@ -1480,17 +1832,27 @@ function disable_log4j_lttng_event () local sess_name="$1" local event_name="$2" - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ disable-event "$event_name" -s "$sess_name" --log4j ok $? "Disable LOG4J event '$event_name' for session '$sess_name'" } +function disable_log4j2_lttng_event () +{ + local sess_name=$1 + local event_name=$2 + + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + disable-event "$event_name" -s "$sess_name" --log4j2 + ok $? "Disable LOG4J2 event '$event_name' for session '$sess_name'" +} + function disable_python_lttng_event () { local sess_name="$1" local event_name="$2" - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ disable-event "$event_name" -s $sess_name -p ok $? "Disable Python event $event_name for session $sess_name" } @@ -1501,7 +1863,7 @@ function start_lttng_tracing_opt () local expected_to_fail=$2 local sess_name=$3 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ start $sess_name ret=$? if [[ $expected_to_fail -eq "1" ]]; then @@ -1538,7 +1900,7 @@ function stop_lttng_tracing_opt () local expected_to_fail=$2 local sess_name=$3 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ stop $sess_name ret=$? if [[ $expected_to_fail -eq "1" ]]; then @@ -1574,9 +1936,10 @@ function destroy_lttng_session () local withtap=$1 local expected_to_fail=$2 local sess_name=$3 + shift 3 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ - destroy $sess_name + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ + destroy $sess_name $@ ret=$? if [[ $expected_to_fail -eq "1" ]]; then test "$ret" -ne "0" @@ -1609,7 +1972,7 @@ function destroy_lttng_session_notap () function destroy_lttng_sessions () { - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ destroy --all ok $? "Destroy all lttng sessions" } @@ -1621,7 +1984,7 @@ function lttng_snapshot_add_output () local trace_path=$3 local opts=$4 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ snapshot add-output -s $sess_name $trace_path $opts ret=$? if [[ $expected_to_fail -eq 1 ]]; then @@ -1648,7 +2011,7 @@ function lttng_snapshot_del_output () local sess_name=$2 local id=$3 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ snapshot del-output -s $sess_name $id ret=$? if [[ $expected_to_fail -eq "1" ]]; then @@ -1674,7 +2037,7 @@ function lttng_snapshot_record () local sess_name=$1 local trace_path=$2 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ snapshot record -s "$sess_name" "$trace_path" ok $? "Snapshot recorded" } @@ -1682,7 +2045,7 @@ function lttng_snapshot_record () function lttng_snapshot_list () { local sess_name=$1 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ snapshot list-output -s $sess_name ok $? "Snapshot list" } @@ -1692,7 +2055,7 @@ function lttng_save() local sess_name=$1 local opts=$2 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ save $sess_name $opts ok $? "Session saved" } @@ -1702,7 +2065,7 @@ function lttng_load() local expected_to_fail=$1 local opts=$2 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ load $opts ret=$? if [[ $expected_to_fail -eq "1" ]]; then @@ -1728,7 +2091,7 @@ function lttng_track() local expected_to_fail="$1" shift 1 local opts="$@" - $TESTDIR/../src/bin/lttng/$LTTNG_BIN track $opts >$OUTPUT_DEST + $TESTDIR/../src/bin/lttng/$LTTNG_BIN track $opts >"$(lttng_client_log_file)" ret=$? if [[ $expected_to_fail -eq "1" ]]; then test $ret -ne "0" @@ -1753,7 +2116,7 @@ function lttng_untrack() local expected_to_fail="$1" shift 1 local opts="$@" - $TESTDIR/../src/bin/lttng/$LTTNG_BIN untrack $opts >$OUTPUT_DEST + $TESTDIR/../src/bin/lttng/$LTTNG_BIN untrack $opts >"$(lttng_client_log_file)" ret=$? if [[ $expected_to_fail -eq "1" ]]; then test $ret -ne "0" @@ -1776,13 +2139,13 @@ function lttng_untrack_fail() function lttng_track_pid_ok() { PID=$1 - "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" track --kernel --pid=$PID 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" track --kernel --pid=$PID 1>"$(lttng_client_log_file)" 2>"$(lttng_client_err_file)" ok $? "Lttng track pid on the kernel domain" } function lttng_untrack_kernel_all_ok() { - "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" untrack --kernel --pid --all 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" untrack --kernel --pid --all 1>"$(lttng_client_log_file)" 2>"$(lttng_client_err_file)" ok $? "Lttng untrack all pid on the kernel domain" } @@ -1828,7 +2191,7 @@ function lttng_untrack_kernel_fail() function lttng_add_context_list() { - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ add-context --list ret=$? ok $ret "Context listing" @@ -1842,7 +2205,7 @@ function add_context_lttng() local channel_name="$4" local type="$5" - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ add-context -s $session_name -c $channel_name -t $type $domain ret=$? if [[ $expected_to_fail -eq "1" ]]; then @@ -1880,8 +2243,8 @@ function wait_live_trace_ready () diag "Waiting for live trace at url: $url" while [ $zero_client_match -eq 0 ]; do - zero_client_match=$($BABELTRACE_BIN -i lttng-live $url | grep "0 client(s) connected" | wc -l) - sleep 0.5 + zero_client_match=$(_run_babeltrace_cmd -i lttng-live $url | grep "0 client(s) connected" | wc -l) + sleep 0.1 done pass "Waiting for live trace at url: $url" } @@ -1893,8 +2256,8 @@ function wait_live_viewer_connect () diag "Waiting for live viewers on url: $url" while [ $one_client_match -eq 0 ]; do - one_client_match=$($BABELTRACE_BIN -i lttng-live $url | grep "1 client(s) connected" | wc -l) - sleep 0.5 + one_client_match=$(_run_babeltrace_cmd -i lttng-live $url | grep "1 client(s) connected" | wc -l) + sleep 0.1 done pass "Waiting for live viewers on url: $url" } @@ -1907,216 +2270,220 @@ function bail_out_if_no_babeltrace() fi } -function validate_metadata_event () +# Check that the trace metadata contains '$expected' event ids matching '$event_name'. +function validate_metadata_event() { local event_name=$1 - local nr_event_id=$2 + local expected=$2 local trace_path=$3 - local metadata_file=$(find $trace_path -name "metadata") - local metadata_path=$(dirname $metadata_file) + local metadata_file + local metadata_path + local count + + metadata_file=$(find "$trace_path" -name "metadata") + metadata_path=$(dirname "$metadata_file") bail_out_if_no_babeltrace - local count=$($BABELTRACE_BIN --output-format=ctf-metadata $metadata_path | grep $event_name | wc -l) - - if [ "$count" -ne "$nr_event_id" ]; then - fail "Metadata match with the metadata of $nr_event_id event(s) named $event_name" - diag "$count matching event names found in metadata" - else - pass "Metadata match with the metadata of $nr_event_id event(s) named $event_name" - fi + count=$(_run_babeltrace_cmd --output-format=ctf-metadata "$metadata_path" | grep -c "$event_name") + test "$count" -eq "$expected" + ok $? "Found $count / $expected metadata event id matching '$event_name'" } -function trace_matches () +# Check that the trace contains '$expected' events matching '$event_name', other +# events not matching '$event_name' can be present. +function trace_matches() { local event_name=$1 - local nr_iter=$2 + local expected=$2 local trace_path=$3 + local count + local total + bail_out_if_no_babeltrace - local count=$($BABELTRACE_BIN $trace_path | grep $event_name | wc -l) + count=$(_run_babeltrace_cmd "$trace_path" | grep -c "$event_name") + total=$(_run_babeltrace_cmd "$trace_path" | wc -l) - if [ "$count" -ne "$nr_iter" ]; then - fail "Trace match" - diag "$count matching events found in trace" - else - pass "Trace match" - fi + test "$count" -eq "$expected" + + ok $? "Found $count / $expected events matching '$event_name' out of $total events" } +# Check that the trace contains '$expected' events matching '$event_name' and no +# other events. function trace_match_only() { local event_name=$1 - local nr_iter=$2 + local expected=$2 local trace_path=$3 + local count + local total + bail_out_if_no_babeltrace - #which "$BABELTRACE_BIN" >/dev/null - #skip $? -ne 0 "\"$BABELTRACE_BIN\" binary not found. Skipping trace comparison" - local count=$($BABELTRACE_BIN $trace_path | grep $event_name | wc -l) - local total=$($BABELTRACE_BIN $trace_path | wc -l) + count=$(_run_babeltrace_cmd "$trace_path" | grep -c "$event_name") + total=$(_run_babeltrace_cmd "$trace_path" | wc -l) - if [ "$nr_iter" -eq "$count" ] && [ "$total" -eq "$nr_iter" ]; then - pass "Trace match with $total event $event_name" - else - fail "Trace match" - diag "$total event(s) found, expecting $nr_iter of event $event_name and only found $count" - fi + test "$expected" -eq "$count" && test "$total" -eq "$expected" + + ok $? "Found $count / $expected events matching '$event_name' amongst $total events" } -function validate_trace +# Check that the trace contains at least 1 event matching each name in the +# comma separated list '$event_names'. +function validate_trace() { - local event_name=$1 + local event_names=$1 local trace_path=$2 + local count + bail_out_if_no_babeltrace OLDIFS=$IFS IFS="," - for i in $event_name; do - traced=$($BABELTRACE_BIN $trace_path 2>/dev/null | grep $i | wc -l) - if [ "$traced" -ne 0 ]; then - pass "Validate trace for event $i, $traced events" - else - fail "Validate trace for event $i" - diag "Found $traced occurrences of $i" - fi + for event_name in $event_names; do + # trace_path is unquoted since callers make use of globbing + count=$(_run_babeltrace_cmd $trace_path | grep -c "$event_name") + test "$count" -gt 0 + ok $? "Found $count events matching '$event_name'" done - ret=$? IFS=$OLDIFS - return $ret } -function validate_trace_count +# Check that the trace contains at least 1 event matching each name in the +# comma separated list '$event_names' and a total of '$expected' events. +function validate_trace_count() { - local event_name=$1 + local event_names=$1 local trace_path=$2 - local expected_count=$3 + local expected=$3 + + local count + local total=0 bail_out_if_no_babeltrace - cnt=0 OLDIFS=$IFS IFS="," - for i in $event_name; do - traced=$($BABELTRACE_BIN $trace_path 2>/dev/null | grep $i | wc -l) - if [ "$traced" -ne 0 ]; then - pass "Validate trace for event $i, $traced events" - else - fail "Validate trace for event $i" - diag "Found $traced occurrences of $i" - fi - cnt=$(($cnt + $traced)) + for event_name in $event_names; do + count=$(_run_babeltrace_cmd "$trace_path" | grep -c "$event_name") + test "$count" -gt 0 + ok $? "Found '$count' events matching '$event_name'" + total=$(( total + count )) done IFS=$OLDIFS - test $cnt -eq $expected_count - ok $? "Read a total of $cnt events, expected $expected_count" + test $total -eq "$expected" + ok $? "Found $total events, expected $expected events" } -function validate_trace_count_range_incl_min_excl_max +# Check that the trace contains at least '$expected_min' event matching each +# name in the comma separated list '$event_names' and a total at least +# '$expected_min' and less than '$expected_max' events. +function validate_trace_count_range_incl_min_excl_max() { - local event_name=$1 + local event_names=$1 local trace_path=$2 local expected_min=$3 local expected_max=$4 + local count + local total=0 + bail_out_if_no_babeltrace - cnt=0 OLDIFS=$IFS IFS="," - for i in $event_name; do - traced=$($BABELTRACE_BIN $trace_path 2>/dev/null | grep $i | wc -l) - if [ "$traced" -ge $expected_min ]; then - pass "Validate trace for event $i, $traced events" - else - fail "Validate trace for event $i" - diag "Found $traced occurrences of $i" - fi - cnt=$(($cnt + $traced)) + for event_name in $event_names; do + count=$(_run_babeltrace_cmd "$trace_path" | grep -c "$event_name") + test "$count" -ge "$expected_min" + ok $? "Found $count events matching '$event_name', expected at least $expected_min" + total=$(( total + count )) done IFS=$OLDIFS - test $cnt -lt $expected_max - ok $? "Read a total of $cnt events, expected between [$expected_min, $expected_max[" + test $total -ge "$expected_min" && test $total -lt "$expected_max" + ok $? "Found a total of $total events, expected at least $expected_min and less than $expected_max" } -function trace_first_line +function trace_first_line() { local trace_path=$1 - $BABELTRACE_BIN $trace_path 2>/dev/null | head -n 1 + _run_babeltrace_cmd "$trace_path" | head -n 1 } +# Check that the trace contains at least 1 event matching the grep extended +# regexp '$event_exp'. function validate_trace_exp() { local event_exp=$1 local trace_path=$2 + local count + bail_out_if_no_babeltrace - traced=$($BABELTRACE_BIN $trace_path 2>/dev/null | grep --extended-regexp ${event_exp} | wc -l) - if [ "$traced" -ne 0 ]; then - pass "Validate trace for expression '${event_exp}', $traced events" - else - fail "Validate trace for expression '${event_exp}'" - diag "Found $traced occurrences of '${event_exp}'" - fi - ret=$? - return $ret + # event_exp is unquoted since it contains multiple grep arguments + count=$(_run_babeltrace_cmd "$trace_path" | grep -c --extended-regexp $event_exp) + test "$count" -gt 0 + ok $? "Found $count events matching expression '$event_exp'" } +# Check that the trace contains at least 1 event matching the grep extended +# regexp '$event_exp' and zero event not matching it. function validate_trace_only_exp() { local event_exp=$1 local trace_path=$2 + local count + local total + bail_out_if_no_babeltrace - local count=$($BABELTRACE_BIN $trace_path | grep --extended-regexp ${event_exp} | wc -l) - local total=$($BABELTRACE_BIN $trace_path | wc -l) + # event_exp is unquoted since it contains multiple grep arguments + count=$(_run_babeltrace_cmd "$trace_path" | grep -c --extended-regexp $event_exp) + total=$(_run_babeltrace_cmd "$trace_path" | wc -l) - if [ "$count" -ne 0 ] && [ "$total" -eq "$count" ]; then - pass "Trace match with $total for expression '${event_exp}'" - else - fail "Trace match" - diag "$total syscall event(s) found, only syscalls matching expression '${event_exp}' ($count occurrences) are expected" - fi - ret=$? - return $ret + test "$count" -gt 0 && test "$total" -eq "$count" + ok $? "Found $count events matching expression '$event_exp' amongst $total events" } +# Check that the trace is valid and contains 0 event. function validate_trace_empty() { local trace_path=$1 + local ret + local count + bail_out_if_no_babeltrace - events=$($BABELTRACE_BIN $trace_path 2>/dev/null) + events=$(_run_babeltrace_cmd "$trace_path") ret=$? if [ $ret -ne 0 ]; then fail "Failed to parse trace" return $ret fi - traced=$(echo -n "$events" | wc -l) - if [ "$traced" -eq 0 ]; then - pass "Validate empty trace" - else - fail "Validate empty trace" - diag "Found $traced events in trace" - fi - ret=$? - return $ret + count=$(echo -n "$events" | wc -l) + test "$count" -eq 0 + ok $? "Validate trace is empty, found $count events" } function validate_directory_empty () { local trace_path="$1" + local files + local ret + local nb_files + # Do not double quote `$trace_path` below as we want wildcards to be # expanded. files="$(ls -A $trace_path)" @@ -2127,7 +2494,8 @@ function validate_directory_empty () fi nb_files="$(echo -n "$files" | wc -l)" - ok $nb_files "Directory \"$trace_path\" is empty" + test "$nb_files" -eq 0 + ok $? "Directory \"$trace_path\" is empty" } function validate_trace_session_ust_empty() @@ -2145,7 +2513,7 @@ function regenerate_metadata () local expected_to_fail=$1 local sess_name=$2 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ regenerate metadata -s $sess_name ret=$? if [[ $expected_to_fail -eq "1" ]]; then @@ -2171,7 +2539,7 @@ function regenerate_statedump () local expected_to_fail=$1 local sess_name=$2 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ regenerate statedump -s $sess_name ret=$? if [[ $expected_to_fail -eq "1" ]]; then @@ -2197,7 +2565,7 @@ function rotate_session () local expected_to_fail=$1 local sess_name=$2 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ rotate $sess_name ret=$? if [[ $expected_to_fail -eq "1" ]]; then @@ -2233,7 +2601,7 @@ function lttng_enable_rotation_timer () local sess_name=$2 local period=$3 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ enable-rotation -s $sess_name --timer $period ret=$? if [[ $expected_to_fail -eq "1" ]]; then @@ -2260,14 +2628,14 @@ function lttng_enable_rotation_size () local sess_name=$2 local size=$3 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ enable-rotation -s $sess_name --size $size ret=$? if [[ $expected_to_fail -eq "1" ]]; then test "$ret" -ne "0" - ok $? "Expected fail on rotate session $sess_name" + ok $? "Expected to fail to set a periodic rotation of session $sess_name" "every " $size " bytes" else - ok $ret "Rotate session $sess_name" + ok $ret "Set a scheduled rotation of session $sess_name" "every " $size " bytes" fi } @@ -2286,7 +2654,7 @@ function lttng_clear_session () local expected_to_fail=$1 local sess_name=$2 - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ clear $sess_name ret=$? if [[ $expected_to_fail -eq "1" ]]; then @@ -2309,7 +2677,7 @@ function lttng_clear_session_fail () function lttng_clear_all () { - _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" \ clear --all ok $? "Clear all lttng sessions" } @@ -2366,8 +2734,8 @@ function lttng_remove_trigger_ok() function list_triggers_matches_ok () { - local tmp_stdout=$(mktemp --tmpdir -t "tmp.${FUNCNAME[0]}_stdout.XXXXXX") - local tmp_stderr=$(mktemp --tmpdir -t "tmp.${FUNCNAME[0]}_stderr.XXXXXX") + local tmp_stdout=$(mktemp -t "tmp.${FUNCNAME[0]}_stdout.XXXXXX") + local tmp_stderr=$(mktemp -t "tmp.${FUNCNAME[0]}_stderr.XXXXXX") local test_name="$1" local expected_stdout_file="$2" @@ -2396,9 +2764,9 @@ function list_triggers_matches_mi_ok () local test_name="$1" local expected_stdout_file="$2" - tmp_stdout_raw=$(mktemp --tmpdir -t "tmp.${FUNCNAME[0]}_stdout.XXXXXX") - tmp_stdout=$(mktemp --tmpdir -t "tmp.${FUNCNAME[0]}_stdout.XXXXXX") - tmp_stderr=$(mktemp --tmpdir -t "tmp.${FUNCNAME[0]}_stderr.XXXXXX") + tmp_stdout_raw=$(mktemp -t "tmp.${FUNCNAME[0]}_stdout.XXXXXX") + tmp_stdout=$(mktemp -t "tmp.${FUNCNAME[0]}_stdout.XXXXXX") + tmp_stderr=$(mktemp -t "tmp.${FUNCNAME[0]}_stderr.XXXXXX") diag "$TESTDIR/../src/bin/lttng/$LTTNG_BIN --mi xml list-triggers"