4 * Unit tests for the notification API.
6 * Copyright (C) 2017 Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
8 * SPDX-License-Identifier: MIT
12 #include <common/payload-view.hpp>
13 #include <common/payload.hpp>
15 #include <lttng/action/action-internal.hpp>
16 #include <lttng/action/action.h>
17 #include <lttng/action/list-internal.hpp>
18 #include <lttng/action/notify.h>
19 #include <lttng/action/rate-policy-internal.hpp>
20 #include <lttng/action/rate-policy.h>
21 #include <lttng/action/rotate-session.h>
22 #include <lttng/action/snapshot-session.h>
23 #include <lttng/action/start-session.h>
24 #include <lttng/action/stop-session.h>
33 int lttng_opt_quiet
= 1;
34 int lttng_opt_verbose
;
39 static void test_action_notify()
42 enum lttng_action_status status
;
43 struct lttng_action
*notify_action
= nullptr, *notify_action_from_buffer
= nullptr;
44 struct lttng_rate_policy
*policy
= nullptr, *default_policy
;
45 struct lttng_payload payload
;
47 lttng_payload_init(&payload
);
50 policy
= lttng_rate_policy_every_n_create(100);
52 default_policy
= lttng_rate_policy_every_n_create(1);
54 LTTNG_ASSERT(policy
&& default_policy
);
56 notify_action
= lttng_action_notify_create();
57 ok(notify_action
, "Create notify action");
58 ok(lttng_action_get_type(notify_action
) == LTTNG_ACTION_TYPE_NOTIFY
,
59 "Action has type LTTNG_ACTION_TYPE_NOTIFY");
61 /* Validate the default policy for a notify action. */
63 const struct lttng_rate_policy
*cur_policy
= nullptr;
64 status
= lttng_action_notify_get_rate_policy(notify_action
, &cur_policy
);
65 ok(status
== LTTNG_ACTION_STATUS_OK
&&
66 lttng_rate_policy_is_equal(default_policy
, cur_policy
),
67 "Default policy is every n=1");
70 /* Set a custom policy. */
71 status
= lttng_action_notify_set_rate_policy(notify_action
, policy
);
72 ok(status
== LTTNG_ACTION_STATUS_OK
, "Set rate policy");
74 /* Validate the custom policy for a notify action. */
76 const struct lttng_rate_policy
*cur_policy
= nullptr;
77 status
= lttng_action_notify_get_rate_policy(notify_action
, &cur_policy
);
78 ok(status
== LTTNG_ACTION_STATUS_OK
&&
79 lttng_rate_policy_is_equal(policy
, cur_policy
),
80 "Notify action policy get");
83 ret
= lttng_action_serialize(notify_action
, &payload
);
84 ok(ret
== 0, "Action notify serialized");
87 struct lttng_payload_view view
= lttng_payload_view_from_payload(&payload
, 0, -1);
88 (void) lttng_action_create_from_payload(&view
, ¬ify_action_from_buffer
);
90 ok(notify_action_from_buffer
, "Notify action created from payload is non-null");
92 ok(lttng_action_is_equal(notify_action
, notify_action_from_buffer
),
93 "Serialized and de-serialized notify action are equal");
95 lttng_rate_policy_destroy(default_policy
);
96 lttng_rate_policy_destroy(policy
);
97 lttng_action_destroy(notify_action
);
98 lttng_action_destroy(notify_action_from_buffer
);
99 lttng_payload_reset(&payload
);
102 static void test_action_list(void)
105 struct lttng_action
*list_action
= NULL
, *list_action_from_buffer
= NULL
,
106 *stop_session_action
= NULL
, *notify_action
= NULL
,
107 *start_session_action
= NULL
;
108 struct lttng_payload payload
;
110 lttng_payload_init(&payload
);
112 list_action
= lttng_action_list_create();
113 ok(list_action
, "Create list action");
114 ok(lttng_action_get_type(list_action
) == LTTNG_ACTION_TYPE_LIST
,
115 "Action has type LTTNG_ACTION_TYPE_LIST");
117 start_session_action
= lttng_action_start_session_create();
118 (void) lttng_action_start_session_set_session_name(start_session_action
, "une-session");
120 stop_session_action
= lttng_action_stop_session_create();
121 (void) lttng_action_stop_session_set_session_name(stop_session_action
, "une-autre-session");
122 notify_action
= lttng_action_notify_create();
124 lttng_action_list_add_action(list_action
, start_session_action
);
125 lttng_action_list_add_action(list_action
, stop_session_action
);
126 lttng_action_list_add_action(list_action
, notify_action
);
128 ret
= lttng_action_serialize(list_action
, &payload
);
129 ok(ret
== 0, "Action list serialized");
132 struct lttng_payload_view view
= lttng_payload_view_from_payload(&payload
, 0, -1);
133 (void) lttng_action_create_from_payload(&view
, &list_action_from_buffer
);
135 ok(list_action_from_buffer
, "Notify action created from payload is non-null");
137 ok(lttng_action_is_equal(list_action
, list_action_from_buffer
),
138 "Serialized and de-serialized list action are equal");
141 for (auto action
: lttng::ctl::const_action_list_view(list_action
)) {
142 enum lttng_action_type inner_action_type
= lttng_action_get_type(action
);
143 switch (action_idx
) {
145 ok(inner_action_type
== LTTNG_ACTION_TYPE_START_SESSION
,
146 "First inner action of action list is `start-session` action");
149 ok(inner_action_type
== LTTNG_ACTION_TYPE_STOP_SESSION
,
150 "Second inner action of action list is `stop-session` action");
153 ok(inner_action_type
== LTTNG_ACTION_TYPE_NOTIFY
,
154 "Third inner action of action list is `notify` action");
161 for (auto action
: lttng::ctl::action_list_view(list_action
)) {
162 enum lttng_action_type inner_action_type
= lttng_action_get_type(action
);
163 switch (action_idx
) {
165 ok(inner_action_type
== LTTNG_ACTION_TYPE_START_SESSION
,
166 "First inner action of action list is `start-session` action");
169 ok(inner_action_type
== LTTNG_ACTION_TYPE_STOP_SESSION
,
170 "Second inner action of action list is `stop-session` action");
173 ok(inner_action_type
== LTTNG_ACTION_TYPE_NOTIFY
,
174 "Third inner action of action list is `notify` action");
180 lttng_action_destroy(list_action
);
181 lttng_action_destroy(list_action_from_buffer
);
182 lttng_action_destroy(start_session_action
);
183 lttng_action_destroy(stop_session_action
);
184 lttng_action_destroy(notify_action
);
185 lttng_payload_reset(&payload
);
188 static void test_action_rotate_session(void)
191 enum lttng_action_status status
;
192 struct lttng_action
*rotate_session_action
= nullptr,
193 *rotate_session_action_from_buffer
= nullptr;
194 struct lttng_rate_policy
*policy
= nullptr, *default_policy
;
195 struct lttng_payload payload
;
196 const char *session_name
= "my_session_name";
197 const char *get_session_name
;
199 lttng_payload_init(&payload
);
202 policy
= lttng_rate_policy_every_n_create(100);
203 /* For comparison. */
204 default_policy
= lttng_rate_policy_every_n_create(1);
206 LTTNG_ASSERT(policy
&& default_policy
);
208 rotate_session_action
= lttng_action_rotate_session_create();
209 ok(rotate_session_action
, "Create rotate_session action");
210 ok(lttng_action_get_type(rotate_session_action
) == LTTNG_ACTION_TYPE_ROTATE_SESSION
,
211 "Action has type LTTNG_ACTION_TYPE_ROTATE_SESSION");
213 /* Session name setter. */
214 status
= lttng_action_rotate_session_set_session_name(nullptr, nullptr);
215 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (NULL,NULL) expect invalid");
216 status
= lttng_action_rotate_session_set_session_name(rotate_session_action
, nullptr);
217 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (object,NULL) expect invalid");
218 status
= lttng_action_rotate_session_set_session_name(nullptr, session_name
);
219 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (NULL,object) expect invalid");
221 /* Set the session name */
222 status
= lttng_action_rotate_session_set_session_name(rotate_session_action
, session_name
);
223 ok(status
== LTTNG_ACTION_STATUS_OK
, "Set session name");
225 status
= lttng_action_rotate_session_get_session_name(rotate_session_action
,
227 ok(status
== LTTNG_ACTION_STATUS_OK
&& !strcmp(session_name
, get_session_name
),
228 "Get session name, expected `%s` got `%s`",
232 /* Validate the default policy for a rotate_session action. */
234 const struct lttng_rate_policy
*cur_policy
= nullptr;
235 status
= lttng_action_rotate_session_get_rate_policy(rotate_session_action
,
237 ok(status
== LTTNG_ACTION_STATUS_OK
&&
238 lttng_rate_policy_is_equal(default_policy
, cur_policy
),
239 "Default policy is every n=1");
242 /* Set a custom policy. */
243 status
= lttng_action_rotate_session_set_rate_policy(rotate_session_action
, policy
);
244 ok(status
== LTTNG_ACTION_STATUS_OK
, "Set rate policy");
246 /* Validate the custom policy for a rotate_session action. */
248 const struct lttng_rate_policy
*cur_policy
= nullptr;
249 status
= lttng_action_rotate_session_get_rate_policy(rotate_session_action
,
251 ok(status
== LTTNG_ACTION_STATUS_OK
&&
252 lttng_rate_policy_is_equal(policy
, cur_policy
),
253 "rotate_session action policy get");
257 ret
= lttng_action_serialize(rotate_session_action
, &payload
);
258 ok(ret
== 0, "Action rotate_session serialized");
261 struct lttng_payload_view view
= lttng_payload_view_from_payload(&payload
, 0, -1);
262 (void) lttng_action_create_from_payload(&view
, &rotate_session_action_from_buffer
);
264 ok(rotate_session_action_from_buffer
,
265 "rotate_session action created from payload is non-null");
267 ok(lttng_action_is_equal(rotate_session_action
, rotate_session_action_from_buffer
),
268 "Serialized and de-serialized rotate_session action are equal");
270 lttng_rate_policy_destroy(default_policy
);
271 lttng_rate_policy_destroy(policy
);
272 lttng_action_destroy(rotate_session_action
);
273 lttng_action_destroy(rotate_session_action_from_buffer
);
274 lttng_payload_reset(&payload
);
277 static void test_action_start_session()
280 enum lttng_action_status status
;
281 struct lttng_action
*start_session_action
= nullptr,
282 *start_session_action_from_buffer
= nullptr;
283 struct lttng_rate_policy
*policy
= nullptr, *default_policy
;
284 struct lttng_payload payload
;
285 const char *session_name
= "my_session_name";
286 const char *get_session_name
;
288 lttng_payload_init(&payload
);
291 policy
= lttng_rate_policy_every_n_create(100);
292 /* For comparison. */
293 default_policy
= lttng_rate_policy_every_n_create(1);
295 LTTNG_ASSERT(policy
&& default_policy
);
297 start_session_action
= lttng_action_start_session_create();
298 ok(start_session_action
, "Create start_session action");
299 ok(lttng_action_get_type(start_session_action
) == LTTNG_ACTION_TYPE_START_SESSION
,
300 "Action has type LTTNG_ACTION_TYPE_START_SESSION");
302 /* Session name setter. */
303 status
= lttng_action_start_session_set_session_name(nullptr, nullptr);
304 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (NULL,NULL) expect invalid");
305 status
= lttng_action_start_session_set_session_name(start_session_action
, nullptr);
306 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (object,NULL) expect invalid");
307 status
= lttng_action_start_session_set_session_name(nullptr, session_name
);
308 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (NULL,object) expect invalid");
310 /* Set the session name */
311 status
= lttng_action_start_session_set_session_name(start_session_action
, session_name
);
312 ok(status
== LTTNG_ACTION_STATUS_OK
, "Set session name");
314 status
= lttng_action_start_session_get_session_name(start_session_action
,
316 ok(status
== LTTNG_ACTION_STATUS_OK
&& !strcmp(session_name
, get_session_name
),
317 "Get session name, expected `%s` got `%s`",
321 /* Validate the default policy for a start_session action. */
323 const struct lttng_rate_policy
*cur_policy
= nullptr;
324 status
= lttng_action_start_session_get_rate_policy(start_session_action
,
326 ok(status
== LTTNG_ACTION_STATUS_OK
&&
327 lttng_rate_policy_is_equal(default_policy
, cur_policy
),
328 "Default policy is every n=1");
331 /* Set a custom policy. */
332 status
= lttng_action_start_session_set_rate_policy(start_session_action
, policy
);
333 ok(status
== LTTNG_ACTION_STATUS_OK
, "Set rate policy");
335 /* Validate the custom policy for a start_session action. */
337 const struct lttng_rate_policy
*cur_policy
= nullptr;
338 status
= lttng_action_start_session_get_rate_policy(start_session_action
,
340 ok(status
== LTTNG_ACTION_STATUS_OK
&&
341 lttng_rate_policy_is_equal(policy
, cur_policy
),
342 "start_session action policy get");
346 ret
= lttng_action_serialize(start_session_action
, &payload
);
347 ok(ret
== 0, "Action start_session serialized");
350 struct lttng_payload_view view
= lttng_payload_view_from_payload(&payload
, 0, -1);
351 (void) lttng_action_create_from_payload(&view
, &start_session_action_from_buffer
);
353 ok(start_session_action_from_buffer
,
354 "start_session action created from payload is non-null");
356 ok(lttng_action_is_equal(start_session_action
, start_session_action_from_buffer
),
357 "Serialized and de-serialized start_session action are equal");
359 lttng_rate_policy_destroy(default_policy
);
360 lttng_rate_policy_destroy(policy
);
361 lttng_action_destroy(start_session_action
);
362 lttng_action_destroy(start_session_action_from_buffer
);
363 lttng_payload_reset(&payload
);
366 static void test_action_stop_session()
369 enum lttng_action_status status
;
370 struct lttng_action
*stop_session_action
= nullptr,
371 *stop_session_action_from_buffer
= nullptr;
372 struct lttng_rate_policy
*policy
= nullptr, *default_policy
;
373 struct lttng_payload payload
;
374 const char *session_name
= "my_session_name";
375 const char *get_session_name
;
377 lttng_payload_init(&payload
);
380 policy
= lttng_rate_policy_every_n_create(100);
381 /* For comparison. */
382 default_policy
= lttng_rate_policy_every_n_create(1);
384 LTTNG_ASSERT(policy
&& default_policy
);
386 stop_session_action
= lttng_action_stop_session_create();
387 ok(stop_session_action
, "Create stop_session action");
388 ok(lttng_action_get_type(stop_session_action
) == LTTNG_ACTION_TYPE_STOP_SESSION
,
389 "Action has type LTTNG_ACTION_TYPE_STOP_SESSION");
391 /* Session name setter. */
392 status
= lttng_action_stop_session_set_session_name(nullptr, nullptr);
393 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (NULL,NULL) expect invalid");
394 status
= lttng_action_stop_session_set_session_name(stop_session_action
, nullptr);
395 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (object,NULL) expect invalid");
396 status
= lttng_action_stop_session_set_session_name(nullptr, session_name
);
397 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (NULL,object) expect invalid");
399 /* Set the session name */
400 status
= lttng_action_stop_session_set_session_name(stop_session_action
, session_name
);
401 ok(status
== LTTNG_ACTION_STATUS_OK
, "Set session name");
403 status
= lttng_action_stop_session_get_session_name(stop_session_action
, &get_session_name
);
404 ok(status
== LTTNG_ACTION_STATUS_OK
&& !strcmp(session_name
, get_session_name
),
405 "Get session name, expected `%s` got `%s`",
409 /* Validate the default policy for a stop_session action. */
411 const struct lttng_rate_policy
*cur_policy
= nullptr;
413 lttng_action_stop_session_get_rate_policy(stop_session_action
, &cur_policy
);
414 ok(status
== LTTNG_ACTION_STATUS_OK
&&
415 lttng_rate_policy_is_equal(default_policy
, cur_policy
),
416 "Default policy is every n=1");
419 /* Set a custom policy. */
420 status
= lttng_action_stop_session_set_rate_policy(stop_session_action
, policy
);
421 ok(status
== LTTNG_ACTION_STATUS_OK
, "Set rate policy");
423 /* Validate the custom policy for a stop_session action. */
425 const struct lttng_rate_policy
*cur_policy
= nullptr;
427 lttng_action_stop_session_get_rate_policy(stop_session_action
, &cur_policy
);
428 ok(status
== LTTNG_ACTION_STATUS_OK
&&
429 lttng_rate_policy_is_equal(policy
, cur_policy
),
430 "stop_session action policy get");
434 ret
= lttng_action_serialize(stop_session_action
, &payload
);
435 ok(ret
== 0, "Action stop_session serialized");
438 struct lttng_payload_view view
= lttng_payload_view_from_payload(&payload
, 0, -1);
439 (void) lttng_action_create_from_payload(&view
, &stop_session_action_from_buffer
);
441 ok(stop_session_action_from_buffer
, "stop_session action created from payload is non-null");
443 ok(lttng_action_is_equal(stop_session_action
, stop_session_action_from_buffer
),
444 "Serialized and de-serialized stop_session action are equal");
446 lttng_rate_policy_destroy(default_policy
);
447 lttng_rate_policy_destroy(policy
);
448 lttng_action_destroy(stop_session_action
);
449 lttng_action_destroy(stop_session_action_from_buffer
);
450 lttng_payload_reset(&payload
);
453 static void test_action_snapshot_session()
456 enum lttng_action_status status
;
457 struct lttng_action
*snapshot_session_action
= nullptr,
458 *snapshot_session_action_from_buffer
= nullptr;
459 struct lttng_rate_policy
*policy
= nullptr, *default_policy
;
460 struct lttng_payload payload
;
461 const char *session_name
= "my_session_name";
462 const char *get_session_name
;
464 lttng_payload_init(&payload
);
467 policy
= lttng_rate_policy_every_n_create(100);
468 /* For comparison. */
469 default_policy
= lttng_rate_policy_every_n_create(1);
471 LTTNG_ASSERT(policy
&& default_policy
);
473 snapshot_session_action
= lttng_action_snapshot_session_create();
474 ok(snapshot_session_action
, "Create snapshot_session action");
475 ok(lttng_action_get_type(snapshot_session_action
) == LTTNG_ACTION_TYPE_SNAPSHOT_SESSION
,
476 "Action has type LTTNG_ACTION_TYPE_SNAPSHOT_SESSION");
478 /* Session name setter. */
479 status
= lttng_action_snapshot_session_set_session_name(nullptr, nullptr);
480 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (NULL,NULL) expect invalid");
481 status
= lttng_action_snapshot_session_set_session_name(snapshot_session_action
, nullptr);
482 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (object,NULL) expect invalid");
483 status
= lttng_action_snapshot_session_set_session_name(nullptr, session_name
);
484 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (NULL,object) expect invalid");
486 /* Set the session name */
487 status
= lttng_action_snapshot_session_set_session_name(snapshot_session_action
,
489 ok(status
== LTTNG_ACTION_STATUS_OK
, "Set session name");
491 status
= lttng_action_snapshot_session_get_session_name(snapshot_session_action
,
493 ok(status
== LTTNG_ACTION_STATUS_OK
&& !strcmp(session_name
, get_session_name
),
494 "Get session name, expected `%s` got `%s`",
498 /* Validate the default policy for a snapshot_session action. */
500 const struct lttng_rate_policy
*cur_policy
= nullptr;
501 status
= lttng_action_snapshot_session_get_rate_policy(snapshot_session_action
,
503 ok(status
== LTTNG_ACTION_STATUS_OK
&&
504 lttng_rate_policy_is_equal(default_policy
, cur_policy
),
505 "Default policy is every n=1");
508 /* Set a custom policy. */
509 status
= lttng_action_snapshot_session_set_rate_policy(snapshot_session_action
, policy
);
510 ok(status
== LTTNG_ACTION_STATUS_OK
, "Set rate policy");
512 /* Validate the custom policy for a snapshot_session action. */
514 const struct lttng_rate_policy
*cur_policy
= nullptr;
515 status
= lttng_action_snapshot_session_get_rate_policy(snapshot_session_action
,
517 ok(status
== LTTNG_ACTION_STATUS_OK
&&
518 lttng_rate_policy_is_equal(policy
, cur_policy
),
519 "snapshot_session action policy get");
523 ret
= lttng_action_serialize(snapshot_session_action
, &payload
);
524 ok(ret
== 0, "Action snapshot_session serialized");
527 struct lttng_payload_view view
= lttng_payload_view_from_payload(&payload
, 0, -1);
528 (void) lttng_action_create_from_payload(&view
,
529 &snapshot_session_action_from_buffer
);
531 ok(snapshot_session_action_from_buffer
,
532 "snapshot_session action created from payload is non-null");
534 ok(lttng_action_is_equal(snapshot_session_action
, snapshot_session_action_from_buffer
),
535 "Serialized and de-serialized snapshot_session action are equal");
537 lttng_rate_policy_destroy(default_policy
);
538 lttng_rate_policy_destroy(policy
);
539 lttng_action_destroy(snapshot_session_action
);
540 lttng_action_destroy(snapshot_session_action_from_buffer
);
541 lttng_payload_reset(&payload
);
546 plan_tests(NUM_TESTS
);
547 test_action_notify();
549 test_action_rotate_session();
550 test_action_start_session();
551 test_action_stop_session();
552 test_action_snapshot_session();
553 return exit_status();