3 # Copyright (C) 2012 Christian Babeux <christian.babeux@efficios.com>
5 # SPDX-License-Identifier: GPL-2.0-only
8 TEST_DESC
="Filtering - Valid filters"
11 TESTDIR
=$CURDIR/..
/..
/..
12 BT2_PLUGINS_DIR
="${TESTDIR}/utils/bt2_plugins"
14 SESSION_NAME
="valid_filter"
19 NUM_TESTS
=$
(($NUM_UST_TESTS+$NUM_KERNEL_TESTS+$NUM_GLOBAL_TESTS))
21 source $TESTDIR/utils
/utils.sh
23 function enable_lttng_event_filter
()
30 $TESTDIR/..
/src
/bin
/lttng
/$LTTNG_BIN enable-event
$event_name \
31 -s $sess_name $domain --filter "$filter" 2>&1 >/dev
/null
32 $TESTDIR/..
/src
/bin
/lttng
/$LTTNG_BIN add-context \
33 -s $sess_name $domain -t procname
2>&1 >/dev
/null
35 ok $?
"Enable lttng event with filtering"
40 .
/$CURDIR/$BIN_NAME $NR_ITER >/dev
/null
2>&1
45 $TESTDIR/utils
/testapp
/gen-ust-nevents-str
/gen-ust-nevents-str
$NR_ITER \
87 # Trigger the event for 100 iterations
88 echo -n "100" > /proc
/lttng-test-filter-event
91 function test_valid_filter
98 local trace_path
=$
(mktemp
-d -t tmp.test_filtering_valid_filters_trace_path.XXXXXX
)
100 diag
"Test valid $domain_name filter: $filter"
103 create_lttng_session_ok
$SESSION_NAME $trace_path
106 enable_lttng_event_filter
$domain $SESSION_NAME "$event_name" "$filter"
109 start_lttng_tracing_ok
$SESSION_NAME
111 stop_lttng_tracing_ok
$SESSION_NAME
114 destroy_lttng_session_ok
$SESSION_NAME --no-wait
116 stats
=$
("${BABELTRACE_BIN}" --plugin-path "${BT2_PLUGINS_DIR}" "${trace_path}" -c filter.lttngtest.event_name -p "names=[\"${event_name}\"]" -c sink.lttngtest.field_stats
)
119 ok $?
"Validate trace filter output"
123 function validate_min_max
130 echo $stats |
grep -q "$field $expected_min $expected_max"
135 function validator_intfield
140 validate_min_max
"$stats" "intfield" "1" "99"
141 status
=$
(($status|$?
))
143 validate_min_max
"$stats" "intfield2" "0x1" "0x63"
144 status
=$
(($status|$?
))
146 validate_min_max
"$stats" "longfield" "1" "99"
147 status
=$
(($status|$?
))
149 validate_min_max
"$stats" "netintfield" "1" "99"
150 status
=$
(($status|$?
))
152 validate_min_max
"$stats" "netintfieldhex" "0x1" "0x63"
153 status
=$
(($status|$?
))
155 if [ $KERNEL_CHECK -eq 0 ]; then
156 validate_min_max
"$stats" "floatfield" "2222" "2222"
157 status
=$
(($status|$?
))
159 validate_min_max
"$stats" "doublefield" "2" "2"
160 status
=$
(($status|$?
))
166 function validator_intfield_gt
171 validate_min_max
"$stats" "intfield" "2" "99"
172 status
=$
(($status|$?
))
177 function validator_has_no_event
182 validate_min_max
"$stats" "intfield" "0" "99"
183 status
=$
(($status|$?
))
185 if [ $status -eq 0 ]; then
192 function validator_str_has_no_event
194 validator_has_no_event
"$1"
197 function validator_has_events
202 validate_min_max
"$stats" "intfield" "0" "99"
203 status
=$
(($status|$?
))
208 function validator_str_has_events
213 echo $stats |
grep -q str
214 status
=$
(($status|$?
))
219 function validator_stringfield_has_events
224 echo $stats |
grep -q stringfield
225 status
=$
(($status|$?
))
230 function validator_intfield_ge
235 validate_min_max
"$stats" "intfield" "1" "99"
236 status
=$
(($status|$?
))
241 function validator_intfield_lt
246 validate_min_max
"$stats" "intfield" "0" "1"
247 status
=$
(($status|$?
))
252 function validator_intfield_le
257 validate_min_max
"$stats" "intfield" "0" "2"
258 status
=$
(($status|$?
))
263 function validator_intfield_eq
268 validate_min_max
"$stats" "intfield" "1" "1"
269 status
=$
(($status|$?
))
274 function validator_intfield_ne
279 validate_min_max
"$stats" "intfield" "0" "98"
280 status
=$
(($status|$?
))
285 function validator_intfield_not
290 validate_min_max
"$stats" "intfield" "0" "0"
291 status
=$
(($status|$?
))
296 function validator_intfield_gt_and_longfield_gt
301 validate_min_max
"$stats" "intfield" "43" "99"
302 status
=$
(($status|$?
))
303 validate_min_max
"$stats" "longfield" "43" "99"
304 status
=$
(($status|$?
))
309 function validator_intfield_ge_and_longfield_le
314 validate_min_max
"$stats" "intfield" "42" "42"
315 status
=$
(($status|$?
))
316 validate_min_max
"$stats" "longfield" "42" "42"
317 status
=$
(($status|$?
))
322 function validator_intfield_lt_or_longfield_gt
327 validate_min_max
"$stats" "intfield" "0" "99"
328 status
=$
(($status|$?
))
329 validate_min_max
"$stats" "longfield" "0" "99"
330 status
=$
(($status|$?
))
335 function validator_mixed_str_or_int_and_int
340 validate_min_max
"$stats" "intfield" "34" "99"
341 status
=$
(($status|$?
))
343 validate_min_max
"$stats" "stringfield" "\"test\"" "\"test\""
344 status
=$
(($status|$?
))
349 function validator_mixed_int_double
354 validate_min_max
"$stats" "intfield" "0" "42"
355 status
=$
(($status|$?
))
360 function validator_true_statement
365 validate_min_max
"$stats" "intfield" "0" "99"
366 status
=$
(($status|$?
))
368 validate_min_max
"$stats" "intfield2" "0x0" "0x63"
369 status
=$
(($status|$?
))
371 validate_min_max
"$stats" "longfield" "0" "99"
372 status
=$
(($status|$?
))
374 validate_min_max
"$stats" "netintfield" "0" "99"
375 status
=$
(($status|$?
))
377 validate_min_max
"$stats" "netintfieldhex" "0x0" "0x63"
378 status
=$
(($status|$?
))
380 if [ $KERNEL_CHECK -eq 0 ]; then
381 validate_min_max
"$stats" "floatfield" "2222" "2222"
382 status
=$
(($status|$?
))
384 validate_min_max
"$stats" "doublefield" "2" "2"
385 status
=$
(($status|$?
))
388 validate_min_max
"$stats" "stringfield" "\"test\"" "\"test\""
389 status
=$
(($status|$?
))
391 validate_min_max
"$stats" "stringfield2" ""\
*"" ""\
*""
392 status
=$
(($status|$?
))
397 plan_tests
$NUM_TESTS
399 print_test_banner
"$TEST_DESC"
401 bail_out_if_no_babeltrace
403 issue_356_filter
="intfield > 0 && intfield > 1 && "
404 issue_356_filter
+="intfield > 2 && intfield > 3 && "
405 issue_356_filter
+="intfield > 4 && intfield > 5 && "
406 issue_356_filter
+="intfield > 6 && intfield > 7 && "
407 issue_356_filter
+="intfield > 8 || intfield > 0"
413 BIN_NAME
="gen-ust-events"
416 # the tests below were written by Kirk Krauss in this article:
417 # http://www.drdobbs.com/architecture-and-design/matching-wildcards-an-empirical-way-to-t/240169123
423 '"mississipissippi" == "*issip*ss*"'
426 '"xxxx\*zzzzzzzzy\*f" == "xxxx*zzy*fffff"'
429 '"xxxx\*zzzzzzzzy\*f" == "xxx*zzy*f"'
432 '"xxxxzzzzzzzzyf" == "xxxx*zzy*fffff"'
435 '"xxxxzzzzzzzzyf" == "xxxx*zzy*f"'
438 '"xyxyxyzyxyz" == "xy*z*xyz"'
441 '"mississippi" == "*sip*"'
444 '"xyxyxyxyz" == "xy*xyz"'
447 '"mississippi" == "mi*sip*"'
450 '"ababac" == "*abac*"'
453 '"ababac" == "*abac*"'
459 '"a12b12" == "*12*23"'
465 '"a12b12" == "*12*12*"'
480 '"XYXYXYZYXYz" == "XY*Z*XYz"'
483 '"missisSIPpi" == "*SIP*"'
486 '"mississipPI" == "*issip*PI"'
489 '"xyxyxyxyz" == "xy*xyz"'
492 '"miSsissippi" == "mi*sip*"'
495 '"miSsissippi" == "mi*Sip*"'
498 '"abAbac" == "*Abac*"'
501 '"abAbac" == "*Abac*"'
507 '"A12b12" == "*12*23"'
510 '"a12B12" == "*12*12*"'
522 '"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab" == "a*a*a*a*a*a*aa*aaa*a*a*b"'
525 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*a*aa*aaa*fa*ga*b*"'
528 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*a*x*aaa*fa*ga*b*"'
531 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*aaaa*fa*ga*gggg*b*"'
534 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*aaaa*fa*ga*ggg*b*"'
537 '"aaabbaabbaab" == "*aabbaa*a*"'
540 '"a\*a\*a\*a\*a\*a\*a\*a\*a\*a\*a\*a\*a\*a\*a\*a\*a\*" == "a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*"'
543 '"aaaaaaaaaaaaaaaaa" == "*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*"'
546 '"aaaaaaaaaaaaaaaa" == "*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*"'
549 '"abc\*abcd\*abcde\*abcdef\*abcdefg\*abcdefgh\*abcdefghi\*abcdefghij\*abcdefghijk\*abcdefghijkl\*abcdefghijklm\*abcdefghijklmn" == "abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*"'
552 '"abc\*abcd\*abcde\*abcdef\*abcdefg\*abcdefgh\*abcdefghi\*abcdefghij\*abcdefghijk\*abcdefghijkl\*abcdefghijklm\*abcdefghijklmn" == "abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*"'
555 '"abc\*abcd\*abcd\*abc\*abcd" == "abc*abc*abc*abc*abc"'
558 '"abc\*abc\*abc\*abc\*abc\*abc\*abc\*abc\*abc\*abc\*abcd" == "abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abcd"'
561 # Set IFS to newline to facilitate array declaration
601 intfield_gt_and_longfield_gt
602 "intfield > 1 && longfield > 42"
604 intfield_ge_and_longfield_le
605 "intfield >= 42 && longfield <= 42"
607 intfield_lt_or_longfield_gt
608 "intfield < 1 || longfield > 98"
610 mixed_str_or_int_and_int
611 "(stringfield == \"test\" || intfield != 10) && intfield > 33"
614 "intfield < 42.4242424242"
618 "\"test\" == \"test\""
621 "stringfield == \"test\""
624 "stringfield == \"t*\""
627 "stringfield == \"*\""
661 "1 >= (1 >= (1 >= 1))"
664 "(0x101 & 0x100) == 0x100"
667 "(0x101 | 0x10100) == 0x10101"
670 "(0xF00F0F ^ 0xFF0F00) == 0x0F000F"
682 "(262144 >> 16) == 4"
685 "(~0 & 0xffff) == 0xffff"
688 "(~0 & 0xffffffff) == 0xffffffff"
691 "(~0 & 0xffffffffffffffff) == 0xffffffffffffffff"
696 true_statement
# unsigned bitwise ops
697 "~0>>4==0x0fffffffffffffff"
705 true_statement # comparator is signed, shift is unsigned
709 "(1<<2!=4)==0" # operator priority: shift before equality
712 "1&3==1" # operator priority: masks before equality
715 "(3|1==3)==1" # operator priority: masks before equality
718 "(2^1==3)==1" # operator priority: masks before equality
721 "(1 << 32) == 4294967296"
724 "(1 << 63) == 9223372036854775808"
727 "(arrfield1[2] & 1) == 1"
730 "(arrfield1[2] | 0x111000) == 0x111003"
733 "(arrfield1[0] | arrfield1[1] | arrfield1[2]) == 0x3"
736 "(seqfield4[2] & 1) == 1"
739 "(seqfield4[2] | 0x111000) == 0x111003"
742 "intfield < 0xDEADBEEF"
751 "stringfield2 == \"\\\*\""
754 "1.0 || intfield || 1.0"
784 "\$ctx.procname != \"$BIN_NAME\""
787 "\$ctx.procname == \"$BIN_NAME\""
790 "\"$BIN_NAME\" != \$ctx.procname"
793 "\"$BIN_NAME\" == \$ctx.procname"
796 "\$ctx.procname != \"$BIN_NAME*\""
799 "\$ctx.procname == \"$BIN_NAME*\""
802 "\"$BIN_NAME*\" != \$ctx.procname"
805 "\"$BIN_NAME*\" == \$ctx.procname"
808 "\$ctx.procname != \"*\""
811 "\$ctx.procname == \"*\""
814 "\"*\" != \$ctx.procname"
817 "\"*\" == \$ctx.procname"
823 "a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a"
826 "\$ctx.vtid.blah == 0"
829 "asdf.asdfsd.sadf < 4"
832 "0 == \$ctx.vtid.blah"
834 # check that bytecode linker refuses to link against a
837 'arrfield1 != "dontmatch"'
839 # check that bytecode linker refuses to link against a
840 # non-string sequence.
842 'seqfield1 != "dontmatch"'
849 'str == "hypothecary"'
852 '"hypothecary" == str'
855 'str != "hypothecary"'
858 '"hypothecary" != str'
945 'str == "*po***siz*"'
948 '"*po***siz*" == str'
951 'str != "*po***siz*"'
954 '"*po***siz*" != str'
957 'str == "*po*\**siz*"'
960 '"*po*\**siz*" == str'
987 '"salut*" == "salut vous"'
990 '"salut*" == "salut vous*"'
993 '"salut vous*" == "salut*"'
995 ${KIRK_KRAUSS_TESTS[@]}
1000 if [ ! -x "$CURDIR/$BIN_NAME" ]; then
1001 BAIL_OUT "No UST nevents binary detected."
1006 diag "Test UST valid filters"
1011 validator="${UST_FILTERS[$i]}"
1013 if [ "$validator" = END ]; then
1017 filter="${UST_FILTERS[$(( i + 1 ))]}"
1018 test_valid_filter ust -u "tp:tptest" "$filter" "validator_$validator"
1020 if [ $? -eq 1 ]; then
1030 validator="${UST_STR_FILTERS[$i]}"
1032 if [ "$validator" = END ]; then
1036 filter="${UST_STR_FILTERS[$(( i + 1 ))]}"
1037 test_valid_filter ust_str -u "tp:the_string" "$filter" "validator_$validator"
1039 if [ $? -eq 1 ]; then
1049 BIN_NAME="test_valid_filt" # Current script name truncated by kernel
1051 # One to one mapping between filters and validators
1052 # Set IFS to newline to facilitate array declaration
1092 intfield_gt_and_longfield_gt
1093 "intfield > 1 && longfield > 42"
1095 intfield_ge_and_longfield_le
1096 "intfield >= 42 && longfield <= 42"
1098 intfield_lt_or_longfield_gt
1099 "intfield < 1 || longfield > 98"
1101 mixed_str_or_int_and_int
1102 "(stringfield == \"test\" || intfield != 10) && intfield > 33"
1105 "intfield < 42.4242424242"
1108 "\"test\" == \"test\""
1111 "stringfield == \"test\""
1114 "stringfield == \"t*\""
1117 "stringfield == \"*\""
1150 "1 >= (1 >= (1 >= 1))"
1153 "(0x101 & 0x100) == 0x100"
1156 "(0x101 | 0x10100) == 0x10101"
1159 "(0xF00F0F ^ 0xFF0F00) == 0x0F000F"
1171 "(262144 >> 16) == 4"
1174 "(~0 & 0xffff) == 0xffff"
1177 "(~0 & 0xffffffff) == 0xffffffff"
1180 "(~0 & 0xffffffffffffffff) == 0xffffffffffffffff"
1185 true_statement # unsigned bitwise ops
1186 "~0>>4==0x0fffffffffffffff"
1194 true_statement # comparator is signed, shift is unsigned
1198 "(1<<2!=4)==0" # operator priority: shift before equality
1201 "1&3==1" # operator priority: masks before equality
1204 "(3|1==3)==1" # operator priority: masks before equality
1207 "(2^1==3)==1" # operator priority: masks before equality
1210 "(1 << 32) == 4294967296"
1213 "(1 << 63) == 9223372036854775808"
1216 "(arrfield1[2] & 1) == 1"
1219 "(arrfield1[2] | 0x111000) == 0x111003"
1222 "(arrfield1[0] | arrfield1[1] | arrfield1[2]) == 0x3"
1225 "(seqfield4[2] & 1) == 1"
1228 "(seqfield4[2] | 0x111000) == 0x111003"
1231 "intfield < 0xDEADBEEF"
1240 "stringfield2 == \"\\\*\""
1243 "1.0 || intfield || 1.0"
1273 "\$ctx.procname != \"$BIN_NAME\""
1276 "\$ctx.procname == \"$BIN_NAME\""
1279 "\"$BIN_NAME\" != \$ctx.procname"
1282 "\"$BIN_NAME\" == \$ctx.procname"
1285 "\$ctx.procname != \"$BIN_NAME*\""
1288 "\$ctx.procname == \"$BIN_NAME*\""
1291 "\"$BIN_NAME*\" != \$ctx.procname"
1294 "\"$BIN_NAME*\" == \$ctx.procname"
1297 "\$ctx.procname != \"*\""
1300 "\$ctx.procname == \"*\""
1303 "\"*\" != \$ctx.procname"
1306 "\"*\" == \$ctx.procname"
1312 "a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a"
1315 "\$ctx.vtid.blah == 0"
1318 "asdf.asdfsd.sadf < 4"
1321 "0 == \$ctx.vtid.blah"
1323 stringfield_has_events
1324 'stringfield == "test"'
1326 stringfield_has_events
1327 '"test" == stringfield'
1330 'stringfield != "test"'
1333 '"test" != stringfield'
1335 stringfield_has_events
1336 'stringfield == "*st"'
1338 stringfield_has_events
1339 '"*st" == stringfield'
1342 'stringfield != "*st"'
1345 '"*st" != stringfield'
1347 stringfield_has_events
1348 'stringfield == "te*"'
1350 stringfield_has_events
1351 '"te*" == stringfield'
1354 'stringfield != "te*"'
1357 '"te*" != stringfield'
1359 stringfield_has_events
1360 'stringfield == "te*t"'
1362 stringfield_has_events
1363 '"te*t" == stringfield'
1366 'stringfield != "te*t"'
1369 '"te*t" != stringfield'
1371 stringfield_has_events
1372 'stringfield == "tes*t"'
1374 stringfield_has_events
1375 '"tes*t" == stringfield'
1378 'stringfield != "tes*t"'
1381 '"tes*t" != stringfield'
1383 stringfield_has_events
1384 'stringfield == "*test"'
1386 stringfield_has_events
1387 '"*test" == stringfield'
1390 'stringfield != "*test"'
1393 '"*test" != stringfield'
1395 stringfield_has_events
1396 'stringfield == "test*"'
1398 stringfield_has_events
1399 '"test*" == stringfield'
1402 'stringfield != "test*"'
1405 '"test*" != stringfield'
1407 stringfield_has_events
1408 'stringfield == "*"'
1410 stringfield_has_events
1411 '"*" == stringfield'
1414 'stringfield != "*"'
1417 '"*" != stringfield'
1420 'stringfield == "test*2"'
1423 'stringfield == "2*test"'
1426 'stringfield == "te\*st"'
1429 'stringfield == "te*ts"'
1432 'stringfield == "*\*test"'
1435 'stringfield == "test\*"'
1437 # check that bytecode linker refuses to link against a
1440 'arrfield1 != "dontmatch"'
1442 # check that bytecode linker refuses to link against a
1443 # non-string sequence.
1445 'seqfield1 != "dontmatch"'
1447 ${KIRK_KRAUSS_TESTS[@]}
1454 check_skip_kernel_test "$NUM_KERNEL_TESTS" "Skipping kernel valid filter tests." ||
1456 diag "Test kernel valid filters"
1463 validator="${KERNEL_FILTERS[$i]}"
1465 if [ "$validator" = END ]; then
1469 filter="${KERNEL_FILTERS[$(( i + 1 ))]}"
1470 test_valid_filter kernel -k "lttng_test_filter_event" "$filter" "validator_$validator"
1472 if [ $? -eq 1 ]; then
1480 modprobe --remove lttng-test