X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=tests%2Futils%2Futils.sh;h=78bee0c63d16f1ea14433c5b5e61724f5db45c4a;hb=198b841770f31d35afe1e50ff52e41e7599759e3;hp=9ff25a0a57762fb029b91958a5c4b7183123f5ef;hpb=76404ef0a5abfd5151b2ba805cf142eb2b9d3c71;p=lttng-tools.git diff --git a/tests/utils/utils.sh b/tests/utils/utils.sh index 9ff25a0a5..78bee0c63 100644 --- a/tests/utils/utils.sh +++ b/tests/utils/utils.sh @@ -12,9 +12,17 @@ CONSUMERD_MATCH=".*lttng-consumerd.*" RELAYD_BIN="lttng-relayd" RELAYD_MATCH=".*lttng-relayd.*" LTTNG_BIN="lttng" -BABELTRACE_BIN="babeltrace" +BABELTRACE_BIN="babeltrace2" OUTPUT_DEST=/dev/null ERROR_OUTPUT_DEST=/dev/null +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" +MI_VALIDATE="$TESTDIR/utils/xml-utils/validate_xml ${MI_XSD_PATH}" + +XML_PRETTY="$TESTDIR/utils/xml-utils/pretty_xml" +XML_EXTRACT="$TESTDIR/utils/xml-utils/extract_xml" +XML_NODE_CHECK="${XML_EXTRACT} -e" # To match 20201127-175802 date_time_pattern="[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]" @@ -140,7 +148,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" @@ -196,11 +204,48 @@ 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 } +# Helpers for get_possible_cpus. +function get_possible_cpus_count_from_sysfs_possible_mask() +{ + local max_possible_cpu_id=$(cut -d '-' -f 2 < /sys/devices/system/cpu/possible) + echo $((max_possible_cpu_id+1)) +} + +function get_max_cpus_count_from_sysfs_cpu_directories() +{ + local max_possible_cpu_id= \ + $(find /sys/devices/system/cpu/ -mindepth 1 -maxdepth 1 -regex ".+cpu[0-9]+" | \ + sed -e 's/cpu//g' | \ + awk -F '/' '{ if ($NF > N) N = $NF } END { print N }') + echo $((max_possible_cpu_id+1)) +} + +# Return the number of possible CPUs. +function get_possible_cpus_count() +{ + local possible_cpus_count=$(get_possible_cpus_count_from_sysfs_possible_mask) + + if [ $? -ne 0 ]; then + possible_cpus_count=$(get_max_cpus_count_from_sysfs_cpu_directories) + local configured_cpus_count=$(getconf _NPROCESSORS_CONF) + possible_cpus_count=$(($configured_cpus_count > $possible_cpus_count \ + ? $configured_cpus_count \ + : $possible_cpus_count)) + fi + + echo $possible_cpus_count +} + # Return the number of _configured_ CPUs. function conf_proc_count() { @@ -230,6 +275,20 @@ function validate_lttng_modules_present () LTTNG_BAIL_OUT "LTTng modules not detected." } +# Run the lttng binary. +# +# The first two arguments are stdout and stderr redirect paths, respectively. +# The rest of the arguments are forwarded to the lttng binary +function _run_lttng_cmd +{ + local stdout_dest="$1" + 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" +} + function enable_kernel_lttng_event { local withtap="$1" @@ -250,7 +309,8 @@ function enable_kernel_lttng_event chan="-c $channel_name" fi - $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-event "$event_name" $chan -s $sess_name -k 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + enable-event "$event_name" $chan -s $sess_name -k ret=$? if [[ $expected_to_fail -eq "1" ]]; then test $ret -ne "0" @@ -305,7 +365,8 @@ function lttng_enable_kernel_syscall() chan="-c $channel_name" fi - $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-event --syscall "$syscall_name" $chan -s $sess_name -k 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + enable-event --syscall "$syscall_name" $chan -s $sess_name -k ret=$? if [[ $expected_to_fail -eq "1" ]]; then test $ret -ne "0" @@ -344,7 +405,8 @@ function lttng_disable_kernel_syscall() chan="-c $channel_name" fi - $TESTDIR/../src/bin/lttng/$LTTNG_BIN disable-event --syscall "$syscall_name" $chan -s $sess_name -k 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + disable-event --syscall "$syscall_name" $chan -s $sess_name -k ret=$? if [[ $expected_to_fail -eq "1" ]]; then @@ -430,7 +492,8 @@ function lttng_enable_kernel_channel() local channel_name=$4 local opts="${@:5}" - $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-channel -k $channel_name -s $sess_name $opts 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + enable-channel -k $channel_name -s $sess_name $opts ret=$? if [[ $expected_to_fail -eq "1" ]]; then test "$ret" -ne "0" @@ -471,7 +534,8 @@ function lttng_disable_kernel_channel() local sess_name=$2 local channel_name=$3 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN disable-channel -k $channel_name -s $sess_name 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + disable-channel -k $channel_name -s $sess_name ret=$? if [[ $expected_to_fail -eq "1" ]]; then test "$ret" -ne "0" @@ -655,15 +719,18 @@ function start_lttng_sessiond_opt() LTTNG_BAIL_OUT "*** Kernel too old for session daemon tests ***" fi - : "${LTTNG_SESSION_CONFIG_XSD_PATH="${DIR}/../src/common/config/"}" + diag "export LTTNG_SESSION_CONFIG_XSD_PATH=${DIR}/../src/common/" + : "${LTTNG_SESSION_CONFIG_XSD_PATH="${DIR}/../src/common/"}" export LTTNG_SESSION_CONFIG_XSD_PATH 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" "$@" else + diag "env $env_vars --background $consumerd $@" # shellcheck disable=SC2086 env $env_vars --background "$consumerd" "$@" fi @@ -718,7 +785,7 @@ function stop_lttng_sessiond_opt() fi if [ -z "$pids" ]; then - if [ "$is_cleanup" -eq 1 ]; then + if [ "$is_cleanup" -eq 1 ]; then : elif [ "$withtap" -eq "1" ]; then fail "No session daemon to kill" @@ -998,9 +1065,26 @@ function sigstop_lttng_consumerd_notap() function list_lttng_with_opts () { + local ret + local withtap=$1 + shift local opts=$1 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN list $opts 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST - ok $? "Lttng-tool list command with option $opts" + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + list $opts + ret=$? + if [ $withtap -eq "1" ]; then + ok $ret "Lttng-tool list command with option $opts" + fi +} + +function list_lttng_ok () +{ + list_lttng_with_opts 1 "$@" +} + +function list_lttng_notap () +{ + list_lttng_with_opts 0 "$@" } function create_lttng_session_no_output () @@ -1008,7 +1092,8 @@ function create_lttng_session_no_output () local sess_name=$1 local opts="${@:2}" - $TESTDIR/../src/bin/lttng/$LTTNG_BIN create $sess_name --no-output $opts 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + create $sess_name --no-output $opts ok $? "Create session $sess_name in no-output mode" } @@ -1017,7 +1102,8 @@ function create_lttng_session_uri () { local uri=$2 local opts="${@:3}" - $TESTDIR/../src/bin/lttng/$LTTNG_BIN create $sess_name -U $uri $opts 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + create $sess_name -U $uri $opts ok $? "Create session $sess_name with uri:$uri and opts: $opts" } @@ -1036,7 +1122,8 @@ function create_lttng_session () trace_path="-o $trace_path" fi - $TESTDIR/../src/bin/lttng/$LTTNG_BIN create "$sess_name" $trace_path $opt 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + create "$sess_name" $trace_path $opt ret=$? if [ $expected_to_fail -eq "1" ]; then test "$ret" -ne "0" @@ -1076,7 +1163,8 @@ function enable_ust_lttng_channel () local channel_name=$4 local opts="${@:5}" - $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-channel -u $channel_name -s $sess_name $opts 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + enable-channel -u $channel_name -s $sess_name $opts ret=$? if [[ $expected_to_fail -eq "1" ]]; then test "$ret" -ne "0" @@ -1112,7 +1200,8 @@ function disable_ust_lttng_channel() local sess_name=$1 local channel_name=$2 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN disable-channel -u $channel_name -s $sess_name 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + disable-channel -u $channel_name -s $sess_name ok $? "Disable channel $channel_name for session $sess_name" } @@ -1121,7 +1210,8 @@ function enable_lttng_mmap_overwrite_kernel_channel() local sess_name=$1 local channel_name=$2 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-channel -s $sess_name $channel_name -k --output mmap --overwrite 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + enable-channel -s $sess_name $channel_name -k --output mmap --overwrite ok $? "Enable channel $channel_name for session $sess_name" } @@ -1130,7 +1220,8 @@ function enable_lttng_mmap_discard_small_kernel_channel() local sess_name=$1 local channel_name=$2 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-channel -s $sess_name $channel_name -k --output mmap --discard --subbuf-size=$(getconf PAGE_SIZE) --num-subbuf=2 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + 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" } @@ -1139,7 +1230,8 @@ function enable_lttng_mmap_overwrite_small_kernel_channel() local sess_name=$1 local channel_name=$2 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-channel -s $sess_name $channel_name -k --output mmap --overwrite --subbuf-size=$(getconf PAGE_SIZE) --num-subbuf=2 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + 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" } @@ -1148,7 +1240,8 @@ function enable_lttng_mmap_overwrite_ust_channel() local sess_name=$1 local channel_name=$2 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-channel -s $sess_name $channel_name -u --output mmap --overwrite 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + enable-channel -s $sess_name $channel_name -u --output mmap --overwrite ok $? "Enable channel $channel_name for session $sess_name" } @@ -1167,7 +1260,8 @@ function enable_ust_lttng_event () chan="-c $channel_name" fi - $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-event "$event_name" $chan -s $sess_name -u 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + enable-event "$event_name" $chan -s "$sess_name" -u ret=$? if [[ $expected_to_fail -eq "1" ]]; then test $ret -ne "0" @@ -1211,7 +1305,8 @@ function enable_jul_lttng_event() chan="-c $channel_name" fi - $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-event "$event_name" $chan -s $sess_name -j 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + enable-event "$event_name" $chan -s $sess_name -j ok $? "Enable JUL event $event_name for session $sess_name" } @@ -1229,43 +1324,87 @@ function enable_jul_lttng_event_loglevel() chan="-c $channel_name" fi - $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-event --loglevel $loglevel "$event_name" $chan -s $sess_name -j 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + enable-event --loglevel $loglevel "$event_name" $chan -s $sess_name -j ok $? "Enable JUL event $event_name for session $sess_name with loglevel $loglevel" } function enable_log4j_lttng_event() { - sess_name=$1 - event_name="$2" - channel_name=$3 + local sess_name=$1 + local event_name=$2 + local channel_name=$3 - if [ -z $channel_name ]; then - # default channel if none specified - chan="" - else - chan="-c $channel_name" + local chan_opt=() + + # default channel if none specified + if [ -n "$channel_name" ]; then + chan_opt=("-c" "$channel_name") fi - $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-event "$event_name" $chan -s $sess_name -l 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST - ok $? "Enable LOG4J event $event_name for session $sess_name" + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + enable-event "$event_name" "${chan_opt[@]}" -s "$sess_name" --log4j + ok $? "Enable LOG4J event '$event_name' for session '$sess_name'" +} + +function enable_log4j_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" --log4j --filter "$filter" + ok $? "Enable LOG4J event '$event_name' with filter '$filter' for session '$sess_name'" +} + +function enable_log4j_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" -l --filter "$filter" + ok $? "Enable LOG4J event '$event_name' with filter '$filter' and loglevel-only '$loglevel' for session '$sess_name'" } function enable_log4j_lttng_event_loglevel() { local sess_name=$1 - local event_name="$2" + local event_name=$2 local loglevel=$3 local channel_name=$4 - if [ -z $channel_name ]; then - # default channel if none specified - chan="" - else - chan="-c $channel_name" + + # default channel if none specified + if [ -n "$channel_name" ]; then + chan_opt=("-c" "$channel_name") fi - $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-event --loglevel $loglevel "$event_name" $chan -s $sess_name -l 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST - ok $? "Enable LOG4J event $event_name for session $sess_name with loglevel $loglevel" + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + 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'" +} + +function enable_log4j_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" --log4j + ok $? "Enable LOG4J event '$event_name' for session '$sess_name' with loglevel-only '$loglevel'" } function enable_python_lttng_event() @@ -1281,7 +1420,8 @@ function enable_python_lttng_event() chan="-c $channel_name" fi - $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-event "$event_name" $chan -s $sess_name -p 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + enable-event "$event_name" $chan -s $sess_name -p ok $? "Enable Python event $event_name for session $sess_name" } @@ -1299,7 +1439,8 @@ function enable_python_lttng_event_loglevel() chan="-c $channel_name" fi - $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-event --loglevel $loglevel "$event_name" $chan -s $sess_name -p 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + enable-event --loglevel $loglevel "$event_name" $chan -s $sess_name -p ok $? "Enable Python event $event_name for session $sess_name with loglevel $loglevel" } @@ -1317,7 +1458,8 @@ function enable_ust_lttng_event_filter() chan="-c $channel_name" fi - $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-event $chan "$event_name" -s $sess_name -u --filter "$filter" 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + enable-event $chan "$event_name" -s $sess_name -u --filter "$filter" ok $? "Enable event $event_name with filtering for session $sess_name" } @@ -1327,7 +1469,8 @@ function enable_ust_lttng_event_loglevel() local event_name="$2" local loglevel="$3" - $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-event "$event_name" -s $sess_name -u --loglevel $loglevel 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + enable-event "$event_name" -s $sess_name -u --loglevel $loglevel ok $? "Enable event $event_name with loglevel $loglevel" } @@ -1337,7 +1480,8 @@ function enable_ust_lttng_event_loglevel_only() local event_name="$2" local loglevel="$3" - $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-event "$event_name" -s $sess_name -u --loglevel-only $loglevel 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + enable-event "$event_name" -s $sess_name -u --loglevel-only $loglevel ok $? "Enable event $event_name with loglevel-only $loglevel" } @@ -1354,7 +1498,8 @@ function disable_ust_lttng_event () chan="-c $channel_name" fi - $TESTDIR/../src/bin/lttng/$LTTNG_BIN disable-event "$event_name" -s $sess_name $chan -u 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + disable-event "$event_name" -s $sess_name $chan -u ok $? "Disable event $event_name for session $sess_name" } @@ -1372,8 +1517,9 @@ function disable_log4j_lttng_event () local sess_name="$1" local event_name="$2" - $TESTDIR/../src/bin/lttng/$LTTNG_BIN disable-event "$event_name" -s $sess_name -l >/dev/null 2>&1 - ok $? "Disable LOG4J event $event_name for session $sess_name" + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + disable-event "$event_name" -s "$sess_name" --log4j + ok $? "Disable LOG4J event '$event_name' for session '$sess_name'" } function disable_python_lttng_event () @@ -1381,7 +1527,8 @@ function disable_python_lttng_event () local sess_name="$1" local event_name="$2" - $TESTDIR/../src/bin/lttng/$LTTNG_BIN disable-event "$event_name" -s $sess_name -p 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + disable-event "$event_name" -s $sess_name -p ok $? "Disable Python event $event_name for session $sess_name" } @@ -1391,7 +1538,8 @@ function start_lttng_tracing_opt () local expected_to_fail=$2 local sess_name=$3 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN start $sess_name 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + start $sess_name ret=$? if [[ $expected_to_fail -eq "1" ]]; then test "$ret" -ne "0" @@ -1427,7 +1575,8 @@ function stop_lttng_tracing_opt () local expected_to_fail=$2 local sess_name=$3 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN stop $sess_name 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + stop $sess_name ret=$? if [[ $expected_to_fail -eq "1" ]]; then test "$ret" -ne "0" @@ -1463,7 +1612,8 @@ function destroy_lttng_session () local expected_to_fail=$2 local sess_name=$3 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN destroy $sess_name 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + destroy $sess_name ret=$? if [[ $expected_to_fail -eq "1" ]]; then test "$ret" -ne "0" @@ -1496,7 +1646,8 @@ function destroy_lttng_session_notap () function destroy_lttng_sessions () { - $TESTDIR/../src/bin/lttng/$LTTNG_BIN destroy --all 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + destroy --all ok $? "Destroy all lttng sessions" } @@ -1507,7 +1658,8 @@ function lttng_snapshot_add_output () local trace_path=$3 local opts=$4 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN snapshot add-output -s $sess_name $trace_path $opts 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + snapshot add-output -s $sess_name $trace_path $opts ret=$? if [[ $expected_to_fail -eq 1 ]]; then test "$ret" -ne "0" @@ -1533,7 +1685,8 @@ function lttng_snapshot_del_output () local sess_name=$2 local id=$3 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN snapshot del-output -s $sess_name $id 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + snapshot del-output -s $sess_name $id ret=$? if [[ $expected_to_fail -eq "1" ]]; then test "$ret" -ne "0" @@ -1558,14 +1711,16 @@ function lttng_snapshot_record () local sess_name=$1 local trace_path=$2 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN snapshot record -s "$sess_name" "$trace_path" 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + snapshot record -s "$sess_name" "$trace_path" ok $? "Snapshot recorded" } function lttng_snapshot_list () { local sess_name=$1 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN snapshot list-output -s $sess_name 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + snapshot list-output -s $sess_name ok $? "Snapshot list" } @@ -1574,7 +1729,8 @@ function lttng_save() local sess_name=$1 local opts=$2 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN save $sess_name $opts 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + save $sess_name $opts ok $? "Session saved" } @@ -1583,7 +1739,8 @@ function lttng_load() local expected_to_fail=$1 local opts=$2 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN load $opts 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + load $opts ret=$? if [[ $expected_to_fail -eq "1" ]]; then test $ret -ne "0" @@ -1708,7 +1865,8 @@ function lttng_untrack_kernel_fail() function lttng_add_context_list() { - $TESTDIR/../src/bin/lttng/$LTTNG_BIN add-context --list 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + add-context --list ret=$? ok $ret "Context listing" } @@ -1721,7 +1879,8 @@ function add_context_lttng() local channel_name="$4" local type="$5" - $TESTDIR/../src/bin/lttng/$LTTNG_BIN add-context -s $session_name -c $channel_name -t $type $domain 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + add-context -s $session_name -c $channel_name -t $type $domain ret=$? if [[ $expected_to_fail -eq "1" ]]; then test $ret -ne "0" @@ -1777,236 +1936,228 @@ function wait_live_viewer_connect () pass "Waiting for live viewers on url: $url" } -function validate_metadata_event () +function bail_out_if_no_babeltrace() +{ + which "$BABELTRACE_BIN" >/dev/null + if [ $? -ne 0 ]; then + LTTNG_BAIL_OUT "\"$BABELTRACE_BIN\" binary not found. Skipping tests" + fi +} + +# 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 | grep metadata) - local metadata_path=$(dirname $metadata_file) + local metadata_file + local metadata_path + local count - which $BABELTRACE_BIN >/dev/null - skip $? -ne 0 "Babeltrace binary not found. Skipping trace matches" + metadata_file=$(find "$trace_path" -name "metadata") + metadata_path=$(dirname "$metadata_file") - local count=$($BABELTRACE_BIN --output-format=ctf-metadata $metadata_path | grep $event_name | wc -l) + bail_out_if_no_babeltrace - if [ "$count" -ne "$nr_event_id" ]; then - fail "Metadata match with the metadata of $count event(s) named $event_name" - diag "$count matching event id found in metadata" - else - pass "Metadata match with the metadata of $count event(s) named $event_name" - fi + count=$($BABELTRACE_BIN --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 - which $BABELTRACE_BIN >/dev/null - skip $? -ne 0 "Babeltrace binary not found. Skipping trace matches" + local count + local total - local count=$($BABELTRACE_BIN $trace_path | grep $event_name | wc -l) + bail_out_if_no_babeltrace - if [ "$count" -ne "$nr_iter" ]; then - fail "Trace match" - diag "$count matching events found in trace" - else - pass "Trace match" - fi + count=$($BABELTRACE_BIN "$trace_path" | grep -c "$event_name") + total=$($BABELTRACE_BIN "$trace_path" | wc -l) + + 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 - which $BABELTRACE_BIN >/dev/null - skip $? -ne 0 "Babeltrace binary not found. Skipping trace matches" + local count + local total - local count=$($BABELTRACE_BIN $trace_path | grep $event_name | wc -l) - local total=$($BABELTRACE_BIN $trace_path | wc -l) + bail_out_if_no_babeltrace - 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 + count=$($BABELTRACE_BIN "$trace_path" | grep -c "$event_name") + total=$($BABELTRACE_BIN "$trace_path" | wc -l) + + 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 - which $BABELTRACE_BIN >/dev/null - if [ $? -ne 0 ]; then - skip 0 "Babeltrace binary not found. Skipping trace validation" - fi + 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 occurences of $i" - fi + for event_name in $event_names; do + # trace_path is unquoted since callers make use of globbing + count=$($BABELTRACE_BIN $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 - which $BABELTRACE_BIN >/dev/null - if [ $? -ne 0 ]; then - skip 0 "Babeltrace binary not found. Skipping trace validation" - fi + 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 occurences of $i" - fi - cnt=$(($cnt + $traced)) + for event_name in $event_names; do + count=$($BABELTRACE_BIN "$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 - which $BABELTRACE_BIN >/dev/null - if [ $? -ne 0 ]; then - skip 0 "Babeltrace binary not found. Skipping trace validation" - fi + 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 occurences of $i" - fi - cnt=$(($cnt + $traced)) + for event_name in $event_names; do + count=$($BABELTRACE_BIN "$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 - which $BABELTRACE_BIN >/dev/null - if [ $? -ne 0 ]; then - skip 0 "Babeltrace binary not found. Skipping trace validation" - fi - - $BABELTRACE_BIN $trace_path 2>/dev/null | head -n 1 + $BABELTRACE_BIN "$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 - which $BABELTRACE_BIN >/dev/null - skip $? -ne 0 "Babeltrace binary not found. Skipping trace validation" + local count - 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 occurences of '${event_exp}'" - fi - ret=$? - return $ret + bail_out_if_no_babeltrace + + # event_exp is unquoted since it contains multiple grep arguments + count=$($BABELTRACE_BIN "$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 - which $BABELTRACE_BIN >/dev/null - skip $? -ne 0 "Babeltrace binary not found. Skipping trace matches" + local count + local total - local count=$($BABELTRACE_BIN $trace_path | grep --extended-regexp ${event_exp} | wc -l) - local total=$($BABELTRACE_BIN $trace_path | wc -l) + bail_out_if_no_babeltrace - 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 + # event_exp is unquoted since it contains multiple grep arguments + count=$($BABELTRACE_BIN "$trace_path" | grep -c --extended-regexp $event_exp) + total=$($BABELTRACE_BIN "$trace_path" | wc -l) + + 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 - which $BABELTRACE_BIN >/dev/null - if [ $? -ne 0 ]; then - skip 0 "Babeltrace binary not found. Skipping trace validation" - fi + local ret + local count + + bail_out_if_no_babeltrace - events=$($BABELTRACE_BIN $trace_path 2>/dev/null) + events=$($BABELTRACE_BIN "$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)" @@ -2017,7 +2168,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() @@ -2035,7 +2187,8 @@ function regenerate_metadata () local expected_to_fail=$1 local sess_name=$2 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN regenerate metadata -s $sess_name 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + regenerate metadata -s $sess_name ret=$? if [[ $expected_to_fail -eq "1" ]]; then test "$ret" -ne "0" @@ -2060,7 +2213,8 @@ function regenerate_statedump () local expected_to_fail=$1 local sess_name=$2 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN regenerate statedump -s $sess_name 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + regenerate statedump -s $sess_name ret=$? if [[ $expected_to_fail -eq "1" ]]; then test "$ret" -ne "0" @@ -2085,7 +2239,8 @@ function rotate_session () local expected_to_fail=$1 local sess_name=$2 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN rotate $sess_name 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + rotate $sess_name ret=$? if [[ $expected_to_fail -eq "1" ]]; then test "$ret" -ne "0" @@ -2120,7 +2275,8 @@ function lttng_enable_rotation_timer () local sess_name=$2 local period=$3 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-rotation -s $sess_name --timer $period 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + enable-rotation -s $sess_name --timer $period ret=$? if [[ $expected_to_fail -eq "1" ]]; then test "$ret" -ne "0" @@ -2146,13 +2302,14 @@ function lttng_enable_rotation_size () local sess_name=$2 local size=$3 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-rotation -s $sess_name --size $size 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + 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 } @@ -2171,7 +2328,8 @@ function lttng_clear_session () local expected_to_fail=$1 local sess_name=$2 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN clear $sess_name 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + clear $sess_name ret=$? if [[ $expected_to_fail -eq "1" ]]; then test "$ret" -ne "0" @@ -2193,7 +2351,8 @@ function lttng_clear_session_fail () function lttng_clear_all () { - $TESTDIR/../src/bin/lttng/$LTTNG_BIN clear --all 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + _run_lttng_cmd "$OUTPUT_DEST" "$ERROR_OUTPUT_DEST" \ + clear --all ok $? "Clear all lttng sessions" } @@ -2249,8 +2408,8 @@ function lttng_remove_trigger_ok() function list_triggers_matches_ok () { - local tmp_stdout=$(mktemp -t test_list_triggers_cli_stdout.XXXXXX) - local tmp_stderr=$(mktemp -t test_list_triggers_cli_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" @@ -2270,6 +2429,41 @@ function list_triggers_matches_ok () rm -f "${tmp_stderr}" } +function list_triggers_matches_mi_ok () +{ + local tmp_stdout + local tmp_stdout_raw + local tmp_stderr + + local test_name="$1" + local expected_stdout_file="$2" + + 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" + + "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" --mi=xml list-triggers > "${tmp_stdout_raw}" 2> "${tmp_stderr}" + ok $? "${test_name}: exit code is 0" + + # Pretty-fy xml before further test. + $XML_PRETTY < "${tmp_stdout_raw}" > "${tmp_stdout}" + + $MI_VALIDATE "${tmp_stdout}" + ok $? "list-trigger mi is valid" + + diff -u "${expected_stdout_file}" "${tmp_stdout}" + ok $? "${test_name}: expected stdout" + + diff -u /dev/null "${tmp_stderr}" + ok $? "${test_name}: expected stderr" + + rm -f "${tmp_stdout}" + rm -f "${tmp_stdout_raw}" + rm -f "${tmp_stderr}" +} + function validate_path_pattern () { local message=$1