Tests: triggers: Add event rule condition exclusion tests
authorFrancis Deslauriers <francis.deslauriers@efficios.com>
Tue, 11 Feb 2020 22:13:15 +0000 (17:13 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 4 Mar 2021 16:59:25 +0000 (11:59 -0500)
Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Change-Id: Ibb323a636d5829725776d8332f5c22da63b7a35f
Depends-on: lttng-ust: I5a800fc92e588c2a6a0e26282b0ad5f31c044479

tests/regression/Makefile.am
tests/regression/tools/notification/Makefile.am
tests/regression/tools/notification/notification.c
tests/regression/tools/notification/test_notification_ust_event_rule_condition_exclusion [new file with mode: 0755]

index b066149652fdb319d3d1a4e69fa32a46ae282b37..8ffb1a5f13f508ad7419df1efd9b0df3e3f24536 100644 (file)
@@ -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 \
index 558de83595cab24c91f0fe8c62d6da8922b2515f..dc79067f6abe464a313f703664de47ff6bac96f1 100644 (file)
@@ -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:
index 3142e10c654b2dc60d03372abc62cec00c90e9e4..f5e44210ab7c2898e5815654fbaaba201793b4f5 100644 (file)
@@ -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 (executable)
index 0000000..12ae728
--- /dev/null
@@ -0,0 +1,41 @@
+#!/bin/bash
+#
+# Copyright (C) 2017 Jonathan Rajotte-Julien <jonathan.rajotte-julien@efficios.com>
+#
+# 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"
This page took 0.029971 seconds and 5 git commands to generate.