2 * Unit tests for the notification API.
4 * Copyright (C) 2019 Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
6 * SPDX-License-Identifier: LGPL-2.1-only
17 #include <common/payload-view.hpp>
18 #include <common/payload.hpp>
19 #include <lttng/domain.h>
20 #include <lttng/event-rule/jul-logging-internal.hpp>
21 #include <lttng/event-rule/jul-logging.h>
22 #include <lttng/event-rule/kernel-kprobe-internal.hpp>
23 #include <lttng/event-rule/kernel-kprobe.h>
24 #include <lttng/event-rule/kernel-syscall-internal.hpp>
25 #include <lttng/event-rule/kernel-syscall.h>
26 #include <lttng/event-rule/python-logging-internal.hpp>
27 #include <lttng/event-rule/python-logging.h>
28 #include <lttng/event-rule/kernel-tracepoint-internal.hpp>
29 #include <lttng/event-rule/kernel-tracepoint.h>
30 #include <lttng/event-rule/kernel-uprobe-internal.hpp>
31 #include <lttng/event-rule/kernel-uprobe.h>
32 #include <lttng/event-rule/user-tracepoint-internal.hpp>
33 #include <lttng/event-rule/user-tracepoint.h>
34 #include <lttng/event.h>
35 #include <lttng/kernel-probe-internal.hpp>
36 #include <lttng/kernel-probe.h>
37 #include <lttng/userspace-probe-internal.hpp>
38 #include <lttng/userspace-probe.h>
39 #include "bin/lttng/loglevel.hpp"
42 int lttng_opt_quiet
= 1;
43 int lttng_opt_verbose
;
47 #define UPROBE_NUM_TESTS 9
49 #define UPROBE_NUM_TESTS 0
50 #endif /* __linux__ */
52 #define NUM_TESTS (203 + UPROBE_NUM_TESTS)
55 struct tracepoint_test
{
56 enum lttng_domain_type type
;
57 bool support_name_pattern_exclusion
;
61 typedef const char *(*log_level_name_getter
)(int log_level
);
63 typedef struct lttng_event_rule
*(*event_rule_create
)(void);
64 typedef enum lttng_event_rule_status (*event_rule_set_log_level
)(
65 struct lttng_event_rule
*rule
,
66 const struct lttng_log_level_rule
*log_level_rule
);
69 void test_event_rule_kernel_tracepoint(void)
71 struct lttng_event_rule
*tracepoint
= NULL
;
72 struct lttng_event_rule
*tracepoint_from_buffer
= NULL
;
73 enum lttng_event_rule_status status
;
74 const char *pattern
="my_event_*";
75 const char *filter
="msg_id == 23 && size >= 2048";
77 struct lttng_payload payload
;
79 diag("Testing lttng_event_rule_kernel_tracepoint.");
81 lttng_payload_init(&payload
);
83 tracepoint
= lttng_event_rule_kernel_tracepoint_create();
84 ok(tracepoint
, "tracepoint object.");
86 status
= lttng_event_rule_kernel_tracepoint_set_name_pattern(tracepoint
, pattern
);
87 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "setting pattern.");
88 status
= lttng_event_rule_kernel_tracepoint_get_name_pattern(tracepoint
, &tmp
);
89 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "getting pattern.");
90 ok(!strncmp(pattern
, tmp
, strlen(pattern
)), "pattern is equal.");
92 status
= lttng_event_rule_kernel_tracepoint_set_filter(tracepoint
, filter
);
93 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "setting filter.");
94 status
= lttng_event_rule_kernel_tracepoint_get_filter(tracepoint
, &tmp
);
95 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "getting filter.");
96 ok(!strncmp(filter
, tmp
, strlen(filter
)), "filter is equal.");
98 ok(lttng_event_rule_serialize(tracepoint
, &payload
) == 0, "Serializing.");
101 struct lttng_payload_view view
=
102 lttng_payload_view_from_payload(
105 ok(lttng_event_rule_create_from_payload(
106 &view
, &tracepoint_from_buffer
) > 0,
110 ok(lttng_event_rule_is_equal(tracepoint
, tracepoint_from_buffer
), "serialized and from buffer are equal.");
112 lttng_payload_reset(&payload
);
113 lttng_event_rule_destroy(tracepoint
);
114 lttng_event_rule_destroy(tracepoint_from_buffer
);
118 void test_event_rule_user_tracepoint(void)
122 struct lttng_event_rule
*tracepoint
= NULL
;
123 struct lttng_event_rule
*tracepoint_from_buffer
= NULL
;
124 enum lttng_event_rule_status status
;
125 const char *pattern
="my_event_*";
126 const char *filter
="msg_id == 23 && size >= 2048";
128 const char *name_pattern_exclusions
[] = {"my_event_test1", "my_event_test2" ,"my_event_test3"};
129 struct lttng_log_level_rule
*log_level_rule
= NULL
;
130 const struct lttng_log_level_rule
*log_level_rule_return
= NULL
;
131 struct lttng_payload payload
;
133 diag("Testing lttng_event_rule_user_tracepoint.");
135 lttng_payload_init(&payload
);
137 log_level_rule
= lttng_log_level_rule_exactly_create(LTTNG_LOGLEVEL_INFO
);
138 LTTNG_ASSERT(log_level_rule
);
140 tracepoint
= lttng_event_rule_user_tracepoint_create();
141 ok(tracepoint
, "user tracepoint object.");
143 status
= lttng_event_rule_user_tracepoint_set_name_pattern(tracepoint
, pattern
);
144 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "setting pattern.");
145 status
= lttng_event_rule_user_tracepoint_get_name_pattern(tracepoint
, &tmp
);
146 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "getting pattern.");
147 ok(!strncmp(pattern
, tmp
, strlen(pattern
)), "pattern is equal.");
149 status
= lttng_event_rule_user_tracepoint_set_filter(tracepoint
, filter
);
150 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "setting filter.");
151 status
= lttng_event_rule_user_tracepoint_get_filter(tracepoint
, &tmp
);
152 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "getting filter.");
153 ok(!strncmp(filter
, tmp
, strlen(filter
)), "filter is equal.");
155 status
= lttng_event_rule_user_tracepoint_get_log_level_rule(tracepoint
, &log_level_rule_return
);
156 ok(status
== LTTNG_EVENT_RULE_STATUS_UNSET
, "get unset log level rule.");
158 status
= lttng_event_rule_user_tracepoint_set_log_level_rule(
159 tracepoint
, log_level_rule
);
160 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "setting log level rule.");
161 status
= lttng_event_rule_user_tracepoint_get_log_level_rule(
162 tracepoint
, &log_level_rule_return
);
163 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "get log level rule.");
165 /* Name pattern exclusions */
166 for (i
= 0; i
< 3; i
++) {
167 status
= lttng_event_rule_user_tracepoint_add_name_pattern_exclusion(
168 tracepoint
, name_pattern_exclusions
[i
]);
169 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
,
170 "setting name pattern exclusions \"%s\"",
171 name_pattern_exclusions
[i
]);
174 status
= lttng_event_rule_user_tracepoint_get_name_pattern_exclusion_count(
176 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
,
177 "getting name pattern exclusion count.");
178 ok(count
== 3, "count is %d/3", count
);
180 for (i
= 0; i
< count
; i
++) {
181 status
= lttng_event_rule_user_tracepoint_get_name_pattern_exclusion_at_index(
182 tracepoint
, i
, &tmp
);
183 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
,
184 "getting name pattern exclusion at index %d.",
186 ok(!strncmp(name_pattern_exclusions
[i
], tmp
,
187 strlen(name_pattern_exclusions
[i
])),
188 "%s == %s.", tmp
, name_pattern_exclusions
[i
]);
191 ok(lttng_event_rule_serialize(tracepoint
, &payload
) == 0, "Serializing.");
194 struct lttng_payload_view view
=
195 lttng_payload_view_from_payload(
198 ok(lttng_event_rule_create_from_payload(
199 &view
, &tracepoint_from_buffer
) > 0,
203 ok(lttng_event_rule_is_equal(tracepoint
, tracepoint_from_buffer
), "serialized and from buffer are equal.");
205 lttng_payload_reset(&payload
);
206 lttng_event_rule_destroy(tracepoint
);
207 lttng_event_rule_destroy(tracepoint_from_buffer
);
208 lttng_log_level_rule_destroy(log_level_rule
);
211 static void test_event_rule_syscall(void)
213 struct lttng_event_rule
*syscall
= NULL
;
214 struct lttng_event_rule
*syscall_from_buffer
= NULL
;
215 enum lttng_event_rule_status status
;
216 const char *pattern
= "my_event_*";
217 const char *filter
= "msg_id == 23 && size >= 2048";
219 struct lttng_payload payload
;
221 diag("Event rule syscall.");
223 lttng_payload_init(&payload
);
225 syscall
= lttng_event_rule_kernel_syscall_create(LTTNG_EVENT_RULE_KERNEL_SYSCALL_EMISSION_SITE_ENTRY
);
226 ok(syscall
, "syscall object.");
228 status
= lttng_event_rule_kernel_syscall_set_name_pattern(syscall
, pattern
);
229 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "setting pattern.");
230 status
= lttng_event_rule_kernel_syscall_get_name_pattern(syscall
, &tmp
);
231 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "getting pattern.");
232 ok(!strncmp(pattern
, tmp
, strlen(pattern
)), "pattern is equal.");
234 status
= lttng_event_rule_kernel_syscall_set_filter(syscall
, filter
);
235 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "setting filter.");
236 status
= lttng_event_rule_kernel_syscall_get_filter(syscall
, &tmp
);
237 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "getting filter.");
238 ok(!strncmp(filter
, tmp
, strlen(filter
)), "filter is equal.");
240 ok(lttng_event_rule_serialize(syscall
, &payload
) == 0, "Serializing.");
243 struct lttng_payload_view view
=
244 lttng_payload_view_from_payload(
247 ok(lttng_event_rule_create_from_payload(
248 &view
, &syscall_from_buffer
) > 0,
252 ok(lttng_event_rule_is_equal(syscall
, syscall_from_buffer
),
253 "serialized and from buffer are equal.");
255 lttng_payload_reset(&payload
);
256 lttng_event_rule_destroy(syscall
);
257 lttng_event_rule_destroy(syscall_from_buffer
);
261 void test_event_rule_jul_logging(void)
263 struct lttng_event_rule
*jul_logging
= NULL
;
264 struct lttng_event_rule
*jul_logging_from_buffer
= NULL
;
265 enum lttng_event_rule_status status
;
266 const char *pattern
="my_event_*";
267 const char *filter
="msg_id == 23 && size >= 2048";
269 struct lttng_log_level_rule
*log_level_rule
= NULL
;
270 const struct lttng_log_level_rule
*log_level_rule_return
= NULL
;
271 struct lttng_payload payload
;
273 diag("Testing lttng_event_rule_user_jul_logging.");
275 lttng_payload_init(&payload
);
277 log_level_rule
= lttng_log_level_rule_exactly_create(LTTNG_LOGLEVEL_INFO
);
278 LTTNG_ASSERT(log_level_rule
);
280 jul_logging
= lttng_event_rule_jul_logging_create();
281 ok(jul_logging
, "jul_logging object.");
283 status
= lttng_event_rule_jul_logging_set_name_pattern(jul_logging
, pattern
);
284 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "setting pattern.");
285 status
= lttng_event_rule_jul_logging_get_name_pattern(jul_logging
, &tmp
);
286 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "getting pattern.");
287 ok(!strncmp(pattern
, tmp
, strlen(pattern
)), "pattern is equal.");
289 status
= lttng_event_rule_jul_logging_set_filter(jul_logging
, filter
);
290 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "setting filter.");
291 status
= lttng_event_rule_jul_logging_get_filter(jul_logging
, &tmp
);
292 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "getting filter.");
293 ok(!strncmp(filter
, tmp
, strlen(filter
)), "filter is equal.");
295 status
= lttng_event_rule_jul_logging_get_log_level_rule(jul_logging
, &log_level_rule_return
);
296 ok(status
== LTTNG_EVENT_RULE_STATUS_UNSET
, "get unset log level rule.");
298 status
= lttng_event_rule_jul_logging_set_log_level_rule(
299 jul_logging
, log_level_rule
);
300 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "setting log level rule.");
301 status
= lttng_event_rule_jul_logging_get_log_level_rule(
302 jul_logging
, &log_level_rule_return
);
303 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "get log level rule.");
305 ok(lttng_event_rule_serialize(jul_logging
, &payload
) == 0, "Serializing.");
308 struct lttng_payload_view view
=
309 lttng_payload_view_from_payload(
312 ok(lttng_event_rule_create_from_payload(
313 &view
, &jul_logging_from_buffer
) > 0,
317 ok(lttng_event_rule_is_equal(jul_logging
, jul_logging_from_buffer
), "serialized and from buffer are equal.");
319 lttng_payload_reset(&payload
);
320 lttng_event_rule_destroy(jul_logging
);
321 lttng_event_rule_destroy(jul_logging_from_buffer
);
322 lttng_log_level_rule_destroy(log_level_rule
);
326 void test_event_rule_log4j_logging(void)
328 struct lttng_event_rule
*log4j_logging
= NULL
;
329 struct lttng_event_rule
*log4j_logging_from_buffer
= NULL
;
330 enum lttng_event_rule_status status
;
331 const char *pattern
="my_event_*";
332 const char *filter
="msg_id == 23 && size >= 2048";
334 struct lttng_log_level_rule
*log_level_rule
= NULL
;
335 const struct lttng_log_level_rule
*log_level_rule_return
= NULL
;
336 struct lttng_payload payload
;
338 diag("Testing lttng_event_rule_user_log4j_logging.");
340 lttng_payload_init(&payload
);
342 log_level_rule
= lttng_log_level_rule_exactly_create(LTTNG_LOGLEVEL_INFO
);
343 LTTNG_ASSERT(log_level_rule
);
345 log4j_logging
= lttng_event_rule_log4j_logging_create();
346 ok(log4j_logging
, "log4j_logging object.");
348 status
= lttng_event_rule_log4j_logging_set_name_pattern(log4j_logging
, pattern
);
349 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "setting pattern.");
350 status
= lttng_event_rule_log4j_logging_get_name_pattern(log4j_logging
, &tmp
);
351 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "getting pattern.");
352 ok(!strncmp(pattern
, tmp
, strlen(pattern
)), "pattern is equal.");
354 status
= lttng_event_rule_log4j_logging_set_filter(log4j_logging
, filter
);
355 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "setting filter.");
356 status
= lttng_event_rule_log4j_logging_get_filter(log4j_logging
, &tmp
);
357 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "getting filter.");
358 ok(!strncmp(filter
, tmp
, strlen(filter
)), "filter is equal.");
360 status
= lttng_event_rule_log4j_logging_get_log_level_rule(log4j_logging
, &log_level_rule_return
);
361 ok(status
== LTTNG_EVENT_RULE_STATUS_UNSET
, "get unset log level rule.");
363 status
= lttng_event_rule_log4j_logging_set_log_level_rule(
364 log4j_logging
, log_level_rule
);
365 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "setting log level rule.");
366 status
= lttng_event_rule_log4j_logging_get_log_level_rule(
367 log4j_logging
, &log_level_rule_return
);
368 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "get log level rule.");
370 ok(lttng_event_rule_serialize(log4j_logging
, &payload
) == 0, "Serializing.");
373 struct lttng_payload_view view
=
374 lttng_payload_view_from_payload(
377 ok(lttng_event_rule_create_from_payload(
378 &view
, &log4j_logging_from_buffer
) > 0,
382 ok(lttng_event_rule_is_equal(log4j_logging
, log4j_logging_from_buffer
), "serialized and from buffer are equal.");
384 lttng_payload_reset(&payload
);
385 lttng_event_rule_destroy(log4j_logging
);
386 lttng_event_rule_destroy(log4j_logging_from_buffer
);
387 lttng_log_level_rule_destroy(log_level_rule
);
391 void test_event_rule_python_logging(void)
393 struct lttng_event_rule
*python_logging
= NULL
;
394 struct lttng_event_rule
*python_logging_from_buffer
= NULL
;
395 enum lttng_event_rule_status status
;
396 const char *pattern
="my_event_*";
397 const char *filter
="msg_id == 23 && size >= 2048";
399 struct lttng_log_level_rule
*log_level_rule
= NULL
;
400 const struct lttng_log_level_rule
*log_level_rule_return
= NULL
;
401 struct lttng_payload payload
;
403 diag("Testing lttng_event_rule_user_python_logging.");
405 lttng_payload_init(&payload
);
407 log_level_rule
= lttng_log_level_rule_exactly_create(LTTNG_LOGLEVEL_INFO
);
408 LTTNG_ASSERT(log_level_rule
);
410 python_logging
= lttng_event_rule_python_logging_create();
411 ok(python_logging
, "python_logging object.");
413 status
= lttng_event_rule_python_logging_set_name_pattern(python_logging
, pattern
);
414 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "setting pattern.");
415 status
= lttng_event_rule_python_logging_get_name_pattern(python_logging
, &tmp
);
416 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "getting pattern.");
417 ok(!strncmp(pattern
, tmp
, strlen(pattern
)), "pattern is equal.");
419 status
= lttng_event_rule_python_logging_set_filter(python_logging
, filter
);
420 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "setting filter.");
421 status
= lttng_event_rule_python_logging_get_filter(python_logging
, &tmp
);
422 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "getting filter.");
423 ok(!strncmp(filter
, tmp
, strlen(filter
)), "filter is equal.");
425 status
= lttng_event_rule_python_logging_get_log_level_rule(python_logging
, &log_level_rule_return
);
426 ok(status
== LTTNG_EVENT_RULE_STATUS_UNSET
, "get unset log level rule.");
428 status
= lttng_event_rule_python_logging_set_log_level_rule(
429 python_logging
, log_level_rule
);
430 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "setting log level rule.");
431 status
= lttng_event_rule_python_logging_get_log_level_rule(
432 python_logging
, &log_level_rule_return
);
433 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "get log level rule.");
435 ok(lttng_event_rule_serialize(python_logging
, &payload
) == 0, "Serializing.");
438 struct lttng_payload_view view
=
439 lttng_payload_view_from_payload(
442 ok(lttng_event_rule_create_from_payload(
443 &view
, &python_logging_from_buffer
) > 0,
447 ok(lttng_event_rule_is_equal(python_logging
, python_logging_from_buffer
), "serialized and from buffer are equal.");
449 lttng_payload_reset(&payload
);
450 lttng_event_rule_destroy(python_logging
);
451 lttng_event_rule_destroy(python_logging_from_buffer
);
452 lttng_log_level_rule_destroy(log_level_rule
);
456 static void test_event_rule_userspace_probe(void)
458 struct lttng_event_rule
*uprobe
= NULL
;
459 struct lttng_event_rule
*uprobe_from_buffer
= NULL
;
460 struct lttng_userspace_probe_location_lookup_method
*lookup_method
=
462 struct lttng_userspace_probe_location
*probe_location
= NULL
;
463 const struct lttng_userspace_probe_location
*probe_location_tmp
= NULL
;
464 enum lttng_event_rule_status status
;
466 const char *probe_name
= "my_probe.";
468 struct lttng_payload payload
;
470 diag("Event rule uprobe.");
471 lttng_payload_init(&payload
);
473 lookup_method
= lttng_userspace_probe_location_lookup_method_function_elf_create();
474 if (!lookup_method
) {
475 fail("Setup error on userspace probe lookup method creation.");
479 probe_location
= lttng_userspace_probe_location_function_create(
481 "lttng_userspace_probe_location_tracepoint_create",
483 if (!probe_location
) {
484 fail("Setup error on userspace probe location creation.");
488 /* Ownership transferred to the probe location function object. */
489 lookup_method
= NULL
;
491 lttng_payload_init(&payload
);
493 uprobe
= lttng_event_rule_kernel_uprobe_create(probe_location
);
494 ok(uprobe
, "uprobe event rule object creation.");
496 status
= lttng_event_rule_kernel_uprobe_get_location(
497 uprobe
, &probe_location_tmp
);
498 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
,
499 "Getting uprobe event rule location.");
500 ok(lttng_userspace_probe_location_is_equal(
501 probe_location
, probe_location_tmp
),
502 "Location is equal.");
504 status
= lttng_event_rule_kernel_uprobe_set_event_name(uprobe
, probe_name
);
505 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
,
506 "Setting uprobe event rule name: %s.", probe_name
);
507 status
= lttng_event_rule_kernel_uprobe_get_event_name(uprobe
, &tmp
);
508 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "Getting uprobe name.");
509 ok(!strcmp(probe_name
, tmp
), "Uprobe name are equal.");
511 ok(lttng_event_rule_serialize(uprobe
, &payload
) == 0, "Serializing.");
514 struct lttng_payload_view view
=
515 lttng_payload_view_from_payload(
518 ok(lttng_event_rule_create_from_payload(
519 &view
, &uprobe_from_buffer
) > 0,
523 ok(lttng_event_rule_is_equal(uprobe
, uprobe_from_buffer
),
524 "serialized and from buffer are equal.");
527 lttng_payload_reset(&payload
);
528 lttng_event_rule_destroy(uprobe
);
529 lttng_event_rule_destroy(uprobe_from_buffer
);
530 lttng_userspace_probe_location_destroy(probe_location
);
531 lttng_userspace_probe_location_lookup_method_destroy(lookup_method
);
534 static void test_event_rule_userspace_probe(void) {}
537 static void test_event_rule_kernel_probe_by_location(
538 const struct lttng_kernel_probe_location
*location
)
540 struct lttng_event_rule
*kprobe
= NULL
;
541 struct lttng_event_rule
*kprobe_from_buffer
= NULL
;
542 enum lttng_event_rule_status status
;
543 const struct lttng_kernel_probe_location
*_location
;
545 const char *probe_name
= "my_probe";
547 struct lttng_payload payload
;
549 diag("Event rule kprobe for location type %d.",
550 lttng_kernel_probe_location_get_type(location
));
552 lttng_payload_init(&payload
);
554 kprobe
= lttng_event_rule_kernel_kprobe_create(location
);
555 ok(kprobe
, "kprobe event rule object creation.");
557 status
= lttng_event_rule_kernel_kprobe_get_location(kprobe
, &_location
);
558 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
,
559 "Getting kprobe event rule location.");
560 ok(lttng_kernel_probe_location_is_equal(location
, _location
), "Locations are equal.");
562 status
= lttng_event_rule_kernel_kprobe_set_event_name(kprobe
, probe_name
);
563 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
,
564 "Setting kprobe event rule name: %s.", probe_name
);
565 status
= lttng_event_rule_kernel_kprobe_get_event_name(kprobe
, &tmp
);
566 ok(status
== LTTNG_EVENT_RULE_STATUS_OK
, "Getting kprobe name.");
567 ok(!strcmp(probe_name
, tmp
), "kprobe name are equal.");
569 ok(lttng_event_rule_serialize(kprobe
, &payload
) == 0, "Serializing.");
572 struct lttng_payload_view view
=
573 lttng_payload_view_from_payload(
576 ok(lttng_event_rule_create_from_payload(
577 &view
, &kprobe_from_buffer
) > 0,
581 ok(lttng_event_rule_is_equal(kprobe
, kprobe_from_buffer
),
582 "serialized and from buffer are equal.");
584 lttng_payload_reset(&payload
);
585 lttng_event_rule_destroy(kprobe
);
586 lttng_event_rule_destroy(kprobe_from_buffer
);
589 static void test_event_rule_kernel_probe(void)
591 struct lttng_kernel_probe_location
*address_location
= NULL
;
592 struct lttng_kernel_probe_location
*symbol_location
= NULL
;
594 address_location
= lttng_kernel_probe_location_address_create(50);
595 symbol_location
= lttng_kernel_probe_location_symbol_create("une_bonne", 50);
596 LTTNG_ASSERT(address_location
);
597 LTTNG_ASSERT(symbol_location
);
599 test_event_rule_kernel_probe_by_location(address_location
);
600 test_event_rule_kernel_probe_by_location(symbol_location
);
602 lttng_kernel_probe_location_destroy(address_location
);
603 lttng_kernel_probe_location_destroy(symbol_location
);
606 static void test_set_event_rule_log_level_rules(
607 struct lttng_event_rule
*event_rule
,
608 event_rule_set_log_level set_log_level
,
610 enum lttng_event_rule_status
*exactly_status
,
611 enum lttng_event_rule_status
*as_severe_status
)
613 struct lttng_log_level_rule
*log_level_rule
;
615 log_level_rule
= lttng_log_level_rule_at_least_as_severe_as_create(
617 LTTNG_ASSERT(log_level_rule
);
619 *as_severe_status
= set_log_level(
620 event_rule
, log_level_rule
);
621 lttng_log_level_rule_destroy(log_level_rule
);
623 log_level_rule
= lttng_log_level_rule_exactly_create(log_level
);
624 LTTNG_ASSERT(log_level_rule
);
626 *exactly_status
= set_log_level(
627 event_rule
, log_level_rule
);
628 lttng_log_level_rule_destroy(log_level_rule
);
631 static void test_event_rule_log_level_generic(enum lttng_event_rule_type event_rule_type
,
632 log_level_name_getter get_log_level_name
,
633 event_rule_create create_event_rule
,
634 event_rule_set_log_level set_log_level
,
635 const int tagged_log_level_values
[],
636 size_t tagged_log_level_values_count
,
637 const int valid_log_level_values
[],
638 size_t valid_log_level_values_count
,
639 const int invalid_log_level_values
[],
640 size_t invalid_log_level_values_count
)
643 struct lttng_event_rule
*rule
;
644 enum lttng_event_rule_status er_exactly_status
, er_as_severe_status
;
645 const char *event_rule_type_str
= lttng_event_rule_type_str(event_rule_type
);
648 diag("Test %s event rule + log level rule", event_rule_type_str
);
650 rule
= create_event_rule();
653 for (i
= 0; i
< tagged_log_level_values_count
; i
++) {
654 const int tagged_log_level_value
= tagged_log_level_values
[i
];
656 test_set_event_rule_log_level_rules(rule
, set_log_level
,
657 tagged_log_level_value
,
658 &er_exactly_status
, &er_as_severe_status
);
659 ok(er_exactly_status
== LTTNG_EVENT_RULE_STATUS_OK
,
660 "Log level rule \"exactly\" accepted by %s event rule: level = %s",
663 tagged_log_level_value
));
664 ok(er_as_severe_status
== LTTNG_EVENT_RULE_STATUS_OK
,
665 "Log level rule \"as least as severe as\" accepted by %s event rule: level = %s",
668 tagged_log_level_value
));
671 for (i
= 0; i
< valid_log_level_values_count
; i
++) {
672 const int valid_log_level_value
= valid_log_level_values
[i
];
674 test_set_event_rule_log_level_rules(rule
, set_log_level
,
675 valid_log_level_value
,
676 &er_exactly_status
, &er_as_severe_status
);
677 ok(er_exactly_status
== LTTNG_EVENT_RULE_STATUS_OK
,
678 "Log level rule \"exactly\" accepted by %s event rule: level = %d",
680 valid_log_level_value
);
681 ok(er_as_severe_status
== LTTNG_EVENT_RULE_STATUS_OK
,
682 "Log level rule \"as least as severe as\" accepted by %s event rule: level = %d",
684 valid_log_level_value
);
687 for (i
= 0; i
< invalid_log_level_values_count
; i
++) {
688 const int invalid_log_level_value
= invalid_log_level_values
[i
];
690 test_set_event_rule_log_level_rules(rule
, set_log_level
,
691 invalid_log_level_value
,
692 &er_exactly_status
, &er_as_severe_status
);
693 ok(er_exactly_status
== LTTNG_EVENT_RULE_STATUS_INVALID
,
694 "Log level rule \"exactly\" rejected by %s event rule: level = %d",
696 invalid_log_level_value
);
697 ok(er_as_severe_status
== LTTNG_EVENT_RULE_STATUS_INVALID
,
698 "Log level rule \"as least as severe as\" rejected by %s event rule: level = %d",
700 invalid_log_level_value
);
703 lttng_event_rule_destroy(rule
);
706 static void test_event_rule_log_level_ust(void)
708 const int tagged_log_level_values
[] = {
709 LTTNG_LOGLEVEL_EMERG
,
710 LTTNG_LOGLEVEL_ALERT
,
713 LTTNG_LOGLEVEL_WARNING
,
714 LTTNG_LOGLEVEL_NOTICE
,
716 LTTNG_LOGLEVEL_DEBUG_SYSTEM
,
717 LTTNG_LOGLEVEL_DEBUG_PROGRAM
,
718 LTTNG_LOGLEVEL_DEBUG_PROCESS
,
719 LTTNG_LOGLEVEL_DEBUG_MODULE
,
720 LTTNG_LOGLEVEL_DEBUG_UNIT
,
721 LTTNG_LOGLEVEL_DEBUG_FUNCTION
,
722 LTTNG_LOGLEVEL_DEBUG_LINE
,
723 LTTNG_LOGLEVEL_DEBUG
,
725 const int invalid_log_level_values
[] = {
728 LTTNG_LOGLEVEL_DEBUG
+ 1,
729 LTTNG_LOGLEVEL_EMERG
- 1,
732 test_event_rule_log_level_generic(LTTNG_EVENT_RULE_TYPE_USER_TRACEPOINT
,
733 loglevel_value_to_name
,
734 lttng_event_rule_user_tracepoint_create
,
735 lttng_event_rule_user_tracepoint_set_log_level_rule
,
736 tagged_log_level_values
,
737 ARRAY_SIZE(tagged_log_level_values
), NULL
, 0,
738 invalid_log_level_values
,
739 ARRAY_SIZE(invalid_log_level_values
));
742 static void test_event_rule_log_level_jul(void)
744 const int tagged_log_level_values
[] = {
745 LTTNG_LOGLEVEL_JUL_OFF
,
746 LTTNG_LOGLEVEL_JUL_SEVERE
,
747 LTTNG_LOGLEVEL_JUL_WARNING
,
748 LTTNG_LOGLEVEL_JUL_INFO
,
749 LTTNG_LOGLEVEL_JUL_CONFIG
,
750 LTTNG_LOGLEVEL_JUL_FINE
,
751 LTTNG_LOGLEVEL_JUL_FINER
,
752 LTTNG_LOGLEVEL_JUL_FINEST
,
753 LTTNG_LOGLEVEL_JUL_ALL
,
755 const int valid_log_level_values
[] = {
761 test_event_rule_log_level_generic(LTTNG_EVENT_RULE_TYPE_JUL_LOGGING
,
762 loglevel_jul_value_to_name
,
763 lttng_event_rule_jul_logging_create
,
764 lttng_event_rule_jul_logging_set_log_level_rule
,
765 tagged_log_level_values
,
766 ARRAY_SIZE(tagged_log_level_values
),
767 valid_log_level_values
,
768 ARRAY_SIZE(valid_log_level_values
), NULL
, 0);
771 static void test_event_rule_log_level_log4j(void)
773 const int tagged_log_level_values
[] = {
774 LTTNG_LOGLEVEL_LOG4J_OFF
,
775 LTTNG_LOGLEVEL_LOG4J_FATAL
,
776 LTTNG_LOGLEVEL_LOG4J_ERROR
,
777 LTTNG_LOGLEVEL_LOG4J_WARN
,
778 LTTNG_LOGLEVEL_LOG4J_INFO
,
779 LTTNG_LOGLEVEL_LOG4J_DEBUG
,
780 LTTNG_LOGLEVEL_LOG4J_TRACE
,
781 LTTNG_LOGLEVEL_LOG4J_ALL
,
783 const int valid_log_level_values
[] = {
789 test_event_rule_log_level_generic(LTTNG_EVENT_RULE_TYPE_LOG4J_LOGGING
,
790 loglevel_log4j_value_to_name
,
791 lttng_event_rule_log4j_logging_create
,
792 lttng_event_rule_log4j_logging_set_log_level_rule
,
793 tagged_log_level_values
,
794 ARRAY_SIZE(tagged_log_level_values
),
795 valid_log_level_values
,
796 ARRAY_SIZE(valid_log_level_values
), NULL
, 0);
799 static void test_event_rule_log_level_python(void)
801 const int tagged_log_level_values
[] = {
802 LTTNG_LOGLEVEL_PYTHON_CRITICAL
,
803 LTTNG_LOGLEVEL_PYTHON_ERROR
,
804 LTTNG_LOGLEVEL_PYTHON_WARNING
,
805 LTTNG_LOGLEVEL_PYTHON_INFO
,
806 LTTNG_LOGLEVEL_PYTHON_DEBUG
,
807 LTTNG_LOGLEVEL_PYTHON_NOTSET
,
809 const int valid_log_level_values
[] = {
816 test_event_rule_log_level_generic(LTTNG_EVENT_RULE_TYPE_PYTHON_LOGGING
,
817 loglevel_python_value_to_name
,
818 lttng_event_rule_python_logging_create
,
819 lttng_event_rule_python_logging_set_log_level_rule
,
820 tagged_log_level_values
,
821 ARRAY_SIZE(tagged_log_level_values
),
822 valid_log_level_values
,
823 ARRAY_SIZE(valid_log_level_values
),
829 plan_tests(NUM_TESTS
);
830 test_event_rule_kernel_tracepoint();
831 test_event_rule_user_tracepoint();
832 test_event_rule_syscall();
833 test_event_rule_userspace_probe();
834 test_event_rule_kernel_probe();
835 test_event_rule_log4j_logging();
836 test_event_rule_jul_logging();
837 test_event_rule_python_logging();
838 test_event_rule_log_level_ust();
839 test_event_rule_log_level_jul();
840 test_event_rule_log_level_log4j();
841 test_event_rule_log_level_python();
842 return exit_status();