X-Git-Url: http://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=tests%2Fregression%2Ftools%2Ftrigger%2Frate-policy%2Ftest_ust_rate_policy;fp=tests%2Fregression%2Ftools%2Ftrigger%2Frate-policy%2Ftest_ust_rate_policy;h=27d813048769e95c60be6d5f90ac235f7f3d94a1;hp=0000000000000000000000000000000000000000;hb=7f4d5b07cf7be895b38b69073389a4fcc318ec29;hpb=72365501d3148ca977a09bad8de0ec51b427bdd8 diff --git a/tests/regression/tools/trigger/rate-policy/test_ust_rate_policy b/tests/regression/tools/trigger/rate-policy/test_ust_rate_policy new file mode 100755 index 000000000..27d813048 --- /dev/null +++ b/tests/regression/tools/trigger/rate-policy/test_ust_rate_policy @@ -0,0 +1,226 @@ +#!/bin/bash +# +# Copyright (C) 2020 Francis Deslauriers +# +# SPDX-License-Identifier: LGPL-2.1-only + +TEST_DESC="Triggers - rate policy notify" + +CURDIR=$(dirname "$0")/ +TESTDIR=${CURDIR}/../../../.. + +# shellcheck source=../../../../utils/utils.sh +source "$TESTDIR/utils/utils.sh" + +TESTAPP_PATH="$TESTDIR/utils/testapp" +GEN_UST_EVENTS_TESTAPP_NAME="gen-ust-events" +GEN_UST_EVENTS_TESTAPP_BIN="$TESTAPP_PATH/$GEN_UST_EVENTS_TESTAPP_NAME/$GEN_UST_EVENTS_TESTAPP_NAME" +NOTIFICATION_CLIENT_BIN="$CURDIR/../utils/notification-client" +NUM_TESTS=19 + +NR_ITER=10 +NR_USEC_WAIT=5 + +function test_rate_policy_every_n() +{ + local SESSION_NAME="my_triggered_session" + local TRIGGER_NAME="trigger1" + local END_TRIGGER_NAME="end-trigger1" + local SYNC_AFTER_NOTIF_REGISTER_PATH + + SYNC_AFTER_NOTIF_REGISTER_PATH=$(mktemp -u test-notif-register.XXXXXX) + + diag "Every N rate policy" + + # Add a trigger with a notify action with a policy to fire it every 5 + # time the condition is met. + lttng_add_trigger_ok \ + $TRIGGER_NAME \ + --condition on-event -u "tp:tptest" \ + --action notify \ + --fire-every 5 + + # Add a trigger with a notify action for the tp:end event of the test + # application. This allow us to "delimit" the reception loop for the + # notification client ensuring that all events were hit and passed into + # the notification subsystem. + lttng_add_trigger_ok \ + $END_TRIGGER_NAME \ + --condition on-event -u "tp:end" \ + --action notify + + for i in $(seq 1 4); do + diag "Iteration $i of 4" + ## Phase 1 + # Hit the trigger condition 4 time and validate that no (0) + # notification for that condition was received. + $NOTIFICATION_CLIENT_BIN \ + --trigger $TRIGGER_NAME \ + --sync-after-notif-register "$SYNC_AFTER_NOTIF_REGISTER_PATH" \ + --count 0 \ + --end-trigger "$END_TRIGGER_NAME" & + notif_client_pid=$! + while [ ! -f "${SYNC_AFTER_NOTIF_REGISTER_PATH}" ]; do + sleep 0.5 + done + + $GEN_UST_EVENTS_TESTAPP_BIN -i 4 -w $NR_USEC_WAIT --emit-end-event > /dev/null 2>&1 + + # notification-client will exit once it receives the end-trigger notification. + # Validation of the number of received notification is done by the + # notification client. Here it validate that it received 0 notifications. + wait $notif_client_pid + test "$?" -eq "0" + ok $? "notification client exited successfully" + + ## Phase 2 + # Hit the condition 1 time and validate that a notification is + # received. + rm -f "${SYNC_AFTER_NOTIF_REGISTER_PATH}" + $NOTIFICATION_CLIENT_BIN \ + --trigger $TRIGGER_NAME \ + --sync-after-notif-register "$SYNC_AFTER_NOTIF_REGISTER_PATH" \ + --count 1 \ + --end-trigger "$END_TRIGGER_NAME" & + notif_client_pid=$! + while [ ! -f "${SYNC_AFTER_NOTIF_REGISTER_PATH}" ]; do + sleep 0.5 + done + + # Artificially produce the desired event-rule condition. + $GEN_UST_EVENTS_TESTAPP_BIN -i 1 -w $NR_USEC_WAIT --emit-end-event > /dev/null 2>&1 + + # notification-client will exit once it receives the end-trigger notification. + # Validation of the number of received notification is done by the + # notification client. Here it validate that it received 1 notifications. + wait $notif_client_pid + test "$?" -eq "0" + ok $? "notification client exited successfully" + + rm -f "${SYNC_AFTER_NOTIF_REGISTER_PATH}" + done + + # Tearing down. + lttng_remove_trigger_ok $TRIGGER_NAME + lttng_remove_trigger_ok $END_TRIGGER_NAME + + rm -f "$SYNC_AFTER_NOTIF_REGISTER_PATH" +} + +function test_rate_policy_once_after_n() +{ + local SESSION_NAME="my_triggered_session" + local TRIGGER_NAME="trigger1" + local END_TRIGGER_NAME="end-trigger1" + local SYNC_AFTER_NOTIF_REGISTER_PATH + + SYNC_AFTER_NOTIF_REGISTER_PATH=$(mktemp -u test-notif-register.XXXXXX) + + diag "Once after N rate policy" + + # Add a trigger with a notify action with a policy to fire it every 5 + # time the condition is met. + lttng_add_trigger_ok \ + $TRIGGER_NAME \ + --condition on-event -u "tp:tptest" \ + --action notify \ + --fire-once-after 5 + + # Add a trigger with a notify action for the tp:end event of the test + # application. This allow us to "delimit" the reception loop for the + # notification client ensuring that all events were hit and passed into + # the notification subsystem. + lttng_add_trigger_ok \ + $END_TRIGGER_NAME \ + --condition on-event -u "tp:end" \ + --action notify + + ## Phase 1 + # Hit the trigger condition 4 time and validate that no (0) + # notification for that condition was received. + $NOTIFICATION_CLIENT_BIN \ + --trigger $TRIGGER_NAME \ + --sync-after-notif-register "$SYNC_AFTER_NOTIF_REGISTER_PATH" \ + --count 0 \ + --end-trigger "$END_TRIGGER_NAME" & + notif_client_pid=$! + while [ ! -f "${SYNC_AFTER_NOTIF_REGISTER_PATH}" ]; do + sleep 0.5 + done + + # Artificially produce the desired event-rule condition. + $GEN_UST_EVENTS_TESTAPP_BIN -i 4 -w $NR_USEC_WAIT --emit-end-event > /dev/null 2>&1 + + # notification-client will exit once it receives the end-trigger notification. + # Validation of the number of received notification is done by the + # notification client. Here it validate that it received 0 notifications. + wait $notif_client_pid + test "$?" -eq "0" + ok $? "notification client exited successfully" + + ## Phase 2 + # Hit the condition 1 time and validate that a notification is + # received. + rm -f "${SYNC_AFTER_NOTIF_REGISTER_PATH}" + $NOTIFICATION_CLIENT_BIN \ + --trigger $TRIGGER_NAME \ + --sync-after-notif-register "$SYNC_AFTER_NOTIF_REGISTER_PATH" \ + --count 1 \ + --end-trigger "$END_TRIGGER_NAME" & + notif_client_pid=$! + while [ ! -f "${SYNC_AFTER_NOTIF_REGISTER_PATH}" ]; do + sleep 0.5 + done + + # Artificially produce the desired event-rule condition. + $GEN_UST_EVENTS_TESTAPP_BIN -i 1 -w $NR_USEC_WAIT --emit-end-event > /dev/null 2>&1 + + # notification-client will exit once it receives the end-trigger notification. + # Validation of the number of received notification is done by the + # notification client. Here it validate that it received 1 notifications. + wait $notif_client_pid + test "$?" -eq "0" + ok $? "notification client exited successfully" + + ## Phase 3 + # Hit the condition N time and validate that no (0) notification is + # received. + rm -f "${SYNC_AFTER_NOTIF_REGISTER_PATH}" + $NOTIFICATION_CLIENT_BIN \ + --trigger $TRIGGER_NAME \ + --sync-after-notif-register "$SYNC_AFTER_NOTIF_REGISTER_PATH" \ + --count 0 \ + --end-trigger "$END_TRIGGER_NAME" & + notif_client_pid=$! + while [ ! -f "${SYNC_AFTER_NOTIF_REGISTER_PATH}" ]; do + sleep 0.5 + done + + # Artificially produce the desired event-rule condition. + $GEN_UST_EVENTS_TESTAPP_BIN -i $NR_ITER -w $NR_USEC_WAIT --emit-end-event > /dev/null 2>&1 + + # notification-client will exit once it receives the end-trigger notification. + # Validation of the number of received notification is done by the + # notification client. Here it validate that it received 0 notifications. + wait $notif_client_pid + test "$?" -eq "0" + ok $? "notification client exited successfully" + + # Tearing down. + lttng_remove_trigger_ok $TRIGGER_NAME + lttng_remove_trigger_ok $END_TRIGGER_NAME + + rm -f "$SYNC_AFTER_NOTIF_REGISTER_PATH" +} + + # MUST set TESTDIR before calling those functions +plan_tests $NUM_TESTS + +print_test_banner "$TEST_DESC" + +start_lttng_sessiond_notap + +test_rate_policy_every_n +test_rate_policy_once_after_n + +stop_lttng_sessiond_notap