From: Francis Deslauriers Date: Fri, 14 Feb 2020 03:51:57 +0000 (-0500) Subject: Tests: triggers: Add syscall event rule condition filter tests X-Git-Tag: v2.13.0-rc1~283 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=acb988666ee674d3cf10d853cacf10b20f0e1624;hp=45294d8ae0bc7258ac612bd8b4fba18bd7c4bf55;ds=sidebyside Tests: triggers: Add syscall event rule condition filter tests This test has limited value as it's impossible to distinguish events from buggy filtering from the ones that went through the filter successfully. Keep that test case anyway, as it exercises those code paths. Signed-off-by: Francis Deslauriers Signed-off-by: Jérémie Galarneau Change-Id: I1b1f9ecb29b7e09b4b8f66034e8911a645aabe3c Depends-on: lttng-ust: I5a800fc92e588c2a6a0e26282b0ad5f31c044479 --- diff --git a/tests/regression/tools/notification/notification.c b/tests/regression/tools/notification/notification.c index 8fa0d3d37..d870a576f 100644 --- a/tests/regression/tools/notification/notification.c +++ b/tests/regression/tools/notification/notification.c @@ -1491,6 +1491,94 @@ end: return; } +static void test_syscall_event_rule_notification_filter( + enum lttng_domain_type domain_type) +{ + int i, ret; + const int notification_count = 3; + enum lttng_notification_channel_status nc_status; + enum lttng_event_rule_status event_rule_status; + enum lttng_trigger_status trigger_status; + struct lttng_notification_channel *notification_channel = NULL; + struct lttng_condition *condition = NULL; + struct lttng_event_rule *event_rule = NULL; + struct lttng_action *action = NULL; + struct lttng_trigger *trigger = NULL; + const char * const trigger_name = "syscall_trigger"; + const char * const syscall_name = "openat"; + const char * const filter_pattern = "filename == \"/proc/cpuinfo\""; + + action = lttng_action_notify_create(); + if (!action) { + fail("Failed to create notify action"); + goto end; + } + + notification_channel = lttng_notification_channel_create( + lttng_session_daemon_notification_endpoint); + ok(notification_channel, "Notification channel object creation"); + + event_rule = lttng_event_rule_syscall_create(); + ok(event_rule, "syscall event rule object creation"); + + event_rule_status = lttng_event_rule_syscall_set_pattern( + event_rule, syscall_name); + ok(event_rule_status == LTTNG_EVENT_RULE_STATUS_OK, + "Setting syscall event rule pattern: '%s'", syscall_name); + + event_rule_status = lttng_event_rule_syscall_set_filter( + event_rule, filter_pattern); + ok(event_rule_status == LTTNG_EVENT_RULE_STATUS_OK, + "Setting filter: '%s'", filter_pattern); + + condition = lttng_condition_event_rule_create(event_rule); + ok(condition, "Condition event rule object creation"); + + /* Register the triggers for condition */ + trigger = lttng_trigger_create(condition, action); + if (!trigger) { + fail("Failed to create trigger with syscall filtering event rule condition and notify action"); + goto end; + } + + trigger_status = lttng_trigger_set_name(trigger, trigger_name); + ok(trigger_status == LTTNG_TRIGGER_STATUS_OK, + "Setting name to trigger '%s'", trigger_name); + + ret = lttng_register_trigger(trigger); + if (ret) { + fail("Failed to register trigger with syscall filtering event rule condition and notify action"); + goto end; + } + + nc_status = lttng_notification_channel_subscribe( + notification_channel, condition); + ok(nc_status == LTTNG_NOTIFICATION_CHANNEL_STATUS_OK, + "Subscribe to tracepoint event rule condition"); + + resume_application(); + + for (i = 0; i < 3; i++) { + char *name = get_next_notification_trigger_name( + notification_channel); + + ok(strcmp(trigger_name, name) == 0, + "Received notification for the expected trigger name: '%s' (%d/%d)", + trigger_name, i + 1, notification_count); + free(name); + } + +end: + suspend_application(); + + lttng_unregister_trigger(trigger); + lttng_notification_channel_destroy(notification_channel); + lttng_trigger_destroy(trigger); + lttng_event_rule_destroy(event_rule); + lttng_condition_destroy(condition); + return; +} + int main(int argc, const char *argv[]) { int test_scenario; @@ -1621,7 +1709,7 @@ int main(int argc, const char *argv[]) } case 5: { - plan_tests(10); + plan_tests(19); /* Test cases that need the kernel tracer. */ assert(domain_type == LTTNG_DOMAIN_KERNEL); @@ -1630,6 +1718,11 @@ int main(int argc, const char *argv[]) test_syscall_event_rule_notification(domain_type); + diag("Test syscall filtering event rule notifications for domain %s", + domain_type_string); + + test_syscall_event_rule_notification_filter(domain_type); + break; } case 6: