4 * Tests suite for LTTng notification API
6 * Copyright (C) 2017 Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
8 * SPDX-License-Identifier: MIT
20 #include <sys/types.h>
26 #include <common/compat/errno.h>
27 #include <lttng/action/action.h>
28 #include <lttng/action/notify.h>
29 #include <lttng/condition/buffer-usage.h>
30 #include <lttng/condition/condition.h>
31 #include <lttng/condition/evaluation.h>
32 #include <lttng/domain.h>
33 #include <lttng/endpoint.h>
34 #include <lttng/lttng-error.h>
35 #include <lttng/notification/channel.h>
36 #include <lttng/notification/notification.h>
37 #include <lttng/trigger/trigger.h>
38 #include <lttng/lttng.h>
45 int named_pipe_args_start
= 0;
47 const char *app_state_file
= NULL
;
50 void wait_on_file(const char *path
, bool file_exist
)
59 ret
= stat(path
, &buf
);
60 if (ret
== -1 && errno
== ENOENT
) {
63 * The file does not exist. wait a bit and
64 * continue looping until it does.
66 (void) poll(NULL
, 0, 10);
71 * File does not exist and the exit condition we want.
72 * Break from the loop and return.
81 * stat() returned 0, so the file exists. break now only if
82 * that's the exit condition we want.
91 int write_pipe(const char *path
, uint8_t data
)
96 fd
= open(path
, O_WRONLY
| O_NONBLOCK
);
98 perror("Could not open consumer control named pipe");
102 ret
= write(fd
, &data
, sizeof(data
));
104 perror("Named pipe write failed");
106 perror("Named pipe close failed");
114 perror("Name pipe closing failed");
123 int stop_consumer(const char **argv
)
127 for (i
= named_pipe_args_start
; i
< nb_args
; i
++) {
128 ret
= write_pipe(argv
[i
], 49);
134 int resume_consumer(const char **argv
)
138 for (i
= named_pipe_args_start
; i
< nb_args
; i
++) {
139 ret
= write_pipe(argv
[i
], 0);
145 int suspend_application(void)
150 if (!stat(app_state_file
, &buf
)) {
151 fail("App is already in a suspended state.");
157 * Send SIGUSR1 to application instructing it to bypass tracepoint.
159 ret
= kill(app_pid
, SIGUSR1
);
161 fail("SIGUSR1 failed. errno %d", errno
);
166 wait_on_file(app_state_file
, true);
174 int resume_application(void)
179 ret
= stat(app_state_file
, &buf
);
180 if (ret
== -1 && errno
== ENOENT
) {
181 fail("State file does not exist");
189 ret
= kill(app_pid
, SIGUSR1
);
191 fail("SIGUSR1 failed. errno %d", errno
);
196 wait_on_file(app_state_file
, false);
205 void test_triggers_buffer_usage_condition(const char *session_name
,
206 const char *channel_name
,
207 enum lttng_domain_type domain_type
,
208 enum lttng_condition_type condition_type
)
210 unsigned int test_vector_size
= 5, i
;
211 enum lttng_condition_status condition_status
;
212 struct lttng_action
*action
;
215 action
= lttng_action_notify_create();
217 fail("Setup error on action creation");
221 /* Test lttng_register_trigger with null value */
222 ok(lttng_register_trigger(NULL
) == -LTTNG_ERR_INVALID
, "Registering a NULL trigger fails as expected");
224 /* Test: register a trigger */
226 for (i
= 0; i
< pow(2,test_vector_size
); i
++) {
228 char *test_tuple_string
= NULL
;
229 unsigned int mask_position
= 0;
230 bool session_name_set
= false;
231 bool channel_name_set
= false;
232 bool threshold_ratio_set
= false;
233 bool threshold_byte_set
= false;
234 bool domain_type_set
= false;
236 struct lttng_trigger
*trigger
= NULL
;
237 struct lttng_condition
*condition
= NULL
;
239 /* Create base condition */
240 switch (condition_type
) {
241 case LTTNG_CONDITION_TYPE_BUFFER_USAGE_LOW
:
242 condition
= lttng_condition_buffer_usage_low_create();
244 case LTTNG_CONDITION_TYPE_BUFFER_USAGE_HIGH
:
245 condition
= lttng_condition_buffer_usage_high_create();
258 /* Prepare the condition for trigger registration test */
260 /* Set session name */
261 if ((1 << mask_position
) & i
) {
262 condition_status
= lttng_condition_buffer_usage_set_session_name(
263 condition
, session_name
);
264 if (condition_status
!= LTTNG_CONDITION_STATUS_OK
) {
268 session_name_set
= true;
272 /* Set channel name */
273 if ((1 << mask_position
) & i
) {
274 condition_status
= lttng_condition_buffer_usage_set_channel_name(
275 condition
, channel_name
);
276 if (condition_status
!= LTTNG_CONDITION_STATUS_OK
) {
280 channel_name_set
= true;
284 /* Set threshold ratio */
285 if ((1 << mask_position
) & i
) {
286 condition_status
= lttng_condition_buffer_usage_set_threshold_ratio(
288 if (condition_status
!= LTTNG_CONDITION_STATUS_OK
) {
292 threshold_ratio_set
= true;
296 /* Set threshold byte */
297 if ((1 << mask_position
) & i
) {
298 condition_status
= lttng_condition_buffer_usage_set_threshold(
300 if (condition_status
!= LTTNG_CONDITION_STATUS_OK
) {
304 threshold_byte_set
= true;
308 /* Set domain type */
309 if ((1 << mask_position
) & i
) {
310 condition_status
= lttng_condition_buffer_usage_set_domain_type(
311 condition
, LTTNG_DOMAIN_UST
);
312 if (condition_status
!= LTTNG_CONDITION_STATUS_OK
) {
316 domain_type_set
= true;
320 if (mask_position
!= test_vector_size
-1) {
321 assert("Logic error for test vector generation");
324 loop_ret
= asprintf(&test_tuple_string
, "session name %s, channel name %s, threshold ratio %s, threshold byte %s, domain type %s",
325 session_name_set
? "set" : "unset",
326 channel_name_set
? "set" : "unset",
327 threshold_ratio_set
? "set" : "unset",
328 threshold_byte_set
? "set" : "unset",
329 domain_type_set
? "set" : "unset");
330 if (!test_tuple_string
|| loop_ret
< 0) {
336 trigger
= lttng_trigger_create(condition
, action
);
342 loop_ret
= lttng_register_trigger(trigger
);
346 fail("Setup error occurred for tuple: %s", test_tuple_string
);
350 /* This combination happens three times */
351 if (session_name_set
&& channel_name_set
352 && (threshold_ratio_set
|| threshold_byte_set
)
353 && domain_type_set
) {
354 ok(loop_ret
== 0, "Trigger is registered: %s", test_tuple_string
);
357 * Test that a trigger cannot be registered
360 loop_ret
= lttng_register_trigger(trigger
);
361 ok(loop_ret
== -LTTNG_ERR_TRIGGER_EXISTS
, "Re-register trigger fails as expected: %s", test_tuple_string
);
363 /* Test that a trigger can be unregistered */
364 loop_ret
= lttng_unregister_trigger(trigger
);
365 ok(loop_ret
== 0, "Unregister trigger: %s", test_tuple_string
);
368 * Test that unregistration of a non-previously
369 * registered trigger fail.
371 loop_ret
= lttng_unregister_trigger(trigger
);
372 ok(loop_ret
== -LTTNG_ERR_TRIGGER_NOT_FOUND
, "Unregister of a non-registered trigger fails as expected: %s", test_tuple_string
);
374 ok(loop_ret
== -LTTNG_ERR_INVALID_TRIGGER
, "Trigger is invalid as expected and cannot be registered: %s", test_tuple_string
);
378 free(test_tuple_string
);
379 lttng_trigger_destroy(trigger
);
380 lttng_condition_destroy(condition
);
384 lttng_action_destroy(action
);
388 void wait_data_pending(const char *session_name
)
393 ret
= lttng_data_pending(session_name
);
399 int setup_buffer_usage_condition(struct lttng_condition
*condition
,
400 const char *condition_name
,
401 const char *session_name
,
402 const char *channel_name
,
403 const enum lttng_domain_type domain_type
)
405 enum lttng_condition_status condition_status
;
408 condition_status
= lttng_condition_buffer_usage_set_session_name(
409 condition
, session_name
);
410 if (condition_status
!= LTTNG_CONDITION_STATUS_OK
) {
411 fail("Failed to set session name on creation of condition `%s`",
417 condition_status
= lttng_condition_buffer_usage_set_channel_name(
418 condition
, channel_name
);
419 if (condition_status
!= LTTNG_CONDITION_STATUS_OK
) {
420 fail("Failed to set channel name on creation of condition `%s`",
426 condition_status
= lttng_condition_buffer_usage_set_domain_type(
427 condition
, domain_type
);
428 if (condition_status
!= LTTNG_CONDITION_STATUS_OK
) {
429 fail("Failed to set domain type on creation of condition `%s`",
440 void test_invalid_channel_subscription(
441 const enum lttng_domain_type domain_type
)
443 enum lttng_condition_status condition_status
;
444 enum lttng_notification_channel_status nc_status
;
445 struct lttng_condition
*dummy_condition
= NULL
;
446 struct lttng_condition
*dummy_invalid_condition
= NULL
;
447 struct lttng_notification_channel
*notification_channel
= NULL
;
450 notification_channel
= lttng_notification_channel_create(
451 lttng_session_daemon_notification_endpoint
);
452 ok(notification_channel
, "Notification channel object creation");
453 if (!notification_channel
) {
458 * Create a dummy, empty (thus invalid) condition to test error paths.
460 dummy_invalid_condition
= lttng_condition_buffer_usage_low_create();
461 if (!dummy_invalid_condition
) {
462 fail("Setup error on condition creation");
467 * Test subscription and unsubscription of an invalid condition to/from
470 nc_status
= lttng_notification_channel_subscribe(
471 notification_channel
, dummy_invalid_condition
);
472 ok(nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_INVALID
,
473 "Subscribing to an invalid condition");
475 nc_status
= lttng_notification_channel_unsubscribe(
476 notification_channel
, dummy_invalid_condition
);
477 ok(nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_INVALID
,
478 "Unsubscribing from an invalid condition");
480 /* Create a valid dummy condition with a ratio of 0.5 */
481 dummy_condition
= lttng_condition_buffer_usage_low_create();
482 if (!dummy_condition
) {
483 fail("Setup error on dummy_condition creation");
487 condition_status
= lttng_condition_buffer_usage_set_threshold_ratio(
488 dummy_condition
, 0.5);
489 if (condition_status
!= LTTNG_CONDITION_STATUS_OK
) {
490 fail("Setup error on condition creation");
494 ret
= setup_buffer_usage_condition(dummy_condition
, "dummy_condition",
495 "dummy_session", "dummy_channel", domain_type
);
497 fail("Setup error on dummy condition creation");
502 * Test subscription and unsubscription to/from a channel with invalid
505 nc_status
= lttng_notification_channel_subscribe(NULL
, NULL
);
506 ok(nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_INVALID
,
507 "Notification channel subscription is invalid: NULL, NULL");
509 nc_status
= lttng_notification_channel_subscribe(
510 notification_channel
, NULL
);
511 ok(nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_INVALID
,
512 "Notification channel subscription is invalid: NON-NULL, NULL");
514 nc_status
= lttng_notification_channel_subscribe(NULL
, dummy_condition
);
515 ok(nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_INVALID
,
516 "Notification channel subscription is invalid: NULL, NON-NULL");
518 nc_status
= lttng_notification_channel_unsubscribe(
519 notification_channel
, dummy_condition
);
520 ok(nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_UNKNOWN_CONDITION
,
521 "Unsubscribing from a valid unknown condition");
524 lttng_notification_channel_destroy(notification_channel
);
525 lttng_condition_destroy(dummy_invalid_condition
);
526 lttng_condition_destroy(dummy_condition
);
530 enum buffer_usage_type
{
531 BUFFER_USAGE_TYPE_LOW
,
532 BUFFER_USAGE_TYPE_HIGH
,
535 static int register_buffer_usage_notify_trigger(const char *session_name
,
536 const char *channel_name
,
537 const enum lttng_domain_type domain_type
,
538 enum buffer_usage_type buffer_usage_type
,
540 struct lttng_condition
**condition
,
541 struct lttng_action
**action
,
542 struct lttng_trigger
**trigger
)
544 enum lttng_condition_status condition_status
;
545 struct lttng_action
*tmp_action
= NULL
;
546 struct lttng_condition
*tmp_condition
= NULL
;
547 struct lttng_trigger
*tmp_trigger
= NULL
;
551 tmp_action
= lttng_action_notify_create();
553 fail("Setup error on action creation");
558 if (buffer_usage_type
== BUFFER_USAGE_TYPE_LOW
) {
559 tmp_condition
= lttng_condition_buffer_usage_low_create();
561 tmp_condition
= lttng_condition_buffer_usage_high_create();
564 if (!tmp_condition
) {
565 fail("Setup error on condition creation");
570 /* Set the buffer usage threashold */
571 condition_status
= lttng_condition_buffer_usage_set_threshold_ratio(
572 tmp_condition
, ratio
);
573 if (condition_status
!= LTTNG_CONDITION_STATUS_OK
) {
574 fail("Setup error on condition creation");
579 ret
= setup_buffer_usage_condition(tmp_condition
, "condition_name",
580 session_name
, channel_name
, domain_type
);
582 fail("Setup error on condition creation");
587 /* Register the trigger for condition. */
588 tmp_trigger
= lttng_trigger_create(tmp_condition
, tmp_action
);
590 fail("Setup error on trigger creation");
595 ret
= lttng_register_trigger(tmp_trigger
);
597 fail("Setup error on trigger registration");
602 *condition
= tmp_condition
;
603 *trigger
= tmp_trigger
;
604 *action
= tmp_action
;
608 lttng_action_destroy(tmp_action
);
609 lttng_condition_destroy(tmp_condition
);
610 lttng_trigger_destroy(tmp_trigger
);
616 static void test_subscription_twice(const char *session_name
,
617 const char *channel_name
,
618 const enum lttng_domain_type domain_type
)
621 enum lttng_notification_channel_status nc_status
;
623 struct lttng_action
*action
= NULL
;
624 struct lttng_notification_channel
*notification_channel
= NULL
;
625 struct lttng_trigger
*trigger
= NULL
;
627 struct lttng_condition
*condition
= NULL
;
629 ret
= register_buffer_usage_notify_trigger(session_name
, channel_name
,
630 domain_type
, BUFFER_USAGE_TYPE_LOW
, 0.99, &condition
,
633 fail("Setup error on trigger registration");
638 notification_channel
= lttng_notification_channel_create(
639 lttng_session_daemon_notification_endpoint
);
640 ok(notification_channel
, "Notification channel object creation");
641 if (!notification_channel
) {
645 /* Subscribe a valid condition. */
646 nc_status
= lttng_notification_channel_subscribe(
647 notification_channel
, condition
);
648 ok(nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_OK
,
649 "Subscribe to condition");
651 /* Subscribing again should fail. */
652 nc_status
= lttng_notification_channel_subscribe(
653 notification_channel
, condition
);
654 ok(nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_ALREADY_SUBSCRIBED
,
655 "Subscribe to a condition for which subscription was already done");
658 lttng_unregister_trigger(trigger
);
659 lttng_trigger_destroy(trigger
);
660 lttng_notification_channel_destroy(notification_channel
);
661 lttng_action_destroy(action
);
662 lttng_condition_destroy(condition
);
665 static void test_notification_channel(const char *session_name
,
666 const char *channel_name
,
667 const enum lttng_domain_type domain_type
,
671 enum lttng_notification_channel_status nc_status
;
673 struct lttng_action
*low_action
= NULL
;
674 struct lttng_action
*high_action
= NULL
;
675 struct lttng_notification
*notification
= NULL
;
676 struct lttng_notification_channel
*notification_channel
= NULL
;
677 struct lttng_trigger
*low_trigger
= NULL
;
678 struct lttng_trigger
*high_trigger
= NULL
;
680 struct lttng_condition
*low_condition
= NULL
;
681 struct lttng_condition
*high_condition
= NULL
;
683 const double low_ratio
= 0.0;
684 const double high_ratio
= 0.90;
686 ret
= register_buffer_usage_notify_trigger(session_name
, channel_name
,
687 domain_type
, BUFFER_USAGE_TYPE_LOW
, low_ratio
,
688 &low_condition
, &low_action
, &low_trigger
);
690 fail("Setup error on low trigger registration");
694 ret
= register_buffer_usage_notify_trigger(session_name
, channel_name
,
695 domain_type
, BUFFER_USAGE_TYPE_HIGH
, high_ratio
,
696 &high_condition
, &high_action
, &high_trigger
);
698 fail("Setup error on high trigger registration");
703 notification_channel
= lttng_notification_channel_create(
704 lttng_session_daemon_notification_endpoint
);
705 ok(notification_channel
, "Notification channel object creation");
706 if (!notification_channel
) {
710 /* Subscribe a valid low condition */
711 nc_status
= lttng_notification_channel_subscribe(
712 notification_channel
, low_condition
);
713 ok(nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_OK
,
714 "Subscribe to condition");
716 /* Subscribe a valid high condition */
717 nc_status
= lttng_notification_channel_subscribe(
718 notification_channel
, high_condition
);
719 ok(nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_OK
,
720 "Subscribe to condition");
722 resume_application();
724 /* Wait for notification to happen */
726 lttng_start_tracing(session_name
);
728 /* Wait for high notification */
730 nc_status
= lttng_notification_channel_get_next_notification(
731 notification_channel
, ¬ification
);
732 } while (nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_INTERRUPTED
);
733 ok(nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_OK
&& notification
&&
734 lttng_condition_get_type(lttng_notification_get_condition(
736 LTTNG_CONDITION_TYPE_BUFFER_USAGE_HIGH
,
737 "High notification received after intermediary communication");
738 lttng_notification_destroy(notification
);
741 suspend_application();
742 lttng_stop_tracing_no_wait(session_name
);
743 resume_consumer(argv
);
744 wait_data_pending(session_name
);
747 * Test that communication still work even if there is notification
748 * waiting for consumption.
751 nc_status
= lttng_notification_channel_unsubscribe(
752 notification_channel
, low_condition
);
753 ok(nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_OK
,
754 "Unsubscribe with pending notification");
756 nc_status
= lttng_notification_channel_subscribe(
757 notification_channel
, low_condition
);
758 ok(nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_OK
,
759 "Subscribe with pending notification");
762 nc_status
= lttng_notification_channel_get_next_notification(
763 notification_channel
, ¬ification
);
764 } while (nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_INTERRUPTED
);
765 ok(nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_OK
&& notification
&&
766 lttng_condition_get_type(lttng_notification_get_condition(
768 LTTNG_CONDITION_TYPE_BUFFER_USAGE_LOW
,
769 "Low notification received after intermediary communication");
770 lttng_notification_destroy(notification
);
773 /* Stop consumer to force a high notification */
775 resume_application();
776 lttng_start_tracing(session_name
);
779 nc_status
= lttng_notification_channel_get_next_notification(
780 notification_channel
, ¬ification
);
781 } while (nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_INTERRUPTED
);
782 ok(nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_OK
&& notification
&&
783 lttng_condition_get_type(lttng_notification_get_condition(
785 LTTNG_CONDITION_TYPE_BUFFER_USAGE_HIGH
,
786 "High notification received after intermediary communication");
787 lttng_notification_destroy(notification
);
790 suspend_application();
791 lttng_stop_tracing_no_wait(session_name
);
792 resume_consumer(argv
);
793 wait_data_pending(session_name
);
796 nc_status
= lttng_notification_channel_get_next_notification(
797 notification_channel
, ¬ification
);
798 } while (nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_INTERRUPTED
);
799 ok(nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_OK
&& notification
&&
800 lttng_condition_get_type(lttng_notification_get_condition(
802 LTTNG_CONDITION_TYPE_BUFFER_USAGE_LOW
,
803 "Low notification received after re-subscription");
804 lttng_notification_destroy(notification
);
808 resume_application();
809 /* Stop consumer to force a high notification */
810 lttng_start_tracing(session_name
);
813 nc_status
= lttng_notification_channel_get_next_notification(
814 notification_channel
, ¬ification
);
815 } while (nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_INTERRUPTED
);
816 ok(nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_OK
&& notification
&&
817 lttng_condition_get_type(lttng_notification_get_condition(
819 LTTNG_CONDITION_TYPE_BUFFER_USAGE_HIGH
,
820 "High notification");
821 lttng_notification_destroy(notification
);
824 suspend_application();
826 /* Resume consumer to allow event consumption */
827 lttng_stop_tracing_no_wait(session_name
);
828 resume_consumer(argv
);
829 wait_data_pending(session_name
);
831 nc_status
= lttng_notification_channel_unsubscribe(
832 notification_channel
, low_condition
);
833 ok(nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_OK
,
834 "Unsubscribe low condition with pending notification");
836 nc_status
= lttng_notification_channel_unsubscribe(
837 notification_channel
, high_condition
);
838 ok(nc_status
== LTTNG_NOTIFICATION_CHANNEL_STATUS_OK
,
839 "Unsubscribe high condition with pending notification");
842 lttng_notification_channel_destroy(notification_channel
);
843 lttng_trigger_destroy(low_trigger
);
844 lttng_trigger_destroy(high_trigger
);
845 lttng_action_destroy(low_action
);
846 lttng_action_destroy(high_action
);
847 lttng_condition_destroy(low_condition
);
848 lttng_condition_destroy(high_condition
);
851 int main(int argc
, const char *argv
[])
853 const char *session_name
= NULL
;
854 const char *channel_name
= NULL
;
855 const char *domain_type_string
= NULL
;
856 enum lttng_domain_type domain_type
= LTTNG_DOMAIN_NONE
;
858 plan_tests(NUM_TESTS
);
860 /* Argument 6 and upward are named pipe location for consumerd control */
861 named_pipe_args_start
= 6;
864 fail("Missing parameter for tests to run %d", argc
);
870 domain_type_string
= argv
[1];
871 session_name
= argv
[2];
872 channel_name
= argv
[3];
873 app_pid
= (pid_t
) atoi(argv
[4]);
874 app_state_file
= argv
[5];
876 if (!strcmp("LTTNG_DOMAIN_UST", domain_type_string
)) {
877 domain_type
= LTTNG_DOMAIN_UST
;
879 if (!strcmp("LTTNG_DOMAIN_KERNEL", domain_type_string
)) {
880 domain_type
= LTTNG_DOMAIN_KERNEL
;
882 if (domain_type
== LTTNG_DOMAIN_NONE
) {
883 fail("Unknown domain type");
888 * Test cases are responsible for resuming the app when needed and
889 * making sure it's suspended when returning.
891 suspend_application();
893 diag("Test trigger for domain %s with buffer_usage_low condition", domain_type_string
);
894 test_triggers_buffer_usage_condition(session_name
, channel_name
, domain_type
, LTTNG_CONDITION_TYPE_BUFFER_USAGE_LOW
);
895 diag("Test trigger for domain %s with buffer_usage_high condition", domain_type_string
);
896 test_triggers_buffer_usage_condition(session_name
, channel_name
, domain_type
, LTTNG_CONDITION_TYPE_BUFFER_USAGE_HIGH
);
898 /* Basic error path check. */
899 test_invalid_channel_subscription(domain_type
);
900 test_subscription_twice(session_name
, channel_name
, domain_type
);
902 diag("Test notification channel api for domain %s", domain_type_string
);
903 test_notification_channel(session_name
, channel_name
, domain_type
, argv
);
905 return exit_status();