From: Jonathan Rajotte Date: Wed, 10 Aug 2022 22:38:55 +0000 (-0400) Subject: Tests: use jq for extracting info from ctf2 traces X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=commitdiff_plain;h=30977619e523366625a89dc614b574157a7ce043 Tests: use jq for extracting info from ctf2 traces Signed-off-by: Jonathan Rajotte Change-Id: I2a7542fd5548015721b6d03be6c1f839df73cdb3 --- diff --git a/tests/regression/kernel/test_clock_override b/tests/regression/kernel/test_clock_override index 0a44f5f28..104eb728a 100755 --- a/tests/regression/kernel/test_clock_override +++ b/tests/regression/kernel/test_clock_override @@ -8,7 +8,7 @@ TEST_DESC="Kernel tracer - Clock override plugin" -CURDIR=$(dirname $0)/ +CURDIR=$(dirname "$0")/ TESTDIR=$CURDIR/../.. SESSION_NAME="clock_override" @@ -17,25 +17,14 @@ EVENT_NAME="lttng_test_filter_event" TESTCMD="echo -n 10 > /proc/lttng-test-filter-event" -METADATA_CLOCK_START_TOKEN="clock {" -METADATA_CLOCK_END_TOKEN="};" - -METADATA_TOKEN_LIST=( - "name" - "uuid" - "description" - "freq" -) - -CLOCK_TOKEN_VALUE=( - "lttng_test_clock_override" - "83c63deb-7aa4-48fb-abda-946f400d76e6" - "Freeze time with 1KHz for regression test" - "1000" -) - source $TESTDIR/utils/utils.sh +if [ "$TRACE_FORMAT_OUTPUT" == "ctf1" ]; then + NUM_TESTS=30 +elif [ "$TRACE_FORMAT_OUTPUT" == "ctf2" ]; then + NUM_TESTS=28 +fi + function signal_cleanup() { diag "*** Exiting ***" @@ -44,29 +33,107 @@ function signal_cleanup() full_cleanup } -function extract_clock_metadata() +function extract_clock_metadata_ctf1() { + local metadata_clock_start_token="clock {" + local metadata_clock_end_token="};" + local metadata_file=$1 local clock_metadata_file_destination=$2 - cat $metadata_file \ - | sed -n "/$METADATA_CLOCK_START_TOKEN/,/$METADATA_CLOCK_END_TOKEN/p" \ - > $clock_metadata_file_destination + + sed -n "/$metadata_clock_start_token/,/$metadata_clock_end_token/p" "$metadata_file" > "$clock_metadata_file_destination" ok $? "Clock metadata extraction" } -function extract_clock_metadata_token() +function extract_clock_metadata_token_ctf1() { local clock_metadata_file=$1 local token=$2 # Look for token and get value between "" - cat $clock_metadata_file | grep $token | awk -F"= |;" '{print $2}' | tr -d '"' + grep "$token" "$clock_metadata_file" | awk -F"= |;" '{print $2}' | tr -d '"' +} + +function validate_tokens_ctf1 +{ + + local metadata_token_list=( + "name" + "uuid" + "description" + "freq" + ) + + local ust_clock_token_value=( + "lttng_test_clock_override" + "83c63deb-7aa4-48fb-abda-946f400d76e6" + "Freeze time with 1KHz for regression test" + "1000" + ) + + local metadata_directory_path=$1 + local ctf_metadata_file + local clock_metadata_file + + test ${#metadata_token_list[@]} -eq ${#ust_clock_token_value[@]} + ok $? "Tokens to check(${#metadata_token_list[@]}) and provided values(${#ust_clock_token_value[@]}) count is equal" + + + clock_metadata_file=$(mktemp --tmpdir -p "$TRACE_PATH" clock-metadata.XXXXXX) + ctf_metadata_file=$(mktemp --tmpdir -p "$TRACE_PATH" ctf-metadata.XXXXXX) + + $BABELTRACE_BIN -o ctf-metadata -w "$ctf_metadata_file" "$metadata_directory_path" + ok $? "Metadata extraction from babeltrace" + + extract_clock_metadata_ctf1 "$ctf_metadata_file" "$clock_metadata_file" + + local counter=0 + while [ "$counter" -lt "${#metadata_token_list[@]}" ]; do + result=$(extract_clock_metadata_token_ctf1 "$clock_metadata_file" \ + "${metadata_token_list[$counter]}") + test "$result" == "${ust_clock_token_value[$counter]}" + ok $? "Token \"${metadata_token_list[$counter]}\" expect:${ust_clock_token_value[$counter]} got:$result" + (( counter++ )) + done + + rm -rf "$ctf_metadata_file" + rm -rf "$clock_metadata_file" +} + +function validate_tokens_ctf2 +{ + local metadata_token_list=( + "name" + "uuid" + "description" + "frequency" + ) + + local ust_clock_token_value=( + "lttng_test_clock_override" + "[131,198,61,235,122,164,72,251,171,218,148,111,64,13,118,230]" + "Freeze time with 1KHz for regression test" + "1000" + ) + + test ${#metadata_token_list[@]} -eq ${#ust_clock_token_value[@]} + ok $? "Tokens to check(${#metadata_token_list[@]}) and provided values(${#ust_clock_token_value[@]}) count is equal" + + local metadata_path=$1 + + local counter=0 + while [ "$counter" -lt "${#metadata_token_list[@]}" ]; do + result=$(jq -c -r "select(.type == \"clock-class\").${metadata_token_list[$counter]}" "$metadata_path") + test "$result" == "${ust_clock_token_value[$counter]}" + ok $? "Token \"${metadata_token_list[$counter]}\" expect:${ust_clock_token_value[$counter]} got:$result" + (( counter++ )) + done + } function test_clock_override_metadata() { - local ctf_metadata_file=$(mktemp --tmpdir -p $TRACE_PATH ctf-metadata.XXXXXX) - local clock_metadata_file=$(mktemp --tmpdir -p $TRACE_PATH clock-metadata.XXXXXX) - local result="" + local trace_metadata_file_path + local trace_metadata_dir diag "Clock override plugin metadata test" @@ -74,37 +141,24 @@ function test_clock_override_metadata() start_lttng_sessiond modprobe lttng-test - create_lttng_session_ok $SESSION_NAME $TRACE_PATH + create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" enable_kernel_lttng_event_ok $SESSION_NAME "$EVENT_NAME" start_lttng_tracing_ok $SESSION_NAME - eval ${TESTCMD} + eval "${TESTCMD}" stop_lttng_tracing_ok $SESSION_NAME destroy_lttng_session_ok $SESSION_NAME stop_lttng_sessiond modprobe --remove lttng-test lttng-clock-plugin-test lttng-clock - local TRACE_METADATA_FILE_PATH="$(find "$TRACE_PATH" -name metadata -type f)" - local TRACE_METADATA_DIR="$(dirname "$TRACE_METADATA_FILE_PATH")" - - $BABELTRACE_BIN -o ctf-metadata -w $ctf_metadata_file $TRACE_METADATA_DIR - ok $? "Metadata extraction from babeltrace" - - extract_clock_metadata $ctf_metadata_file $clock_metadata_file - - test ${#METADATA_TOKEN_LIST[@]} -eq ${#CLOCK_TOKEN_VALUE[@]} - ok $? "Tokens to check(${#METADATA_TOKEN_LIST[@]}) and provided values(${#CLOCK_TOKEN_VALUE[@]}) count is equal" + trace_metadata_file_path="$(find "$TRACE_PATH" -name metadata -type f)" + trace_metadata_dir="$(dirname "$trace_metadata_file_path")" - local counter=0 - while [ "$counter" -lt "${#METADATA_TOKEN_LIST[@]}" ]; do - result=$(extract_clock_metadata_token $clock_metadata_file \ - ${METADATA_TOKEN_LIST[$counter]}) - test "$result" == "${CLOCK_TOKEN_VALUE[$counter]}" - ok $? "Token \"${METADATA_TOKEN_LIST[$counter]}\" expect:${CLOCK_TOKEN_VALUE[$counter]} got:$result" - let "counter++" - done - rm -rf $ctf_metadata_file - rm -rf $clock_metadata_file + if [ "$TRACE_FORMAT_OUTPUT" == "ctf1" ]; then + validate_tokens_ctf1 "$trace_metadata_dir" + elif [ "$TRACE_FORMAT_OUTPUT" == "ctf2" ]; then + validate_tokens_ctf2 "$trace_metadata_file_path" + fi } function test_clock_override_timestamp() @@ -117,18 +171,18 @@ function test_clock_override_timestamp() start_lttng_sessiond modprobe lttng-test - create_lttng_session_ok $SESSION_NAME $TRACE_PATH + create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" enable_kernel_lttng_event_ok $SESSION_NAME "$EVENT_NAME" start_lttng_tracing_ok $SESSION_NAME - eval ${TESTCMD} + eval "${TESTCMD}" stop_lttng_tracing_ok $SESSION_NAME destroy_lttng_session_ok $SESSION_NAME # Use Babeltrace with "-n all" to give a comma separated list for # easy extraction of timestamps. - unique_timestamps_count=$($BABELTRACE_BIN -n all $TRACE_PATH | \ + unique_timestamps_count=$($BABELTRACE_BIN -n all "$TRACE_PATH" | \ cut -d, -f1 | uniq | wc -l) - test $unique_timestamps_count -gt 1 + test "$unique_timestamps_count" -gt 1 ok $? "Unique event timestamps without clock override: $unique_timestamps_count expect >1" modprobe --remove lttng-test stop_lttng_sessiond @@ -141,10 +195,10 @@ function test_clock_override_timestamp() modprobe lttng-test start_lttng_sessiond - create_lttng_session_ok $SESSION_NAME $TRACE_PATH + create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" enable_kernel_lttng_event_ok $SESSION_NAME "$EVENT_NAME" start_lttng_tracing_ok $SESSION_NAME - eval ${TESTCMD} + eval "${TESTCMD}" stop_lttng_tracing_ok $SESSION_NAME destroy_lttng_session_ok $SESSION_NAME @@ -153,9 +207,9 @@ function test_clock_override_timestamp() # Use Babeltrace with "-n all" to give a comma separated list for # easy extraction of timestamps. - unique_timestamps_count=$($BABELTRACE_BIN -n all $TRACE_PATH | \ + unique_timestamps_count=$($BABELTRACE_BIN -n all "$TRACE_PATH" | \ cut -d, -f1 | uniq | wc -l) - test $unique_timestamps_count -eq 1 + test "$unique_timestamps_count" -eq 1 ok $? "Unique event timestamps with clock override: $unique_timestamps_count expect 1" } diff --git a/tests/regression/tools/metadata/test_kernel b/tests/regression/tools/metadata/test_kernel index 08743008b..246b02460 100755 --- a/tests/regression/tools/metadata/test_kernel +++ b/tests/regression/tools/metadata/test_kernel @@ -26,8 +26,9 @@ function test_kernel () local expected_path="${TRACE_PATH}/lttng-traces" local session_name="kernel" - local metadata=$(mktemp --tmpdir "tmp.${FUNCNAME[0]}_metadata.XXXXXX") - local metadata_env=$(mktemp --tmpdir "tmp.${FUNCNAME[0]}_metadata_env.XXXXXX") + local metadata_env + + metadata_env=$(mktemp --tmpdir "tmp.${FUNCNAME[0]}_metadata_env.XXXXXX") diag "Test Kernel metadata env field" create_lttng_session_ok "$session_name" @@ -45,10 +46,7 @@ function test_kernel () metadata_path=$(find "${expected_path}/${session_name}"* -name "metadata") metadata_path=$(dirname "$metadata_path") - $BABELTRACE_BIN --output-format=ctf-metadata "${metadata_path}" > "$metadata" - - # Extract "env" scope - awk '/env {/,/};/' < "$metadata" > "$metadata_env" + extract_env_to_file "$metadata_path" "$metadata_env" # Construct the expected path from the env metadata and use it to # validate that all information make sense. This information is present @@ -83,7 +81,6 @@ function test_kernel () ok $? "Extracting hostname from env metadata" is "$value" "$(hostname)" "Hostname is valid" - rm -f "$metadata" rm -f "$metadata_env" } diff --git a/tests/regression/tools/metadata/test_ust b/tests/regression/tools/metadata/test_ust index 6b17b02cf..5c9998515 100755 --- a/tests/regression/tools/metadata/test_ust +++ b/tests/regression/tools/metadata/test_ust @@ -32,13 +32,13 @@ fi function test_per_uid () { local metadata_path + local metadata_env local value local value2 local expected_path="${TRACE_PATH}/lttng-traces" local session_name="per-uid" - local metadata=$(mktemp --tmpdir tmp.test_${FUNCNAME[0]}_metadata.XXXXXX) - local metadata_env=$(mktemp --tmpdir tmp.test_${FUNCNAME[0]}_metadata_env.XXXXXX) + metadata_env=$(mktemp --tmpdir tmp.test_${FUNCNAME[0]}_metadata_env.XXXXXX) diag "Test UST metadata env field in per-uid mode" create_lttng_session_ok "$session_name" @@ -56,10 +56,7 @@ function test_per_uid () metadata_path=$(find "${expected_path}/${session_name}"* -name "metadata") metadata_path=$(dirname "$metadata_path") - $BABELTRACE_BIN --output-format=ctf-metadata "${metadata_path}" > "$metadata" - - # Extract "env" scope - awk '/env {/,/};/' < "$metadata" > "$metadata_env" + extract_env_to_file "$metadata_path" "$metadata_env" # Construct the expected path from the env metadata and use it to # validate that all information make sense. This information is present @@ -112,7 +109,6 @@ function test_per_uid () ok $? "Extracting hostname from env metadata" is "$value" "$(hostname)" "Hostname is valid" - rm -f "$metadata" rm -f "$metadata_env" } @@ -125,8 +121,9 @@ function test_per_pid () local expected_path="${TRACE_PATH}/lttng-traces" local session_name="per-pid" - local metadata=$(mktemp --tmpdir tmp.test_${FUNCNAME[0]}_metadata.XXXXXX) - local metadata_env=$(mktemp --tmpdir tmp.test_${FUNCNAME[0]}_metadata_env.XXXXXX) + local metadata_env + + metadata_env=$(mktemp --tmpdir "tmp.test_${FUNCNAME[0]}_metadata_env.XXXXXX") diag "Test UST metadata env field in per-pid mode" create_lttng_session_ok "$session_name" @@ -147,10 +144,7 @@ function test_per_pid () metadata_path=$(find "${expected_path}/${session_name}"* -name "metadata") metadata_path=$(dirname "$metadata_path") - $BABELTRACE_BIN --output-format=ctf-metadata "${metadata_path}" 1> "$metadata" - - # Extract "env" scope - awk '/env {/,/};/' < "$metadata" > "$metadata_env" + extract_env_to_file "$metadata_path" "$metadata_env" # Construct the expected path from the env metadata and use it to # validate that all information make sense. This information is present @@ -214,7 +208,6 @@ function test_per_pid () ok $? "Extracting hostname from env metadata" is "$value" "$(hostname)" "Hostname is valid" - rm -f "$metadata" rm -f "$metadata_env" } diff --git a/tests/regression/tools/metadata/utils.sh b/tests/regression/tools/metadata/utils.sh index 99a6cc6d8..d457946ae 100644 --- a/tests/regression/tools/metadata/utils.sh +++ b/tests/regression/tools/metadata/utils.sh @@ -4,7 +4,7 @@ # # SPDX-License-Identifier: LGPL-2.1-only -function get_env_value () +function get_env_value_ctf1 () { local env_file=$1 local key=$2 @@ -34,6 +34,76 @@ function get_env_value () fi } +# Expects a json representing the environment of a trace_class fragment. +function get_env_value_ctf2 () +{ + local env_file=$1 + local key=$2 + local result + local ret + + if [[ "$key" == "vpid =" ]]; then + # The "vpid =" key value is only because the ctf1 extractor uses + # grep. jq use the complete key. + key="vpid" + fi + + + result=$(jq -r ".${key}" < "$env_file") + ret=$? + if [ $ret -eq 1 ]; then + echo "invalid_value_extraction" + return 1 + else + echo "$result" + return 0 + fi +} + +function get_env_value () +{ + if [ "$TRACE_FORMAT_OUTPUT" == "ctf1" ]; then + get_env_value_ctf1 "$@" + elif [ "$TRACE_FORMAT_OUTPUT" == "ctf2" ]; then + get_env_value_ctf2 "$@" + else + return 1 + fi +} + +function extract_env_to_file_ctf1 () +{ + local source_dir=$1 + local destination=$2 + local env + + env=$($BABELTRACE_BIN --output-format=ctf-metadata "${source_dir}") + + # Extract "env" scope + awk '/env {/,/};/' <<< "$env" > "$destination" +} + +function extract_env_to_file_ctf2 () +{ + local source_file="$1/metadata" + local destination=$2 + local query="select(.type == \"trace-class\").environment" + jq "$query" "$source_file" > "$destination" +} + +function extract_env_to_file () +{ + if [ "$TRACE_FORMAT_OUTPUT" == "ctf1" ]; then + extract_env_to_file_ctf1 "$@" + return $? + elif [ "$TRACE_FORMAT_OUTPUT" == "ctf2" ]; then + extract_env_to_file_ctf2 "$@" + return $? + else + return 1 + fi +} + function iso8601_to_lttng_dir_datetime () { local result=$1