From 382257755fa9ce1052457039989ec51a14151538 Mon Sep 17 00:00:00 2001 From: Jonathan Rajotte Date: Thu, 5 Sep 2019 19:24:04 -0400 Subject: [PATCH] Tests: metadata env scope values MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The tests extract information from the metadata env scope of the trace and reconstruct an lttng directory hierarchy to validate that the information found in the metadata is correct. Testing this way simulate a viewer that must reconstruct a lttng directory hierarchy from metadata information only. This information is mostly there for this purpose. While there we validate the value of other env field when possible. Signed-off-by: Jonathan Rajotte Signed-off-by: Jérémie Galarneau --- configure.ac | 1 + tests/regression/Makefile.am | 6 +- tests/regression/tools/Makefile.am | 2 +- tests/regression/tools/metadata/Makefile.am | 16 ++ tests/regression/tools/metadata/test_kernel | 138 +++++++++++ tests/regression/tools/metadata/test_ust | 258 ++++++++++++++++++++ tests/regression/tools/metadata/utils.sh | 59 +++++ tests/utils/utils.sh | 9 +- 8 files changed, 485 insertions(+), 4 deletions(-) create mode 100644 tests/regression/tools/metadata/Makefile.am create mode 100755 tests/regression/tools/metadata/test_kernel create mode 100755 tests/regression/tools/metadata/test_ust create mode 100644 tests/regression/tools/metadata/utils.sh diff --git a/configure.ac b/configure.ac index e6bdcd529..3f30154c0 100644 --- a/configure.ac +++ b/configure.ac @@ -1133,6 +1133,7 @@ AC_CONFIG_FILES([ tests/regression/tools/notification/Makefile tests/regression/tools/rotation/Makefile tests/regression/tools/base-path/Makefile + tests/regression/tools/metadata/Makefile tests/regression/ust/Makefile tests/regression/ust/nprocesses/Makefile tests/regression/ust/high-throughput/Makefile diff --git a/tests/regression/Makefile.am b/tests/regression/Makefile.am index 775240405..73eb9f7da 100644 --- a/tests/regression/Makefile.am +++ b/tests/regression/Makefile.am @@ -31,7 +31,8 @@ TESTS = tools/filtering/test_invalid_filter \ tools/rotation/test_ust \ tools/rotation/test_kernel \ tools/rotation/test_save_load_mi \ - tools/rotation/test_schedule_api + tools/rotation/test_schedule_api \ + tools/metadata/test_kernel if HAVE_LIBLTTNG_UST_CTL SUBDIRS += ust @@ -50,7 +51,8 @@ TESTS += ust/before-after/test_before_after \ ust/test_event_perf \ ust/blocking/test_blocking \ ust/multi-lib/test_multi_lib \ - ust/rotation-destroy-flush/test_rotation_destroy_flush + ust/rotation-destroy-flush/test_rotation_destroy_flush \ + tools/metadata/test_ust endif # HAVE_LIBLTTNG_UST_CTL if PYTHON_BINDING diff --git a/tests/regression/tools/Makefile.am b/tests/regression/tools/Makefile.am index 856eecc08..c50467599 100644 --- a/tests/regression/tools/Makefile.am +++ b/tests/regression/tools/Makefile.am @@ -1,3 +1,3 @@ SUBDIRS = streaming filtering health tracefile-limits snapshots live exclusion save-load mi \ wildcard crash regen-metadata regen-statedump notification rotation \ - base-path + base-path metadata diff --git a/tests/regression/tools/metadata/Makefile.am b/tests/regression/tools/metadata/Makefile.am new file mode 100644 index 000000000..0f839a167 --- /dev/null +++ b/tests/regression/tools/metadata/Makefile.am @@ -0,0 +1,16 @@ +noinst_SCRIPTS = test_ust test_kernel utils.sh +EXTRA_DIST = test_ust test_kernel utils.sh + +all-local: + @if [ x"$(srcdir)" != x"$(builddir)" ]; then \ + for script in $(EXTRA_DIST); do \ + cp -f $(srcdir)/$$script $(builddir); \ + done; \ + fi + +clean-local: + @if [ x"$(srcdir)" != x"$(builddir)" ]; then \ + for script in $(EXTRA_DIST); do \ + rm -f $(builddir)/$$script; \ + done; \ + fi diff --git a/tests/regression/tools/metadata/test_kernel b/tests/regression/tools/metadata/test_kernel new file mode 100755 index 000000000..c0a039289 --- /dev/null +++ b/tests/regression/tools/metadata/test_kernel @@ -0,0 +1,138 @@ +#!/bin/bash +# +# Copyright (C) - 2019 Jonathan Rajotte-Julien +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +TEST_DESC="Metadata env - Kernel space tracing" + +CURDIR=$(dirname "$0")/ +TESTDIR=$CURDIR/../../.. +EVENT_NAME="lttng_test_filter_event" + +TRACE_PATH=$(mktemp -d) + +NUM_TESTS=13 + +source "$TESTDIR/utils/utils.sh" + +# Fetch utils functions common to ust and kernel tests. +source "$CURDIR/utils.sh" + +function test_kernel () +{ + local metadata + local metadata_env + local metadata_path + local value + + local expected_path="${TRACE_PATH}/lttng-traces" + local session_name="kernel" + + metadata=$(mktemp) + metadata_env=$(mktemp) + + diag "Test Kernel metadata env field" + create_lttng_session_ok "$session_name" + enable_kernel_lttng_event_ok "$session_name" "$EVENT_NAME" + start_lttng_tracing_ok "$session_name" + + echo -n "10" > /proc/lttng-test-filter-event + + stop_lttng_tracing_ok "$session_name" + destroy_lttng_session_ok "$session_name" + + # bt1 accepts only a directory while bt2 accepts either the metadata + # file directly or a directory with an immediate metadata file. + # Settle for the common denominator. + metadata_path=$(find "${expected_path}/${session_name}"* | grep metadata) + metadata_path=$(dirname "$metadata_path") + + $BABELTRACE_BIN --output-format=ctf-metadata "${metadata_path}" > "$metadata" + + # Extract "env" scope + awk '/env {/,/};/' < "$metadata" > "$metadata_env" + + # Construct the expected path from the env metadata and use it to + # validate that all information make sense. This information is present + # to allow trace viewer to recreate the same directory hierarchy. + + # Trace name + value=$(get_env_value "$metadata_env" trace_name) + ok $? "Extracting trace_name from env metadata" + expected_path="${expected_path}/${value}" + + # Session creation time + value=$(get_env_value "$metadata_env" trace_creation_datetime) + ok $? "Extracting trace_creation_datetime from env metadata" + value=$(iso8601_to_lttng_dir_datetime "$value") + expected_path="${expected_path}-${value}" + + # Domain + value=$(get_env_value "$metadata_env" domain) + ok $? "Extracting domain from env metadata" + expected_path="${expected_path}/${value}" + + # Append "metadata" and test that we find the file. + expected_path="${expected_path}/metadata" + + test -e "$expected_path" + ok $? "Reconstructed path from metadata is valid" + + # Hostname + # The hostname is not part of the lttng hierarchy still we can test for + # its validity here. + value=$(get_env_value "$metadata_env" hostname) + ok $? "Extracting hostname from env metadata" + is "$value" "$(hostname)" "Hostname is valid" + + rm -f "$metadata" + rm -f "$metadata_env" +} + +plan_tests $NUM_TESTS +print_test_banner "$TEST_DESC" + + +if [ "$(id -u)" == "0" ]; then + isroot=1 +else + isroot=0 +fi + +skip $isroot "Root access is needed. Skipping all kernel metadata tests." $NUM_TESTS || +{ + validate_lttng_modules_present + modprobe lttng-test + + # Use LTTNG_HOME since we want the complete "default" lttng directory hierarchy + # with "-/...". + LTTNG_HOME="$TRACE_PATH" + + export LTTNG_HOME + start_lttng_sessiond + + tests=( test_kernel ) + + for fct_test in "${tests[@]}"; + do + ${fct_test} + done + + rmmod lttng-test + + stop_lttng_sessiond + unset LTTNG_HOME +} + +rm -rf "$TRACE_PATH" diff --git a/tests/regression/tools/metadata/test_ust b/tests/regression/tools/metadata/test_ust new file mode 100755 index 000000000..529b0a211 --- /dev/null +++ b/tests/regression/tools/metadata/test_ust @@ -0,0 +1,258 @@ +#!/bin/bash +# +# Copyright (C) - 2019 Jonathan Rajotte-Julien +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +TEST_DESC="Metadata env - User space tracing" + +CURDIR=$(dirname "$0")/ +TESTDIR=$CURDIR/../../.. +TESTAPP_PATH="$TESTDIR/utils/testapp" +TESTAPP_NAME="gen-ust-events" +TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME" +EVENT_NAME="tp:tptest" + +TRACE_PATH=$(mktemp -d) + +NUM_TESTS=37 + +NR_ITER=10 +NR_USEC_WAIT=0 + +source "$TESTDIR/utils/utils.sh" + +# Fetch utils functions common to ust and kernel tests. +source "$CURDIR/utils.sh" + +if [ ! -x "$TESTAPP_BIN" ]; then + BAIL_OUT "No UST events binary detected." +fi + +function test_per_uid () +{ + local metadata + local metadata_env + local metadata_path + local value + local value2 + + local expected_path="${TRACE_PATH}/lttng-traces" + local session_name="per-uid" + + metadata=$(mktemp) + metadata_env=$(mktemp) + + diag "Test UST metadata env field in per-uid mode" + create_lttng_session_ok "$session_name" + enable_ust_lttng_event_ok "$session_name" $EVENT_NAME + start_lttng_tracing_ok "$session_name" + + $TESTAPP_BIN $NR_ITER + + stop_lttng_tracing_ok "$session_name" + destroy_lttng_session_ok "$session_name" + + # bt1 accepts only a directory while bt2 accepts either the metadata + # file directly or a directory with an immediate metadata file. + # Settle for the common denominator. + metadata_path=$(find "${expected_path}/${session_name}"* | grep metadata) + metadata_path=$(dirname "$metadata_path") + + $BABELTRACE_BIN --output-format=ctf-metadata "${metadata_path}" > "$metadata" + + # Extract "env" scope + awk '/env {/,/};/' < "$metadata" > "$metadata_env" + + # Construct the expected path from the env metadata and use it to + # validate that all information make sense. This information is present + # to allow trace viewer to recreate the same directory hierarchy. + + # Trace name + value=$(get_env_value "$metadata_env" trace_name) + ok $? "Extracting trace_name from env metadata" + expected_path="${expected_path}/${value}" + + # Session creation time + value=$(get_env_value "$metadata_env" trace_creation_datetime) + ok $? "Extracting trace_creation_datetime from env metadata" + value=$(iso8601_to_lttng_dir_datetime "$value") + expected_path="${expected_path}-${value}" + + # Domain + value=$(get_env_value "$metadata_env" domain) + ok $? "Extracting domain from env metadata" + expected_path="${expected_path}/${value}" + + # Buffering scheme + value=$(get_env_value "$metadata_env" tracer_buffering_scheme) + ok $? "Extracting tracer_buffering_scheme from env metadata" + expected_path="${expected_path}/${value}" + + # tracer_buffering_id + value=$(get_env_value "$metadata_env" tracer_buffering_id) + ok $? "Extracting tracer_buffering_id from env metadata" + expected_path="${expected_path}/${value}" + + # Check that the uid is the one we expect from the current user + is "$value" "$(id -u)" "tracer_buffering_id match current user uid" + + # Architecture_bit_width + value=$(get_env_value "$metadata_env" architecture_bit_width) + ok $? "Extracting architecture_bit_width from env metadata" + expected_path="${expected_path}/${value}-bit" + + # Append "metadata" and test that we find the file. + expected_path="${expected_path}/metadata" + + test -e "$expected_path" + ok $? "Reconstructed path from metadata is valid" + + # Hostname + # The hostname is not part of the lttng hierarchy still we can test for + # its validity here. + value=$(get_env_value "$metadata_env" hostname) + ok $? "Extracting hostname from env metadata" + is "$value" "$(hostname)" "Hostname is valid" + + rm -f "$metadata" + rm -f "$metadata_env" +} + +function test_per_pid () +{ + local metadata + local metadata_env + local metadata_path + local testapp_pid + local value + local value2 + + local expected_path="${TRACE_PATH}/lttng-traces" + local session_name="per-pid" + + metadata=$(mktemp) + metadata_env=$(mktemp) + + diag "Test UST metadata env field in per-pid mode" + create_lttng_session_ok "$session_name" + enable_ust_lttng_channel_ok "$session_name" channel "--buffers-pid" + enable_ust_lttng_event_ok "$session_name" $EVENT_NAME channel + start_lttng_tracing_ok "$session_name" + + $TESTAPP_BIN "$NR_ITER" "$NR_USEC_WAIT" & + testapp_pid=$! + wait $testapp_pid + + stop_lttng_tracing_ok "$session_name" + destroy_lttng_session_ok "$session_name" + + # bt1 accepts only a directory while bt2 accepts either the metadata + # file directly or a directory with an immediate metadata file. + # Settle for the common denominator. + metadata_path=$(find "${expected_path}/${session_name}"* | grep metadata) + metadata_path=$(dirname "$metadata_path") + + $BABELTRACE_BIN --output-format=ctf-metadata "${metadata_path}" 1> "$metadata" + + # Extract "env" scope + awk '/env {/,/};/' < "$metadata" > "$metadata_env" + + # Construct the expected path from the env metadata and use it to + # validate that all information make sense. This information is present + # to allow trace viewer to recreate the same directory hierarchy. + + # Trace name + value=$(get_env_value "$metadata_env" trace_name) + ok $? "Extracting trace_name from env metadata" + expected_path="${expected_path}/${value}" + + # Session creation time + value=$(get_env_value "$metadata_env" trace_creation_datetime) + ok $? "Extracting trace_creation_datetime from env metadata" + value=$(iso8601_to_lttng_dir_datetime "$value") + expected_path="${expected_path}-${value}" + + # Domain + value=$(get_env_value "$metadata_env" domain) + ok $? "Extracting domain from env metadata" + expected_path="${expected_path}/${value}" + + # Buffering scheme + value=$(get_env_value "$metadata_env" tracer_buffering_scheme) + ok $? "Extracting tracer_buffering_scheme from env metadata" + expected_path="${expected_path}/${value}" + + # Procname + value=$(get_env_value "$metadata_env" procname) + ok $? "Extracting procname from env metadata" + expected_path="${expected_path}/${value}" + + # vpid and tracer_buffering_id should be the same here. + # "vpid =" is used since other key have vpid in them. + value=$(get_env_value "$metadata_env" "vpid =") + ok $? "Extracting vpid from env metadata" + + value2=$(get_env_value "$metadata_env" tracer_buffering_id) + ok $? "Extracting tracer_buffering_id from env metadata" + expected_path="${expected_path}-${value2}" + + is "$value" "$value2" "vpid and tracer_buffering_id are identical" + is "$testapp_pid" "$value" "vpid and known testapp pid are identical" + is "$testapp_pid" "$value2" "tracer_buffering_id and known testapp pid are identical" + + # vpid_datetime + value=$(get_env_value "$metadata_env" vpid_datetime) + ok $? "Extracting vpid_datetime from env metadata" + value=$(iso8601_to_lttng_dir_datetime "$value") + expected_path="${expected_path}-${value}" + + # Append "metadata" and test that we find the file. + expected_path="${expected_path}/metadata" + + test -e "$expected_path" + ok $? "Reconstructed path from metadata is valid" + + # Hostname + # The hostname is not part of the lttng hierarchy still we can test for + # its validity here. + value=$(get_env_value "$metadata_env" hostname) + ok $? "Extracting hostname from env metadata" + is "$value" "$(hostname)" "Hostname is valid" + + rm -f "$metadata" + rm -f "$metadata_env" +} + +plan_tests $NUM_TESTS + +print_test_banner "$TEST_DESC" + +# Use LTTNG_HOME since we want the complete "default" lttng directory hierarchy +# with "-/...". +LTTNG_HOME="$TRACE_PATH" + +export LTTNG_HOME +start_lttng_sessiond + +tests=( test_per_uid test_per_pid ) + +for fct_test in "${tests[@]}"; +do + ${fct_test} +done + +stop_lttng_sessiond +unset LTTNG_HOME + +rm -rf "$TRACE_PATH" diff --git a/tests/regression/tools/metadata/utils.sh b/tests/regression/tools/metadata/utils.sh new file mode 100644 index 000000000..89fa77270 --- /dev/null +++ b/tests/regression/tools/metadata/utils.sh @@ -0,0 +1,59 @@ +#!/bin/bash +# +# Copyright (C) - 2019 Jonathan Rajotte-Julien +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +function get_env_value () +{ + local env_file=$1 + local key=$2 + local result + local ret + + result=$(grep "$key" < "$env_file") + ret=$? + if [ $ret -eq 1 ]; then + echo "invalid_value_extraction" + return 1 + else + # Strip the key using bash substring removal. + # This remove all leading chars until the actual value. + result=${result#* = } + + # Remove the trailing ';' + result=${result:0:-1} + + # Remove enclosing '"' if present + if [ "${result:0:1}" == '"' ]; then + result=${result:1:-1} + fi + + echo "$result" + return 0 + fi +} + +function iso8601_to_lttng_dir_datetime () +{ + local result=$1 + + result=${result/T/-} + + # Remove trailing timezone information including the '-'. + result=${result:0:-5} + + echo "$result" + return 0 +} diff --git a/tests/utils/utils.sh b/tests/utils/utils.sh index d156f17da..c17eb221c 100644 --- a/tests/utils/utils.sh +++ b/tests/utils/utils.sh @@ -900,7 +900,14 @@ function create_lttng_session () local trace_path=$4 local opt=$5 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN create $sess_name -o $trace_path $opt > $OUTPUT_DEST + if [ -z "$trace_path" ]; then + # Use lttng-sessiond default output. + trace_path="" + else + 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 ret=$? if [ $expected_to_fail -eq "1" ]; then test "$ret" -ne "0" -- 2.34.1