From 3e4ee3b37bab181a2da93b09e4714af5dbbc29c0 Mon Sep 17 00:00:00 2001 From: Francis Deslauriers Date: Tue, 11 Feb 2020 17:13:15 -0500 Subject: [PATCH] Tests: triggers: Add event rule condition exclusion tests MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Francis Deslauriers Signed-off-by: Jérémie Galarneau Change-Id: Ibb323a636d5829725776d8332f5c22da63b7a35f Depends-on: lttng-ust: I5a800fc92e588c2a6a0e26282b0ad5f31c044479 --- tests/regression/Makefile.am | 1 + .../regression/tools/notification/Makefile.am | 6 +- .../tools/notification/notification.c | 104 +++++++++++++++++- ...ication_ust_event_rule_condition_exclusion | 41 +++++++ 4 files changed, 148 insertions(+), 4 deletions(-) create mode 100755 tests/regression/tools/notification/test_notification_ust_event_rule_condition_exclusion diff --git a/tests/regression/Makefile.am b/tests/regression/Makefile.am index b06614965..8ffb1a5f1 100644 --- a/tests/regression/Makefile.am +++ b/tests/regression/Makefile.am @@ -29,6 +29,7 @@ TESTS = tools/filtering/test_invalid_filter \ tools/regen-statedump/test_ust \ tools/notification/test_notification_ust_error \ tools/notification/test_notification_ust_buffer_usage \ + tools/notification/test_notification_ust_event_rule_condition_exclusion \ tools/notification/test_notification_kernel_error \ tools/notification/test_notification_kernel_buffer_usage \ tools/notification/test_notification_multi_app \ diff --git a/tests/regression/tools/notification/Makefile.am b/tests/regression/tools/notification/Makefile.am index 558de8359..dc79067f6 100644 --- a/tests/regression/tools/notification/Makefile.am +++ b/tests/regression/tools/notification/Makefile.am @@ -10,7 +10,7 @@ noinst_PROGRAMS = base_client notification rotation if NO_SHARED CLEANFILES = libpause_consumer.so libpause_consumer.so.debug -EXTRA_DIST = test_notification_ust_error test_notification_ust_buffer_usage test_notification_kernel_error test_notification_kernel_buffer_usage test_notification_multi_app base_client.c notification.c consumer_testpoints.c util_event_generator.sh +EXTRA_DIST = test_notification_ust_error test_notification_ust_buffer_usage test_notification_ust_event_rule_condition_exclusion test_notification_kernel_error test_notification_kernel_buffer_usage test_notification_multi_app base_client.c notification.c consumer_testpoints.c util_event_generator.sh else @@ -37,8 +37,8 @@ notification_LDADD = $(LIB_LTTNG_CTL) $(LIBTAP) -lm rotation_SOURCES = rotation.c rotation_LDADD = $(LIB_LTTNG_CTL) $(LIBTAP) -lm -noinst_SCRIPTS = test_notification_ust_error test_notification_ust_buffer_usage test_notification_kernel_error test_notification_kernel_buffer_usage test_notification_multi_app test_rotation util_event_generator.sh -EXTRA_DIST = test_notification_ust_error test_notification_ust_buffer_usage test_notification_kernel_error test_notification_kernel_buffer_usage test_notification_multi_app test_rotation util_event_generator.sh +noinst_SCRIPTS = test_notification_ust_error test_notification_ust_buffer_usage test_notification_ust_event_rule_condition_exclusion test_notification_kernel_error test_notification_kernel_buffer_usage test_notification_multi_app test_rotation util_event_generator.sh +EXTRA_DIST = test_notification_ust_error test_notification_ust_buffer_usage test_notification_ust_event_rule_condition_exclusion test_notification_kernel_error test_notification_kernel_buffer_usage test_notification_multi_app test_rotation util_event_generator.sh all-local: diff --git a/tests/regression/tools/notification/notification.c b/tests/regression/tools/notification/notification.c index 3142e10c6..f5e44210a 100644 --- a/tests/regression/tools/notification/notification.c +++ b/tests/regression/tools/notification/notification.c @@ -856,7 +856,7 @@ static void create_tracepoint_event_rule_trigger(const char *event_pattern, const char *trigger_name, const char *filter, unsigned int exclusion_count, - const char **exclusions, + const char * const *exclusions, enum lttng_domain_type domain_type, struct lttng_condition **condition, struct lttng_trigger **trigger) @@ -1124,6 +1124,89 @@ static void test_tracepoint_event_rule_notification_filter( lttng_condition_destroy(ctrl_condition); } +static void test_tracepoint_event_rule_notification_exclusion( + enum lttng_domain_type domain_type) +{ + enum lttng_notification_channel_status nc_status; + struct lttng_condition *ctrl_condition = NULL, *condition = NULL; + struct lttng_notification_channel *notification_channel = NULL; + struct lttng_trigger *ctrl_trigger = NULL, *trigger = NULL; + int ctrl_count = 0, count = 0, i; + const char * const ctrl_trigger_name = "control_exclusion_trigger"; + const char * const trigger_name = "exclusion_trigger"; + const char * const pattern = "tp:tptest*"; + const char * const exclusions[] = { + "tp:tptest2", + "tp:tptest3", + "tp:tptest4", + "tp:tptest5" + }; + + notification_channel = lttng_notification_channel_create( + lttng_session_daemon_notification_endpoint); + ok(notification_channel, "Notification channel object creation"); + + create_tracepoint_event_rule_trigger(pattern, ctrl_trigger_name, NULL, + 0, NULL, domain_type, &ctrl_condition, &ctrl_trigger); + + nc_status = lttng_notification_channel_subscribe( + notification_channel, ctrl_condition); + ok(nc_status == LTTNG_NOTIFICATION_CHANNEL_STATUS_OK, + "Subscribe to tracepoint event rule condition"); + + create_tracepoint_event_rule_trigger(pattern, trigger_name, NULL, 4, + exclusions, domain_type, &condition, &trigger); + + nc_status = lttng_notification_channel_subscribe( + notification_channel, condition); + ok(nc_status == LTTNG_NOTIFICATION_CHANNEL_STATUS_OK, + "Subscribe to tracepoint event rule condition"); + + /* + * We registered 2 notifications triggers, one with an exclusion and + * one without (control). + * - The trigger with an exclusion will fire once every iteration. + * - The trigger without an exclusion will fire 5 times every + * iteration. + * + * We should get 5 times as many notifications from the control + * trigger. + */ + resume_application(); + + /* + * Get 6 notifications. We should get 1 for the regular trigger (with + * the exclusion) and 5 from the control trigger. This works whatever + * the order we receive the notifications. + */ + for (i = 0; i < 6; i++) { + char *name = get_next_notification_trigger_name( + notification_channel); + + if (strcmp(ctrl_trigger_name, name) == 0) { + ctrl_count++; + } else if (strcmp(trigger_name, name) == 0) { + count++; + } + + free(name); + } + + ok(ctrl_count / 5 == count, + "Got 5 times as many control notif as of regular notif"); + + suspend_application(); + + lttng_unregister_trigger(trigger); + lttng_unregister_trigger(ctrl_trigger); + lttng_notification_channel_destroy(notification_channel); + lttng_trigger_destroy(trigger); + lttng_trigger_destroy(ctrl_trigger); + lttng_condition_destroy(condition); + lttng_condition_destroy(ctrl_condition); + return; +} + int main(int argc, const char *argv[]) { int test_scenario; @@ -1220,6 +1303,25 @@ int main(int argc, const char *argv[]) domain_type, argv); break; } + case 3: + { + /* + * Test cases that need a test app with more than one event + * type. + */ + plan_tests(19); + + /* + * At the moment, the only test case of this scenario is + * exclusion which is only supported by UST. + */ + assert(domain_type == LTTNG_DOMAIN_UST); + diag("Test tracepoint event rule notifications with exclusion for domain %s", + domain_type_string); + test_tracepoint_event_rule_notification_exclusion(domain_type); + + break; + } default: abort(); } diff --git a/tests/regression/tools/notification/test_notification_ust_event_rule_condition_exclusion b/tests/regression/tools/notification/test_notification_ust_event_rule_condition_exclusion new file mode 100755 index 000000000..12ae728bb --- /dev/null +++ b/tests/regression/tools/notification/test_notification_ust_event_rule_condition_exclusion @@ -0,0 +1,41 @@ +#!/bin/bash +# +# Copyright (C) 2017 Jonathan Rajotte-Julien +# +# SPDX-License-Identifier: LGPL-2.1-only + +CURDIR=$(dirname "$0")/ +TESTDIR=$CURDIR/../../../ + +TMPDIR=$(mktemp -d) + +TESTAPP_PATH="$TESTDIR/utils/testapp" + +GEN_UST_NEVENTS_TESTAPP_NAME="gen-ust-nevents" +GEN_UST_NEVENTS_TESTAPP_BIN="$TESTAPP_PATH/$GEN_UST_NEVENTS_TESTAPP_NAME/$GEN_UST_NEVENTS_TESTAPP_NAME" + +TESTAPP_STATE_PATH=$(mktemp -u "$TMPDIR/application_state.XXXXXXXXXX") + +# shellcheck source=../../../utils/utils.sh +source "$TESTDIR/utils/utils.sh" +# shellcheck source=./util_event_generator.sh +source "$CURDIR/util_event_generator.sh" + +function test_event_rule_condition_exclusion_notification +{ + ust_event_generator_run_once_per_transition "$GEN_UST_NEVENTS_TESTAPP_BIN" "$TESTAPP_STATE_PATH" 5 5 & + APP_PID=$! + + "$CURDIR/notification" 3 LTTNG_DOMAIN_UST $APP_PID "$TESTAPP_STATE_PATH" + + kill -SIGUSR2 $APP_PID + wait $APP_PID 2> /dev/null +} + +start_lttng_sessiond_notap + +test_event_rule_condition_exclusion_notification + +stop_lttng_sessiond_notap + +rm -rf "$TMPDIR" -- 2.34.1