SoW-2020-0003: Trace Hit Counters
[lttng-tools.git] / tests / regression / tools / map / test_map_ust
diff --git a/tests/regression/tools/map/test_map_ust b/tests/regression/tools/map/test_map_ust
new file mode 100755 (executable)
index 0000000..b6c21c2
--- /dev/null
@@ -0,0 +1,416 @@
+#!/bin/bash
+#
+# Copyright (C) 2020 Francis Deslauriers <francis.deslauriers@efficios.com>
+#
+# SPDX-License-Identifier: LGPL-2.1-only
+
+CURDIR=$(dirname "$0")/
+TESTDIR=$CURDIR/../../..
+NR_ITER=5
+NR_USEC_WAIT=1
+TESTAPP_PATH="$TESTDIR/utils/testapp"
+TESTAPP_NAME="gen-ust-events"
+TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME"
+
+GEN_UST_NEVENTS_BIN="$TESTAPP_PATH/gen-ust-nevents/gen-ust-nevents"
+
+UST_EVENT_NAME="tp:tptest"
+
+UST_NUM_TESTS=474
+NUM_TESTS=$(($UST_NUM_TESTS))
+
+TMPDIR=$(mktemp -d)
+
+SH_TAP=1
+
+# shellcheck source=../../../utils/utils.sh
+source "$TESTDIR/utils/utils.sh"
+source "$CURDIR/map_base_test.sh"
+
+FULL_LTTNG_BIN="${TESTDIR}/../src/bin/lttng/${LTTNG_BIN}"
+
+if [ ! -x "$TESTAPP_BIN" ]; then
+       BAIL_OUT "No UST events binary detected."
+fi
+
+plan_tests $NUM_TESTS
+
+
+function ust_test_app()
+{
+       $TESTAPP_BIN -i $NR_ITER -w $NR_USEC_WAIT
+}
+
+function test_map_ust_per_uid_create()
+{
+       local MAP_NAME="my_map_name"
+       local MAP_NAME_2="my_map_name2"
+       local MAP_NAME_3="my_map_name3"
+       local SESSION_NAME="my_session_name"
+
+       diag "Map creation"
+
+       create_lttng_session_ok "$SESSION_NAME"
+
+       "$FULL_LTTNG_BIN" add-map --userspace --bitness 32 --session "wrong_session_name" "$MAP_NAME" > /dev/null
+       isnt $? 0 "Map creation failed on wrong session name"
+
+       "$FULL_LTTNG_BIN" add-map --userspace --bitness 42 --session "$SESSION_NAME" "$MAP_NAME" > /dev/null
+       isnt $? 0 "Map creation failed \"--bitness\" wrong value as expected"
+
+       "$FULL_LTTNG_BIN" add-map --userspace --session "SESS_DOESNT_EXIST" "$MAP_NAME" > /dev/null
+       isnt $? 0 "Failed to add map to session that doesn't exist"
+
+       "$FULL_LTTNG_BIN" disable-map --userspace --session "$SESSION_NAME" "MAP_DOESNT_EXIST" > /dev/null
+       isnt $? 0 "Failed to disable map that doesn't exist"
+
+       "$FULL_LTTNG_BIN" add-map --userspace --bitness 64 --session "$SESSION_NAME" "$MAP_NAME" > /dev/null
+       ok $? "Map with 64bit bitness created succesfully"
+
+       "$FULL_LTTNG_BIN" disable-map --userspace "$MAP_NAME" > /dev/null
+       ok $? "Map disabled succesfully"
+
+       destroy_lttng_session_ok "$SESSION_NAME"
+}
+
+function test_map_ust_per_pid_create()
+{
+       local MAP_NAME="my_map_name"
+       local SESSION_NAME="my_session_name"
+
+       diag "Map per-pid creation"
+
+       create_lttng_session_ok "$SESSION_NAME"
+
+       lttng_add_map_ok "$MAP_NAME" "$SESSION_NAME" --userspace 64 --per-pid
+
+       "$FULL_LTTNG_BIN" disable-map --userspace "$MAP_NAME" > /dev/null
+       ok $? "Map disabled succesfully"
+
+       "$FULL_LTTNG_BIN" enable-map --userspace "$MAP_NAME" > /dev/null
+       ok $? "Map enabled succesfully"
+
+       destroy_lttng_session_ok "$SESSION_NAME"
+}
+
+function test_map_base_scenario()
+{
+       local domain="$1"
+       local bitness="$2"
+       local buf_option="$3"
+       local event_name="$4"
+
+       local MAP_NAME="my_map_name"
+       local SESSION_NAME="my_session_name"
+       local TRIGGER_NAME="my_trigger_name"
+       local KEY="foo"
+
+       diag "Map base tracing scenario: $domain bitness $bitness $buf_option"
+
+       create_lttng_session_ok "$SESSION_NAME"
+
+       lttng_add_map_ok "$MAP_NAME" "$SESSION_NAME" "$domain" "$bitness" "$buf_option"
+
+       lttng_add_trigger_ok "$TRIGGER_NAME" \
+               --condition \
+                       on-event "$domain" "$event_name" \
+               --action \
+                       incr-value --session "$SESSION_NAME" --map "$MAP_NAME" --key "$KEY"
+
+       start_lttng_tracing_ok $SESSION_NAME
+
+       ust_test_app
+
+       stop_lttng_tracing_ok $SESSION_NAME
+
+       view_map_ok "$MAP_NAME" "$KEY" "$NR_ITER"
+
+       lttng_remove_trigger_ok "$TRIGGER_NAME"
+
+       destroy_lttng_session_ok $SESSION_NAME
+}
+
+function test_map_ust_two_apps()
+{
+       local MAP_NAME="my_map_name"
+       local SESSION_NAME="my_session_name"
+       local TRIGGER_NAME="my_trigger_name"
+       local KEY="foo"
+       local domain="--userspace"
+       local bitness="64"
+       local buf_option="--per-uid"
+
+       diag "Map with two apps"
+
+       create_lttng_session_ok "$SESSION_NAME"
+
+       lttng_add_map_ok "$MAP_NAME" "$SESSION_NAME" "$domain" "$bitness" "$buf_option"
+
+       lttng_add_trigger_ok "$TRIGGER_NAME" \
+               --condition \
+                       on-event --userspace "$UST_EVENT_NAME" \
+               --action \
+                       incr-value --session "$SESSION_NAME" --map "$MAP_NAME" --key "$KEY"
+
+       start_lttng_tracing_ok $SESSION_NAME
+
+       ust_test_app
+       ust_test_app
+
+       stop_lttng_tracing_ok $SESSION_NAME
+
+       view_map_ok "$MAP_NAME" "$KEY" "$((NR_ITER * 2))"
+
+       lttng_remove_trigger_ok "$TRIGGER_NAME"
+
+       destroy_lttng_session_ok $SESSION_NAME
+}
+
+function test_map_ust_with_events()
+{
+       local MAP_NAME="my_map_name"
+       local SESSION_NAME="my_session_name"
+       local TRIGGER_NAME="my_trigger_name"
+       local KEY="foo"
+       local domain="--userspace"
+       local bitness="64"
+       local buf_option="--per-uid"
+
+       diag "Map with regular events"
+
+       create_lttng_session_ok "$SESSION_NAME"
+
+       lttng_add_map_ok "$MAP_NAME" "$SESSION_NAME" "$domain" "$bitness" "$buf_option"
+
+       enable_ust_lttng_event_ok "$SESSION_NAME" "*"
+
+       lttng_add_trigger_ok "$TRIGGER_NAME" \
+               --condition \
+                       on-event --userspace "$UST_EVENT_NAME" \
+               --action \
+                       incr-value --session "$SESSION_NAME" --map "$MAP_NAME" --key "$KEY"
+
+       start_lttng_tracing_ok $SESSION_NAME
+
+       ust_test_app
+
+       stop_lttng_tracing_ok $SESSION_NAME
+
+       view_map_ok "$MAP_NAME" "$KEY" "$NR_ITER"
+
+       lttng_remove_trigger_ok "$TRIGGER_NAME"
+
+       destroy_lttng_session_ok $SESSION_NAME
+}
+
+function test_map_ust_per_pid_dead_app_aggregation()
+{
+       local MAP_NAME="my_map_name"
+       local SESSION_NAME="my_session_name"
+       local TRIGGER_NAME1="my_trigger_name1"
+       local TRIGGER_NAME2="my_trigger_name2"
+       local KEY1="foo"
+       local KEY2="ashton"
+       local domain="--userspace"
+       local bitness="64"
+       local buf_option="--per-pid"
+
+       local file_sync_before_exit=$(mktemp -u)
+       local file_sync_before_exit_touch=$(mktemp -u)
+
+       # In per-pid, test that running apps and dead apps aggrgated values are
+       # listed in their own map.
+
+       diag "Map per-pid user with dead app aggregation"
+
+       create_lttng_session_ok "$SESSION_NAME"
+
+       lttng_add_map_ok "$MAP_NAME" "$SESSION_NAME" "$domain" "$bitness" "$buf_option"
+
+       lttng_add_trigger_ok "$TRIGGER_NAME1" \
+               --condition \
+                       on-event --userspace "tp:tptest1" \
+               --action \
+                       incr-value --session "$SESSION_NAME" --map "$MAP_NAME" --key "$KEY1"
+
+       lttng_add_trigger_ok "$TRIGGER_NAME2" \
+               --condition \
+                       on-event --userspace "$UST_EVENT_NAME" \
+               --action \
+                       incr-value --session "$SESSION_NAME" --map "$MAP_NAME" --key "$KEY2"
+
+       start_lttng_tracing_ok $SESSION_NAME
+
+       # Two apps will have run completely when we call view-map.
+       $GEN_UST_NEVENTS_BIN -i $NR_ITER -w $NR_USEC_WAIT
+       $GEN_UST_NEVENTS_BIN -i $NR_ITER -w $NR_USEC_WAIT
+
+       # One app will be done generating events but is still running when we
+       # call view-map.
+
+       $TESTAPP_BIN -i $NR_ITER -w $NR_USEC_WAIT \
+                       --sync-before-exit-touch $file_sync_before_exit_touch \
+                       --sync-before-exit $file_sync_before_exit &
+
+       # Wait for the before exit sync point. This ensure that we went over the
+       # last tracepoint.
+       while [ ! -f "${file_sync_before_exit_touch}" ]; do
+               sleep 0.1
+       done
+
+       stop_lttng_tracing_ok $SESSION_NAME
+
+       # After the apps are dead, we should see map key value pairs in the
+       # dead map aggregation listing. Two apps ran and exited, so we should
+       # have NR_ITER * 2 hits.
+       view_map_ok "$MAP_NAME" "$KEY1" "$(( $NR_ITER * 2 ))"
+
+       # One app is still running and is done generating events, we should see
+       # NR_ITER hits.
+       view_map_ok "$MAP_NAME" "$KEY2" "$NR_ITER"
+
+       lttng_remove_trigger_ok "$TRIGGER_NAME1"
+       lttng_remove_trigger_ok "$TRIGGER_NAME2"
+
+       touch "$file_sync_before_exit"
+       wait
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -f ${file_sync_before_exit}
+       rm -f ${file_sync_before_exit_touch}
+}
+
+function test_map_ust_exclusion()
+{
+       local MAP_NAME="my_map_name"
+       local SESSION_NAME="my_session_name"
+       local TRIGGER_NAME="my_trigger_name"
+       local KEY="foo"
+       local domain="--userspace"
+       local bitness="64"
+       local buf_option="--per-uid"
+       local exclusion="tp:tptest1,tp:tptest2,tp:tptest3,tp:tptest4"
+
+       diag "Map per-pid user with dead app aggregation"
+
+       create_lttng_session_ok "$SESSION_NAME"
+
+       lttng_add_map_ok "$MAP_NAME" "$SESSION_NAME" "$domain" "$bitness" "$buf_option"
+       lttng_add_trigger_ok "$TRIGGER_NAME" \
+               --condition \
+                       on-event --userspace "tp:tptest*" --exclude="$exclusion" \
+               --action \
+                       incr-value --session "$SESSION_NAME" --map "$MAP_NAME" --key "$KEY"
+
+       start_lttng_tracing_ok $SESSION_NAME
+
+       "$GEN_UST_NEVENTS_BIN" -i "$NR_ITER" -w 1
+
+       stop_lttng_tracing_ok $SESSION_NAME
+
+       # After the map is dead, we should still see map key value pairs in the
+       # dead map aggregation listing.
+       view_map_ok "$MAP_NAME" "$KEY" "5"
+
+       lttng_remove_trigger_ok "$TRIGGER_NAME"
+
+       destroy_lttng_session_ok $SESSION_NAME
+}
+
+
+function test_map_ust_clear_per_pid()
+{
+       local MAP_NAME="my_map_name"
+       local SESSION_NAME="my_session_name"
+       local TRIGGER_NAME="my_trigger_name"
+       local KEY="foo"
+       local domain="--userspace"
+       local bitness="64"
+       local buf_option="--per-pid"
+
+       diag "Map UST per-pid clear"
+
+       create_lttng_session_ok "$SESSION_NAME"
+
+       lttng_add_map_ok "$MAP_NAME" "$SESSION_NAME" "$domain" "$bitness" "$buf_option"
+       lttng_add_trigger_ok "$TRIGGER_NAME" \
+               --condition \
+                       on-event --userspace "tp:tptest1" \
+               --action \
+                       incr-value --session "$SESSION_NAME" --map "$MAP_NAME" --key "$KEY"
+
+       start_lttng_tracing_ok $SESSION_NAME
+
+       "$GEN_UST_NEVENTS_BIN" -i "$NR_ITER" -w 1
+
+       stop_lttng_tracing_ok $SESSION_NAME
+
+       # After the map is dead, we should still see map key value pairs in the
+       # dead map aggregation listing.
+       view_map_ok "$MAP_NAME" "$KEY" "5"
+
+       lttng_clear_session_ok $SESSION_NAME
+
+       view_map_ok "$MAP_NAME" "$KEY" "0"
+
+       lttng_remove_trigger_ok "$TRIGGER_NAME"
+
+       destroy_lttng_session_ok $SESSION_NAME
+}
+
+start_lttng_sessiond_notap
+
+test_map_ust_per_pid_dead_app_aggregation
+test_map_n_triggers_n_keys "--userspace" "64" "$UST_EVENT_NAME" ust_test_app
+test_map_n_triggers_n_keys "--userspace" "32" "$UST_EVENT_NAME" ust_test_app
+
+test_map_n_triggers_1_key "--userspace" "64" "$UST_EVENT_NAME" ust_test_app
+test_map_n_triggers_1_key "--userspace" "32" "$UST_EVENT_NAME" ust_test_app
+
+test_map_n_triggers_1_key_coalesced "--userspace" "32" "$UST_EVENT_NAME" ust_test_app
+test_map_n_triggers_1_key_coalesced "--userspace" "64" "$UST_EVENT_NAME" ust_test_app
+
+test_map_ust_per_uid_create
+test_map_ust_per_pid_create
+
+test_map_view_empty "--userspace" "64" "--per-uid"
+test_map_view_empty "--userspace" "64" "--per-pid"
+test_map_view_empty "--userspace" "32" "--per-uid"
+test_map_view_empty "--userspace" "32" "--per-pid"
+
+test_map_base_scenario "--userspace" "64" "--per-uid" "$UST_EVENT_NAME"
+test_map_base_scenario "--userspace" "32" "--per-uid" "$UST_EVENT_NAME"
+test_map_base_scenario "--userspace" "64" "--per-pid" "$UST_EVENT_NAME"
+test_map_base_scenario "--userspace" "32" "--per-pid" "$UST_EVENT_NAME"
+
+test_map_formated_keys "--userspace" "$UST_EVENT_NAME" "\${PROVIDER_NAME}:\${EVENT_NAME}" "$UST_EVENT_NAME" ust_test_app
+test_map_formated_keys "--userspace" "$UST_EVENT_NAME" "pitarifique-\${EVENT_NAME}" "pitarifique-tptest" ust_test_app
+
+test_map_disable_enable "--userspace" "32" "$UST_EVENT_NAME" ust_test_app
+test_map_disable_enable "--userspace" "64" "$UST_EVENT_NAME" ust_test_app
+
+test_map_add_remove_add_trigger "--userspace" "32" "$UST_EVENT_NAME" ust_test_app
+test_map_add_remove_add_trigger "--userspace" "64" "$UST_EVENT_NAME" ust_test_app
+
+test_map_creation_after_trigger "--userspace" "32" "$UST_EVENT_NAME" ust_test_app
+test_map_creation_after_trigger "--userspace" "64" "$UST_EVENT_NAME" ust_test_app
+
+test_map_remove_trigger_before_stop "--userspace" "32" "$UST_EVENT_NAME" ust_test_app
+test_map_remove_trigger_before_stop "--userspace" "64" "$UST_EVENT_NAME" ust_test_app
+
+test_map_ust_two_apps
+test_map_ust_with_events
+test_map_two_incr_value_two_keys "--userspace" "64" "$UST_EVENT_NAME" ust_test_app
+
+test_map_clear "--userspace" 32 "$UST_EVENT_NAME" ust_test_app
+test_map_clear "--userspace" 64 "$UST_EVENT_NAME" ust_test_app
+test_map_ust_clear_per_pid
+
+test_map_ust_exclusion
+
+test_map_filter "--userspace" "$UST_EVENT_NAME" "intfield" ust_test_app
+
+stop_lttng_sessiond_notap
+
+rm -rf "$TMPDIR"
This page took 0.032899 seconds and 5 git commands to generate.