#!/bin/bash
#
-# Copyright (C) - 2013 Christian Babeux <christian.babeux@efficios.com>
-# Copyright (C) - 2015-2018 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+# Copyright (C) 2013 Christian Babeux <christian.babeux@efficios.com>
+# Copyright (C) 2015-2018 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License, version 2 only, as
-# published by the Free Software Foundation.
-#
-# This program 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 General Public License for
-# more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, write to the Free Software Foundation, Inc., 51
-# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# SPDX-License-Identifier: GPL-2.0-only
-TEST_DESC="LTTng - Event traker test"
+TEST_DESC="LTTng - Event tracker test"
CURDIR=$(dirname "$0")/
TESTDIR="$CURDIR/../../.."
TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME"
TESTAPP_KERNEL_BIN="$TESTAPP_PATH/$TESTAPP_KERNEL_NAME/$TESTAPP_KERNEL_NAME"
SESSION_NAME="tracker"
-NR_ITER=100
+NR_ITER=1
NUM_GLOBAL_TESTS=2
-NUM_UST_TESTS=256
+NUM_UST_TESTS=283
NUM_KERNEL_TESTS=462
NUM_TESTS=$((NUM_UST_TESTS+NUM_KERNEL_TESTS+NUM_GLOBAL_TESTS))
CHILD_PID=-1
WAIT_PATH=
-AFTER_FIRST_PATH=
-BEFORE_LAST_PATH=
+TOUCH_BEFORE_LAST_PATH=
+SYNC_BEFORE_LAST_PATH=
source $TESTDIR/utils/utils.sh
+# Launch the testapp and execute it up until right before the last event. It is
+# useful to do it in two seperate steps in order to test tracking and
+# untracking on an active app.
function prepare_ust_app
{
- AFTER_FIRST_PATH=$(mktemp -u)
- BEFORE_LAST_PATH=$(mktemp -u)
+ TOUCH_BEFORE_LAST_PATH=$(mktemp -u -t tmp.${FUNCNAME[0]}_touch_before_last.XXXXXX)
+ SYNC_BEFORE_LAST_PATH=$(mktemp -u -t tmp.${FUNCNAME[0]}_sync_before_last.XXXXXX)
+
+ $TESTAPP_BIN -i $NR_ITER -w $NR_USEC_WAIT \
+ --sync-before-last-event-touch "$TOUCH_BEFORE_LAST_PATH" \
+ --sync-before-last-event "$SYNC_BEFORE_LAST_PATH" &
- $TESTAPP_BIN -i $NR_ITER -w $NR_USEC_WAIT -a "$AFTER_FIRST_PATH" -b "$BEFORE_LAST_PATH" &
CHILD_PID=$!
+
+ # Wait for the app to execute all the way to right before the last
+ # event.
+ while [ ! -f "${TOUCH_BEFORE_LAST_PATH}" ]; do
+ sleep 0.01
+ done
}
+# Generate the last event.
function trace_ust_app
{
- touch "$BEFORE_LAST_PATH"
- wait
+ # Ask the test app to generate the last event.
+ touch "$SYNC_BEFORE_LAST_PATH"
+ wait "$CHILD_PID"
ok $? "Traced application stopped."
- rm "$BEFORE_LAST_PATH"
- rm "$AFTER_FIRST_PATH"
+ rm "$SYNC_BEFORE_LAST_PATH"
+ rm "$TOUCH_BEFORE_LAST_PATH"
}
function prepare_kernel_app
{
- WAIT_PATH=$(mktemp -u)
+ WAIT_PATH=$(mktemp -u -t "tmp.${FUNCNAME[0]}_wait_path.XXXXXX")
"$TESTAPP_KERNEL_BIN" "$WAIT_PATH" $NR_ITER &
CHILD_PID=$!
function trace_kernel_app
{
touch "$WAIT_PATH"
- wait
+ wait "$CHILD_PID"
ok $? "Traced application stopped."
rm "$WAIT_PATH"
}
local tracker="$4"
local channel=''
- trace_path=$(mktemp -d)
+ diag "${FUNCNAME[0]} $*"
+
+ trace_path=$(mktemp -d -t tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
create_lttng_session_ok $SESSION_NAME "$trace_path"
trace_"$domain"_app
stop_lttng_tracing_ok
- destroy_lttng_session_ok $SESSION_NAME
+ destroy_lttng_session_ok $SESSION_NAME --no-wait
if [ "$expect_event" -eq 1 ]; then
trace_matches "$EVENT_NAME" $NR_ITER "$trace_path"
local wildcard="$3"
local channel=''
- trace_path=$(mktemp -d)
+ diag "${FUNCNAME[0]} $*"
+
+ trace_path=$(mktemp -d -t tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
create_lttng_session_ok $SESSION_NAME "$trace_path"
trace_"$domain"_app
stop_lttng_tracing_ok
- destroy_lttng_session_ok $SESSION_NAME
+ destroy_lttng_session_ok $SESSION_NAME --no-wait
if [ "$expect_event" -eq 1 ]; then
validate_trace "$EVENT_NAME" "$trace_path"
local wildcard="$3"
local channel=''
- trace_path=$(mktemp -d)
+ diag "${FUNCNAME[0]} $*"
+
+ trace_path=$(mktemp -d -t tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
create_lttng_session_ok $SESSION_NAME "$trace_path"
trace_"$domain"_app
stop_lttng_tracing_ok
- destroy_lttng_session_ok $SESSION_NAME
+ destroy_lttng_session_ok $SESSION_NAME --no-wait
if [ "$expect_event" -eq 1 ]; then
validate_trace "$EVENT_NAME" "$trace_path"
local wildcard="$2"
local tracker="$3"
- trace_path=$(mktemp -d)
+ diag "${FUNCNAME[0]} $*"
+
+ trace_path=$(mktemp -d -t tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
create_lttng_session_ok $SESSION_NAME "$trace_path"
enable_"$domain"_lttng_event_ok $SESSION_NAME "$wildcard"
lttng_track_"$domain"_fail "${tracker}"
- destroy_lttng_session_ok $SESSION_NAME
+ destroy_lttng_session_ok $SESSION_NAME --no-wait
rm -rf "$trace_path"
}
local tracker="$4"
local channel=''
- trace_path=$(mktemp -d)
+ diag "${FUNCNAME[0]} $*"
+
+ trace_path=$(mktemp -d -t tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
create_lttng_session_ok $SESSION_NAME "$trace_path"
trace_"$domain"_app
stop_lttng_tracing_ok
- destroy_lttng_session_ok $SESSION_NAME
+ destroy_lttng_session_ok $SESSION_NAME --no-wait
if [ "$expect_event" -eq 1 ]; then
trace_matches "$EVENT_NAME" $NR_ITER "$trace_path"
local wildcard="$3"
local channel=''
- trace_path=$(mktemp -d)
+ diag "${FUNCNAME[0]} $*"
+
+ trace_path=$(mktemp -d -t tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
create_lttng_session_ok $SESSION_NAME "$trace_path"
trace_"$domain"_app
stop_lttng_tracing_ok
- destroy_lttng_session_ok $SESSION_NAME
+ destroy_lttng_session_ok $SESSION_NAME --no-wait
if [ "$expect_event" -eq 1 ]; then
validate_trace "$EVENT_NAME" "$trace_path"
local wildcard="$3"
local channel=''
- trace_path=$(mktemp -d)
+ diag "${FUNCNAME[0]} $*"
+
+ trace_path=$(mktemp -d -t tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
create_lttng_session_ok $SESSION_NAME "$trace_path"
trace_"$domain"_app
stop_lttng_tracing_ok
- destroy_lttng_session_ok $SESSION_NAME
+ destroy_lttng_session_ok $SESSION_NAME --no-wait
if [ "$expect_event" -eq 1 ]; then
validate_trace "$EVENT_NAME" "$trace_path"
rm -rf "$trace_path"
}
+function test_event_ust_vpid_untrack_snapshot()
+{
+ diag "${FUNCNAME[0]} $*"
+
+ local trace_path=$(mktemp -d -t tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
+
+ create_lttng_session_ok $SESSION_NAME "$trace_path" "--snapshot"
+
+ enable_ust_lttng_event_ok $SESSION_NAME "$EVENT_NAME"
+
+ prepare_ust_app
+
+ lttng_untrack_ust_ok "--vpid --all"
+
+ start_lttng_tracing_ok
+
+ trace_ust_app
+ lttng_snapshot_record $SESSION_NAME
+
+ stop_lttng_tracing_ok
+ destroy_lttng_session_ok $SESSION_NAME --no-wait
+
+ snapshot_count=$(find "$trace_path" -name metadata | wc -l)
+ is "$snapshot_count" 0 "Number of snapshot is zero"
+
+ rm -rf "$trace_path"
+}
+
# MUST set TESTDIR before calling those functions
plan_tests $NUM_TESTS
print_test_banner "$TEST_DESC"
+bail_out_if_no_babeltrace
+
start_lttng_sessiond
diag "Test UST tracker"
EVENT_NAME="tp:tptest"
+# Both ordering of tracker type and `--all` are valid.
+test_event_track_untrack ust 0 "${EVENT_NAME}" "--vgid --all"
+test_event_track_untrack ust 0 "${EVENT_NAME}" "--all --vgid"
+
#vuid, vgid
# non-matching
test_event_tracker ust 1 "${EVENT_NAME}" "--vpid --all"
test_event_vpid_tracker ust 1 "${EVENT_NAME}"
+#snapshot untrack vpid
+
+test_event_ust_vpid_untrack_snapshot
+
#pid (backward compat)
#non-matching
test_event_tracker kernel 1 "${EVENT_NAME}" "--pid --all"
test_event_pid_tracker kernel 1 "${EVENT_NAME}"
- rmmod lttng-test
+ # When using session destroy with '--no-wait', the quick
+ # exit at the end means that the lttng-test modules is
+ # still marked as being in use and 'modprobe --remove' fails.
+ #
+ # It is possible to work around the issue by not setting
+ # '--no-wait' on the last kernel test, but it seems like
+ # an easy detail to forget about.
+ #
+ # The sleep here gives the system a small amount of time to
+ # finish wrapping up the session that had the lttng-test kernel
+ # module loaded.
+ sleep 1
+
+ modprobe --remove lttng-test
ok $? "Unloading lttng-test module"
}