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/error.hpp>
13 #include <common/payload-view.hpp>
14 #include <common/payload.hpp>
16 #include <lttng/action/action-internal.hpp>
17 #include <lttng/action/action.h>
18 #include <lttng/action/list-internal.hpp>
19 #include <lttng/action/notify.h>
20 #include <lttng/action/rate-policy-internal.hpp>
21 #include <lttng/action/rate-policy.h>
22 #include <lttng/action/rotate-session.h>
23 #include <lttng/action/snapshot-session.h>
24 #include <lttng/action/start-session.h>
25 #include <lttng/action/stop-session.h>
34 int lttng_opt_quiet
= 1;
35 int lttng_opt_verbose
;
40 static void test_action_notify()
43 enum lttng_action_status status
;
44 struct lttng_action
*notify_action
= nullptr, *notify_action_from_buffer
= nullptr;
45 struct lttng_rate_policy
*policy
= nullptr, *default_policy
;
46 struct lttng_payload payload
;
48 lttng_payload_init(&payload
);
51 policy
= lttng_rate_policy_every_n_create(100);
53 default_policy
= lttng_rate_policy_every_n_create(1);
55 LTTNG_ASSERT(policy
&& default_policy
);
57 notify_action
= lttng_action_notify_create();
58 ok(notify_action
, "Create notify action");
59 ok(lttng_action_get_type(notify_action
) == LTTNG_ACTION_TYPE_NOTIFY
,
60 "Action has type LTTNG_ACTION_TYPE_NOTIFY");
62 /* Validate the default policy for a notify action. */
64 const struct lttng_rate_policy
*cur_policy
= nullptr;
65 status
= lttng_action_notify_get_rate_policy(notify_action
, &cur_policy
);
66 ok(status
== LTTNG_ACTION_STATUS_OK
&&
67 lttng_rate_policy_is_equal(default_policy
, cur_policy
),
68 "Default policy is every n=1");
71 /* Set a custom policy. */
72 status
= lttng_action_notify_set_rate_policy(notify_action
, policy
);
73 ok(status
== LTTNG_ACTION_STATUS_OK
, "Set rate policy");
75 /* Validate the custom policy for a notify action. */
77 const struct lttng_rate_policy
*cur_policy
= nullptr;
78 status
= lttng_action_notify_get_rate_policy(notify_action
, &cur_policy
);
79 ok(status
== LTTNG_ACTION_STATUS_OK
&&
80 lttng_rate_policy_is_equal(policy
, cur_policy
),
81 "Notify action policy get");
84 ret
= lttng_action_serialize(notify_action
, &payload
);
85 ok(ret
== 0, "Action notify serialized");
88 struct lttng_payload_view view
= lttng_payload_view_from_payload(&payload
, 0, -1);
89 (void) lttng_action_create_from_payload(&view
, ¬ify_action_from_buffer
);
91 ok(notify_action_from_buffer
, "Notify action created from payload is non-null");
93 ok(lttng_action_is_equal(notify_action
, notify_action_from_buffer
),
94 "Serialized and de-serialized notify action are equal");
96 lttng_rate_policy_destroy(default_policy
);
97 lttng_rate_policy_destroy(policy
);
98 lttng_action_destroy(notify_action
);
99 lttng_action_destroy(notify_action_from_buffer
);
100 lttng_payload_reset(&payload
);
103 static void test_action_list(void)
106 struct lttng_action
*list_action
= NULL
, *list_action_from_buffer
= NULL
,
107 *stop_session_action
= NULL
, *notify_action
= NULL
,
108 *start_session_action
= NULL
;
109 struct lttng_payload payload
;
111 lttng_payload_init(&payload
);
113 list_action
= lttng_action_list_create();
114 ok(list_action
, "Create list action");
115 ok(lttng_action_get_type(list_action
) == LTTNG_ACTION_TYPE_LIST
,
116 "Action has type LTTNG_ACTION_TYPE_LIST");
118 start_session_action
= lttng_action_start_session_create();
119 (void) lttng_action_start_session_set_session_name(start_session_action
, "une-session");
121 stop_session_action
= lttng_action_stop_session_create();
122 (void) lttng_action_stop_session_set_session_name(stop_session_action
, "une-autre-session");
123 notify_action
= lttng_action_notify_create();
125 lttng_action_list_add_action(list_action
, start_session_action
);
126 lttng_action_list_add_action(list_action
, stop_session_action
);
127 lttng_action_list_add_action(list_action
, notify_action
);
129 ret
= lttng_action_serialize(list_action
, &payload
);
130 ok(ret
== 0, "Action list serialized");
133 struct lttng_payload_view view
= lttng_payload_view_from_payload(&payload
, 0, -1);
134 (void) lttng_action_create_from_payload(&view
, &list_action_from_buffer
);
136 ok(list_action_from_buffer
, "Notify action created from payload is non-null");
138 ok(lttng_action_is_equal(list_action
, list_action_from_buffer
),
139 "Serialized and de-serialized list action are equal");
142 for (auto action
: lttng::ctl::const_action_list_view(list_action
)) {
143 enum lttng_action_type inner_action_type
= lttng_action_get_type(action
);
144 switch (action_idx
) {
146 ok(inner_action_type
== LTTNG_ACTION_TYPE_START_SESSION
,
147 "First inner action of action list is `start-session` action");
150 ok(inner_action_type
== LTTNG_ACTION_TYPE_STOP_SESSION
,
151 "Second inner action of action list is `stop-session` action");
154 ok(inner_action_type
== LTTNG_ACTION_TYPE_NOTIFY
,
155 "Third inner action of action list is `notify` action");
162 for (auto action
: lttng::ctl::action_list_view(list_action
)) {
163 enum lttng_action_type inner_action_type
= lttng_action_get_type(action
);
164 switch (action_idx
) {
166 ok(inner_action_type
== LTTNG_ACTION_TYPE_START_SESSION
,
167 "First inner action of action list is `start-session` action");
170 ok(inner_action_type
== LTTNG_ACTION_TYPE_STOP_SESSION
,
171 "Second inner action of action list is `stop-session` action");
174 ok(inner_action_type
== LTTNG_ACTION_TYPE_NOTIFY
,
175 "Third inner action of action list is `notify` action");
181 lttng_action_destroy(list_action
);
182 lttng_action_destroy(list_action_from_buffer
);
183 lttng_action_destroy(start_session_action
);
184 lttng_action_destroy(stop_session_action
);
185 lttng_action_destroy(notify_action
);
186 lttng_payload_reset(&payload
);
189 static void test_action_rotate_session(void)
192 enum lttng_action_status status
;
193 struct lttng_action
*rotate_session_action
= nullptr,
194 *rotate_session_action_from_buffer
= nullptr;
195 struct lttng_rate_policy
*policy
= nullptr, *default_policy
;
196 struct lttng_payload payload
;
197 const char *session_name
= "my_session_name";
198 const char *get_session_name
;
200 lttng_payload_init(&payload
);
203 policy
= lttng_rate_policy_every_n_create(100);
204 /* For comparison. */
205 default_policy
= lttng_rate_policy_every_n_create(1);
207 LTTNG_ASSERT(policy
&& default_policy
);
209 rotate_session_action
= lttng_action_rotate_session_create();
210 ok(rotate_session_action
, "Create rotate_session action");
211 ok(lttng_action_get_type(rotate_session_action
) == LTTNG_ACTION_TYPE_ROTATE_SESSION
,
212 "Action has type LTTNG_ACTION_TYPE_ROTATE_SESSION");
214 /* Session name setter. */
215 status
= lttng_action_rotate_session_set_session_name(nullptr, nullptr);
216 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (NULL,NULL) expect invalid");
217 status
= lttng_action_rotate_session_set_session_name(rotate_session_action
, nullptr);
218 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (object,NULL) expect invalid");
219 status
= lttng_action_rotate_session_set_session_name(nullptr, session_name
);
220 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (NULL,object) expect invalid");
222 /* Set the session name */
223 status
= lttng_action_rotate_session_set_session_name(rotate_session_action
, session_name
);
224 ok(status
== LTTNG_ACTION_STATUS_OK
, "Set session name");
226 status
= lttng_action_rotate_session_get_session_name(rotate_session_action
,
228 ok(status
== LTTNG_ACTION_STATUS_OK
&& !strcmp(session_name
, get_session_name
),
229 "Get session name, expected `%s` got `%s`",
233 /* Validate the default policy for a rotate_session action. */
235 const struct lttng_rate_policy
*cur_policy
= nullptr;
236 status
= lttng_action_rotate_session_get_rate_policy(rotate_session_action
,
238 ok(status
== LTTNG_ACTION_STATUS_OK
&&
239 lttng_rate_policy_is_equal(default_policy
, cur_policy
),
240 "Default policy is every n=1");
243 /* Set a custom policy. */
244 status
= lttng_action_rotate_session_set_rate_policy(rotate_session_action
, policy
);
245 ok(status
== LTTNG_ACTION_STATUS_OK
, "Set rate policy");
247 /* Validate the custom policy for a rotate_session action. */
249 const struct lttng_rate_policy
*cur_policy
= nullptr;
250 status
= lttng_action_rotate_session_get_rate_policy(rotate_session_action
,
252 ok(status
== LTTNG_ACTION_STATUS_OK
&&
253 lttng_rate_policy_is_equal(policy
, cur_policy
),
254 "rotate_session action policy get");
258 ret
= lttng_action_serialize(rotate_session_action
, &payload
);
259 ok(ret
== 0, "Action rotate_session serialized");
262 struct lttng_payload_view view
= lttng_payload_view_from_payload(&payload
, 0, -1);
263 (void) lttng_action_create_from_payload(&view
, &rotate_session_action_from_buffer
);
265 ok(rotate_session_action_from_buffer
,
266 "rotate_session action created from payload is non-null");
268 ok(lttng_action_is_equal(rotate_session_action
, rotate_session_action_from_buffer
),
269 "Serialized and de-serialized rotate_session action are equal");
271 lttng_rate_policy_destroy(default_policy
);
272 lttng_rate_policy_destroy(policy
);
273 lttng_action_destroy(rotate_session_action
);
274 lttng_action_destroy(rotate_session_action_from_buffer
);
275 lttng_payload_reset(&payload
);
278 static void test_action_start_session()
281 enum lttng_action_status status
;
282 struct lttng_action
*start_session_action
= nullptr,
283 *start_session_action_from_buffer
= nullptr;
284 struct lttng_rate_policy
*policy
= nullptr, *default_policy
;
285 struct lttng_payload payload
;
286 const char *session_name
= "my_session_name";
287 const char *get_session_name
;
289 lttng_payload_init(&payload
);
292 policy
= lttng_rate_policy_every_n_create(100);
293 /* For comparison. */
294 default_policy
= lttng_rate_policy_every_n_create(1);
296 LTTNG_ASSERT(policy
&& default_policy
);
298 start_session_action
= lttng_action_start_session_create();
299 ok(start_session_action
, "Create start_session action");
300 ok(lttng_action_get_type(start_session_action
) == LTTNG_ACTION_TYPE_START_SESSION
,
301 "Action has type LTTNG_ACTION_TYPE_START_SESSION");
303 /* Session name setter. */
304 status
= lttng_action_start_session_set_session_name(nullptr, nullptr);
305 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (NULL,NULL) expect invalid");
306 status
= lttng_action_start_session_set_session_name(start_session_action
, nullptr);
307 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (object,NULL) expect invalid");
308 status
= lttng_action_start_session_set_session_name(nullptr, session_name
);
309 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (NULL,object) expect invalid");
311 /* Set the session name */
312 status
= lttng_action_start_session_set_session_name(start_session_action
, session_name
);
313 ok(status
== LTTNG_ACTION_STATUS_OK
, "Set session name");
315 status
= lttng_action_start_session_get_session_name(start_session_action
,
317 ok(status
== LTTNG_ACTION_STATUS_OK
&& !strcmp(session_name
, get_session_name
),
318 "Get session name, expected `%s` got `%s`",
322 /* Validate the default policy for a start_session action. */
324 const struct lttng_rate_policy
*cur_policy
= nullptr;
325 status
= lttng_action_start_session_get_rate_policy(start_session_action
,
327 ok(status
== LTTNG_ACTION_STATUS_OK
&&
328 lttng_rate_policy_is_equal(default_policy
, cur_policy
),
329 "Default policy is every n=1");
332 /* Set a custom policy. */
333 status
= lttng_action_start_session_set_rate_policy(start_session_action
, policy
);
334 ok(status
== LTTNG_ACTION_STATUS_OK
, "Set rate policy");
336 /* Validate the custom policy for a start_session action. */
338 const struct lttng_rate_policy
*cur_policy
= nullptr;
339 status
= lttng_action_start_session_get_rate_policy(start_session_action
,
341 ok(status
== LTTNG_ACTION_STATUS_OK
&&
342 lttng_rate_policy_is_equal(policy
, cur_policy
),
343 "start_session action policy get");
347 ret
= lttng_action_serialize(start_session_action
, &payload
);
348 ok(ret
== 0, "Action start_session serialized");
351 struct lttng_payload_view view
= lttng_payload_view_from_payload(&payload
, 0, -1);
352 (void) lttng_action_create_from_payload(&view
, &start_session_action_from_buffer
);
354 ok(start_session_action_from_buffer
,
355 "start_session action created from payload is non-null");
357 ok(lttng_action_is_equal(start_session_action
, start_session_action_from_buffer
),
358 "Serialized and de-serialized start_session action are equal");
360 lttng_rate_policy_destroy(default_policy
);
361 lttng_rate_policy_destroy(policy
);
362 lttng_action_destroy(start_session_action
);
363 lttng_action_destroy(start_session_action_from_buffer
);
364 lttng_payload_reset(&payload
);
367 static void test_action_stop_session()
370 enum lttng_action_status status
;
371 struct lttng_action
*stop_session_action
= nullptr,
372 *stop_session_action_from_buffer
= nullptr;
373 struct lttng_rate_policy
*policy
= nullptr, *default_policy
;
374 struct lttng_payload payload
;
375 const char *session_name
= "my_session_name";
376 const char *get_session_name
;
378 lttng_payload_init(&payload
);
381 policy
= lttng_rate_policy_every_n_create(100);
382 /* For comparison. */
383 default_policy
= lttng_rate_policy_every_n_create(1);
385 LTTNG_ASSERT(policy
&& default_policy
);
387 stop_session_action
= lttng_action_stop_session_create();
388 ok(stop_session_action
, "Create stop_session action");
389 ok(lttng_action_get_type(stop_session_action
) == LTTNG_ACTION_TYPE_STOP_SESSION
,
390 "Action has type LTTNG_ACTION_TYPE_STOP_SESSION");
392 /* Session name setter. */
393 status
= lttng_action_stop_session_set_session_name(nullptr, nullptr);
394 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (NULL,NULL) expect invalid");
395 status
= lttng_action_stop_session_set_session_name(stop_session_action
, nullptr);
396 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (object,NULL) expect invalid");
397 status
= lttng_action_stop_session_set_session_name(nullptr, session_name
);
398 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (NULL,object) expect invalid");
400 /* Set the session name */
401 status
= lttng_action_stop_session_set_session_name(stop_session_action
, session_name
);
402 ok(status
== LTTNG_ACTION_STATUS_OK
, "Set session name");
404 status
= lttng_action_stop_session_get_session_name(stop_session_action
, &get_session_name
);
405 ok(status
== LTTNG_ACTION_STATUS_OK
&& !strcmp(session_name
, get_session_name
),
406 "Get session name, expected `%s` got `%s`",
410 /* Validate the default policy for a stop_session action. */
412 const struct lttng_rate_policy
*cur_policy
= nullptr;
414 lttng_action_stop_session_get_rate_policy(stop_session_action
, &cur_policy
);
415 ok(status
== LTTNG_ACTION_STATUS_OK
&&
416 lttng_rate_policy_is_equal(default_policy
, cur_policy
),
417 "Default policy is every n=1");
420 /* Set a custom policy. */
421 status
= lttng_action_stop_session_set_rate_policy(stop_session_action
, policy
);
422 ok(status
== LTTNG_ACTION_STATUS_OK
, "Set rate policy");
424 /* Validate the custom policy for a stop_session action. */
426 const struct lttng_rate_policy
*cur_policy
= nullptr;
428 lttng_action_stop_session_get_rate_policy(stop_session_action
, &cur_policy
);
429 ok(status
== LTTNG_ACTION_STATUS_OK
&&
430 lttng_rate_policy_is_equal(policy
, cur_policy
),
431 "stop_session action policy get");
435 ret
= lttng_action_serialize(stop_session_action
, &payload
);
436 ok(ret
== 0, "Action stop_session serialized");
439 struct lttng_payload_view view
= lttng_payload_view_from_payload(&payload
, 0, -1);
440 (void) lttng_action_create_from_payload(&view
, &stop_session_action_from_buffer
);
442 ok(stop_session_action_from_buffer
, "stop_session action created from payload is non-null");
444 ok(lttng_action_is_equal(stop_session_action
, stop_session_action_from_buffer
),
445 "Serialized and de-serialized stop_session action are equal");
447 lttng_rate_policy_destroy(default_policy
);
448 lttng_rate_policy_destroy(policy
);
449 lttng_action_destroy(stop_session_action
);
450 lttng_action_destroy(stop_session_action_from_buffer
);
451 lttng_payload_reset(&payload
);
454 static void test_action_snapshot_session()
457 enum lttng_action_status status
;
458 struct lttng_action
*snapshot_session_action
= nullptr,
459 *snapshot_session_action_from_buffer
= nullptr;
460 struct lttng_rate_policy
*policy
= nullptr, *default_policy
;
461 struct lttng_payload payload
;
462 const char *session_name
= "my_session_name";
463 const char *get_session_name
;
465 lttng_payload_init(&payload
);
468 policy
= lttng_rate_policy_every_n_create(100);
469 /* For comparison. */
470 default_policy
= lttng_rate_policy_every_n_create(1);
472 LTTNG_ASSERT(policy
&& default_policy
);
474 snapshot_session_action
= lttng_action_snapshot_session_create();
475 ok(snapshot_session_action
, "Create snapshot_session action");
476 ok(lttng_action_get_type(snapshot_session_action
) == LTTNG_ACTION_TYPE_SNAPSHOT_SESSION
,
477 "Action has type LTTNG_ACTION_TYPE_SNAPSHOT_SESSION");
479 /* Session name setter. */
480 status
= lttng_action_snapshot_session_set_session_name(nullptr, nullptr);
481 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (NULL,NULL) expect invalid");
482 status
= lttng_action_snapshot_session_set_session_name(snapshot_session_action
, nullptr);
483 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (object,NULL) expect invalid");
484 status
= lttng_action_snapshot_session_set_session_name(nullptr, session_name
);
485 ok(status
== LTTNG_ACTION_STATUS_INVALID
, "Set session name (NULL,object) expect invalid");
487 /* Set the session name */
488 status
= lttng_action_snapshot_session_set_session_name(snapshot_session_action
,
490 ok(status
== LTTNG_ACTION_STATUS_OK
, "Set session name");
492 status
= lttng_action_snapshot_session_get_session_name(snapshot_session_action
,
494 ok(status
== LTTNG_ACTION_STATUS_OK
&& !strcmp(session_name
, get_session_name
),
495 "Get session name, expected `%s` got `%s`",
499 /* Validate the default policy for a snapshot_session action. */
501 const struct lttng_rate_policy
*cur_policy
= nullptr;
502 status
= lttng_action_snapshot_session_get_rate_policy(snapshot_session_action
,
504 ok(status
== LTTNG_ACTION_STATUS_OK
&&
505 lttng_rate_policy_is_equal(default_policy
, cur_policy
),
506 "Default policy is every n=1");
509 /* Set a custom policy. */
510 status
= lttng_action_snapshot_session_set_rate_policy(snapshot_session_action
, policy
);
511 ok(status
== LTTNG_ACTION_STATUS_OK
, "Set rate policy");
513 /* Validate the custom policy for a snapshot_session action. */
515 const struct lttng_rate_policy
*cur_policy
= nullptr;
516 status
= lttng_action_snapshot_session_get_rate_policy(snapshot_session_action
,
518 ok(status
== LTTNG_ACTION_STATUS_OK
&&
519 lttng_rate_policy_is_equal(policy
, cur_policy
),
520 "snapshot_session action policy get");
524 ret
= lttng_action_serialize(snapshot_session_action
, &payload
);
525 ok(ret
== 0, "Action snapshot_session serialized");
528 struct lttng_payload_view view
= lttng_payload_view_from_payload(&payload
, 0, -1);
529 (void) lttng_action_create_from_payload(&view
,
530 &snapshot_session_action_from_buffer
);
532 ok(snapshot_session_action_from_buffer
,
533 "snapshot_session action created from payload is non-null");
535 ok(lttng_action_is_equal(snapshot_session_action
, snapshot_session_action_from_buffer
),
536 "Serialized and de-serialized snapshot_session action are equal");
538 lttng_rate_policy_destroy(default_policy
);
539 lttng_rate_policy_destroy(policy
);
540 lttng_action_destroy(snapshot_session_action
);
541 lttng_action_destroy(snapshot_session_action_from_buffer
);
542 lttng_payload_reset(&payload
);
547 plan_tests(NUM_TESTS
);
548 test_action_notify();
550 test_action_rotate_session();
551 test_action_start_session();
552 test_action_stop_session();
553 test_action_snapshot_session();
554 return exit_status();
561 } catch (const std::exception
& e
) {
562 ERR_FMT("Unhandled exception caught by action unit test: {}", e
.what());