#include <lttng/lttng.h>
#include <lttng/notification/channel.h>
#include <lttng/notification/notification.h>
+#include <lttng/condition/evaluation.h>
#include <lttng/trigger/trigger.h>
#include <lttng/userspace-probe.h>
pid_t app_pid = 0;
const char *app_state_file = NULL;
+static const char *get_notification_trigger_name(
+ struct lttng_notification *notification)
+{
+ const char *name = NULL;
+ enum lttng_evaluation_status status;
+ const struct lttng_evaluation *evaluation;
+ evaluation = lttng_notification_get_evaluation(notification);
+ if (evaluation == NULL) {
+ fail("lttng_notification_get_evaluation");
+ goto end;
+ }
+
+ switch (lttng_evaluation_get_type(evaluation)) {
+ case LTTNG_CONDITION_TYPE_EVENT_RULE_HIT:
+ {
+ status = lttng_evaluation_event_rule_get_trigger_name(
+ evaluation, &name);
+ if (status != LTTNG_EVALUATION_STATUS_OK) {
+ fail("lttng_evaluation_event_rule_get_trigger_name");
+ name = NULL;
+ goto end;
+ }
+ break;
+ }
+ default:
+ fail("Wrong notification evaluation type \n");
+ goto end;
+ }
+end:
+ return name;
+}
+
+static int validator_notification_trigger_name(
+ struct lttng_notification *notification,
+ const char *trigger_name)
+{
+ int ret;
+ bool name_is_equal;
+ const char *name;
+
+ assert(notification);
+ assert(trigger_name);
+
+ name = get_notification_trigger_name(notification);
+ if (name == NULL) {
+ ret = 1;
+ goto end;
+ }
+
+ name_is_equal = (strcmp(trigger_name, name) == 0);
+ ok(name_is_equal, "Expected trigger name: %s got %s", trigger_name,
+ name);
+
+ ret = !name_is_equal;
+
+end:
+ return ret;
+}
+
static
void wait_on_file(const char *path, bool file_exist)
{
return;
}
-static char *get_next_notification_trigger_name(
+static struct lttng_notification *get_next_notification(
struct lttng_notification_channel *notification_channel)
{
- struct lttng_notification *notification;
+ struct lttng_notification *local_notification = NULL;
enum lttng_notification_channel_status status;
- const struct lttng_evaluation *notification_evaluation;
- char *trigger_name = NULL;
- const char *name;
- enum lttng_condition_type notification_evaluation_type;
/* Receive the next notification. */
status = lttng_notification_channel_get_next_notification(
- notification_channel, ¬ification);
+ notification_channel, &local_notification);
switch (status) {
case LTTNG_NOTIFICATION_CHANNEL_STATUS_OK:
break;
- default:
- /* Unhandled conditions / errors. */
- fail("Failed to get next notification channel notification: status = %d",
- status);
- goto end;
- }
-
- notification_evaluation =
- lttng_notification_get_evaluation(notification);
-
- notification_evaluation_type =
- lttng_evaluation_get_type(notification_evaluation);
- switch (notification_evaluation_type) {
- case LTTNG_CONDITION_TYPE_EVENT_RULE_HIT:
- lttng_evaluation_event_rule_get_trigger_name(
- notification_evaluation, &name);
-
- trigger_name = strdup(name);
+ case LTTNG_NOTIFICATION_CHANNEL_STATUS_NOTIFICATIONS_DROPPED:
+ fail("Notifications have been dropped");
+ local_notification = NULL;
break;
default:
- fail("Unexpected notification evaluation type: notification type = %d",
- notification_evaluation_type);
+ /* Unhandled conditions / errors. */
+ fail("Failed to get next notification (unknown notification channel status): status = %d",
+ (int) status);
+ local_notification = NULL;
break;
}
- lttng_notification_destroy(notification);
-
-end:
- return trigger_name;
+ return local_notification;
}
static void test_tracepoint_event_rule_notification(
enum lttng_domain_type domain_type)
{
int i;
+ int ret;
const int notification_count = 3;
enum lttng_notification_channel_status nc_status;
struct lttng_action *action = NULL;
resume_application();
- /* Get 3 notifications. */
+ /* Get notifications. */
for (i = 0; i < notification_count; i++) {
- char *name = get_next_notification_trigger_name(
+ struct lttng_notification *notification = get_next_notification(
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);
+ ok(notification, "Received notification (%d/%d)", i + 1,
+ notification_count);
+
+ /* Error. */
+ if (notification == NULL) {
+ goto end;
+ }
+
+ ret = validator_notification_trigger_name(notification, trigger_name);
+ lttng_notification_destroy(notification);
+ if (ret) {
+ goto end;
+ }
}
+end:
suspend_application();
lttng_notification_channel_destroy(notification_channel);
lttng_unregister_trigger(trigger);
enum lttng_domain_type domain_type)
{
int i;
+ const int notification_count = 3;
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;
* the filter) and 2 from the control trigger. This works whatever
* the order we receive the notifications.
*/
- for (i = 0; i < 3; i++) {
- char *name = get_next_notification_trigger_name(
+ for (i = 0; i < notification_count; i++) {
+ const char *name;
+ struct lttng_notification *notification = get_next_notification(
notification_channel);
+ ok(notification, "Received notification (%d/%d)", i + 1,
+ notification_count);
+
+ /* Error. */
+ if (notification == NULL) {
+ goto end;
+ }
+
+ name = get_notification_trigger_name(notification);
+ if (name == NULL) {
+ lttng_notification_destroy(notification);
+ goto end;
+ }
+
if (strcmp(ctrl_trigger_name, name) == 0) {
ctrl_count++;
} else if (strcmp(trigger_name, name) == 0) {
count++;
}
- free(name);
+ lttng_notification_destroy(notification);
}
ok(ctrl_count / 2 == count,
"Get twice as many control notif as of regular notif");
+end:
suspend_application();
lttng_unregister_trigger(trigger);
struct lttng_notification_channel *notification_channel = NULL;
struct lttng_trigger *ctrl_trigger = NULL, *trigger = NULL;
int ctrl_count = 0, count = 0, i;
+ const int notification_count = 6;
const char * const ctrl_trigger_name = "control_exclusion_trigger";
const char * const trigger_name = "exclusion_trigger";
const char * const pattern = "tp:tptest*";
* 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(
+ for (i = 0; i < notification_count; i++) {
+ const char *name;
+ struct lttng_notification *notification = get_next_notification(
notification_channel);
+ ok(notification, "Received notification (%d/%d)", i + 1,
+ notification_count);
+
+ /* Error. */
+ if (notification == NULL) {
+ goto end;
+ }
+
+ name = get_notification_trigger_name(notification);
+ if (name == NULL) {
+ lttng_notification_destroy(notification);
+ goto end;
+ }
+
if (strcmp(ctrl_trigger_name, name) == 0) {
ctrl_count++;
} else if (strcmp(trigger_name, name) == 0) {
count++;
}
- free(name);
+ lttng_notification_destroy(notification);
}
ok(ctrl_count / 5 == count,
"Got 5 times as many control notif as of regular notif");
+end:
suspend_application();
lttng_unregister_trigger(trigger);
resume_application();
for (i = 0; i < notification_count; i++) {
- char *name = get_next_notification_trigger_name(
+ struct lttng_notification *notification = get_next_notification(
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);
+ ok(notification, "Received notification (%d/%d)", i + 1,
+ notification_count);
+
+ /* Error. */
+ if (notification == NULL) {
+ goto end;
+ }
+
+ ret = validator_notification_trigger_name(notification, trigger_name);
+ lttng_notification_destroy(notification);
+ if (ret) {
+ goto end;
+ }
}
end:
resume_application();
- for (i = 0; i < notification_count; i++) {
- char *name = get_next_notification_trigger_name(
+ for (i = 0; i < 3; i++) {
+ struct lttng_notification *notification = get_next_notification(
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);
+ ok(notification, "Received notification (%d/%d)", i + 1,
+ notification_count);
+
+ /* Error. */
+ if (notification == NULL) {
+ goto end;
+ }
+
+ ret = validator_notification_trigger_name(notification, trigger_name);
+ lttng_notification_destroy(notification);
+ if (ret) {
+ goto end;
+ }
}
end:
suspend_application();
resume_application();
for (i = 0; i < notification_count; i++) {
- char *name = get_next_notification_trigger_name(
+ struct lttng_notification *notification = get_next_notification(
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);
+ ok(notification, "Received notification (%d/%d)", i + 1,
+ notification_count);
+
+ /* Error. */
+ if (notification == NULL) {
+ goto end;
+ }
+
+ ret = validator_notification_trigger_name(notification, trigger_name);
+ lttng_notification_destroy(notification);
+ if (ret) {
+ goto end;
+ }
}
end:
suspend_application();
resume_application();
- for (i = 0; i < 3; i++) {
- char *name = get_next_notification_trigger_name(
+ for (i = 0; i < notification_count; i++) {
+ struct lttng_notification *notification = get_next_notification(
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);
+ ok(notification, "Received notification (%d/%d)", i + 1,
+ notification_count);
+
+ /* Error. */
+ if (notification == NULL) {
+ goto end;
+ }
+
+ ret = validator_notification_trigger_name(notification, trigger_name);
+ lttng_notification_destroy(notification);
+ if (ret) {
+ goto end;
+ }
}
end:
switch (test_scenario) {
case 1:
{
- plan_tests(38);
+ plan_tests(44);
/* Test cases that need gen-ust-event testapp. */
diag("Test basic notification error paths for %s domain",
case 2:
{
const char *session_name, *channel_name;
+
/* Test cases that need a tracing session enabled. */
plan_tests(99);
* Test cases that need a test app with more than one event
* type.
*/
- plan_tests(19);
+ plan_tests(25);
/*
* At the moment, the only test case of this scenario is
}
case 4:
{
- plan_tests(10);
-
+ plan_tests(13);
/* Test cases that need the kernel tracer. */
assert(domain_type == LTTNG_DOMAIN_KERNEL);
}
case 5:
{
- plan_tests(19);
+ plan_tests(25);
/* Test cases that need the kernel tracer. */
assert(domain_type == LTTNG_DOMAIN_KERNEL);
{
const char *testapp_path, *test_symbol_name;
- plan_tests(10);
+ plan_tests(13);
if (argc < 7) {
fail("Missing parameter for tests to run %d", argc);