Test: kernel testing for notification
[lttng-tools.git] / tests / regression / tools / notification / notification.c
index 5de09e2016e1ed33947780d11ab344d78fd76780..6c52bed01d864f8f40e574cd266dd0e5648584f8 100644 (file)
@@ -35,6 +35,9 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
+#include <signal.h>
+#include <errno.h>
+#include <poll.h>
 
 #include <lttng/action/action.h>
 #include <lttng/action/notify.h>
 #include <tap/tap.h>
 
 #define NUM_TESTS 104
+
 int nb_args = 0;
 int named_pipe_args_start = 0;
+pid_t app_pid = -1;
+const char *app_state_file = NULL;
+
+static
+void wait_on_file(const char *path, bool file_exist)
+{
+       if (!path) {
+               return;
+       }
+       for (;;) {
+               int ret;
+               struct stat buf;
+
+               ret = stat(path, &buf);
+               if (ret == -1 && errno == ENOENT) {
+                       if (file_exist) {
+                               (void) poll(NULL, 0, 10);       /* 10 ms delay */
+                               continue;                       /* retry */
+                       }
+                       break; /* File does not exist */
+               }
+               if (ret) {
+                       perror("stat");
+                       exit(EXIT_FAILURE);
+               }
+               break;  /* found */
+       }
+}
 
 int write_pipe(const char *path, uint8_t data)
 {
@@ -103,6 +135,64 @@ int resume_consumer(const char **argv)
        return ret;
 }
 
+int suspend_application()
+{
+       int ret;
+       struct stat buf;
+
+       if (!stat(app_state_file, &buf)) {
+               fail("App is already in a suspended state.");
+               ret = -1;
+               goto error;
+       }
+
+       /*
+        * Send SIGUSR1 to application instructing it to bypass tracepoint.
+        */
+       ret = kill(app_pid, SIGUSR1);
+       if (ret) {
+               fail("SIGUSR1 failed. errno %d", errno);
+               ret = -1;
+               goto error;
+       }
+
+       wait_on_file(app_state_file, true);
+
+error:
+       return ret;
+
+}
+
+int resume_application()
+{
+       int ret;
+       struct stat buf;
+
+       ret = stat(app_state_file, &buf);
+       if (ret == -1 && errno == ENOENT) {
+               fail("State file does not exist");
+               goto error;
+       }
+       if (ret) {
+               perror("stat");
+               goto error;
+       }
+
+       ret = kill(app_pid, SIGUSR1);
+       if (ret) {
+               fail("SIGUSR1 failed. errno %d", errno);
+               ret = -1;
+               goto error;
+       }
+
+       wait_on_file(app_state_file, false);
+
+error:
+       return ret;
+
+}
+
+
 void test_triggers_buffer_usage_condition(const char *session_name,
                const char *channel_name,
                enum lttng_domain_type domain_type,
@@ -284,7 +374,7 @@ end:
        lttng_action_destroy(action);
 }
 
-void test_notification_channel(const char *session_name, const char *channel_name, enum lttng_domain_type domain_type, const char **argv)
+void test_notification_channel(const char *session_name, const char *channel_name, const enum lttng_domain_type domain_type, const char **argv)
 {
        int ret = 0;
        enum lttng_condition_status condition_status;
@@ -497,6 +587,7 @@ void test_notification_channel(const char *session_name, const char *channel_nam
        lttng_notification_destroy(notification);
        notification = NULL;
 
+       suspend_application();
        resume_consumer(argv);
        lttng_stop_tracing(session_name);
 
@@ -520,6 +611,7 @@ void test_notification_channel(const char *session_name, const char *channel_nam
        notification = NULL;
 
        /* Stop consumer to force a high notification */
+       resume_application();
        lttng_start_tracing(session_name);
        stop_consumer(argv);
 
@@ -530,6 +622,7 @@ void test_notification_channel(const char *session_name, const char *channel_nam
        lttng_notification_destroy(notification);
        notification = NULL;
 
+       suspend_application();
        /* Resume consumer to allow event consumption */
        resume_consumer(argv);
        lttng_stop_tracing(session_name);
@@ -541,6 +634,7 @@ void test_notification_channel(const char *session_name, const char *channel_nam
        lttng_notification_destroy(notification);
        notification = NULL;
 
+       resume_application();
        /* Stop consumer to force a high notification */
        lttng_start_tracing(session_name);
        stop_consumer(argv);
@@ -580,19 +674,21 @@ int main(int argc, const char *argv[])
 
        plan_tests(NUM_TESTS);
 
-       /* Argument 4 and upward are named pipe location for consumerd control */
-       named_pipe_args_start = 4;
+       /* Argument 6 and upward are named pipe location for consumerd control */
+       named_pipe_args_start = 6;
 
-       if (argc < 5) {
+       if (argc < 7) {
                fail("Missing parameter for tests to run %d", argc);
                goto error;
        }
 
        nb_args = argc;
 
-       session_name = argv[1];
-       channel_name = argv[2];
-       domain_type_string= argv[3];
+       domain_type_string = argv[1];
+       session_name = argv[2];
+       channel_name = argv[3];
+       app_pid = (pid_t) atoi(argv[4]);
+       app_state_file = argv[5];
 
        if (!strcmp("LTTNG_DOMAIN_UST", domain_type_string)) {
                domain_type = LTTNG_DOMAIN_UST;
This page took 0.026378 seconds and 5 git commands to generate.