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 STATS_BIN
="$TESTDIR/utils/babelstats.pl"
13 SESSION_NAME
="valid_filter"
18 NUM_TESTS
=$
(($NUM_UST_TESTS+$NUM_KERNEL_TESTS+$NUM_GLOBAL_TESTS))
20 source $TESTDIR/utils
/utils.sh
22 function enable_lttng_event_filter
()
29 $TESTDIR/..
/src
/bin
/lttng
/$LTTNG_BIN enable-event
$event_name \
30 -s $sess_name $domain --filter "$filter" 2>&1 >/dev
/null
31 $TESTDIR/..
/src
/bin
/lttng
/$LTTNG_BIN add-context \
32 -s $sess_name $domain -t procname
2>&1 >/dev
/null
34 ok $?
"Enable lttng event with filtering"
39 .
/$CURDIR/$BIN_NAME $NR_ITER >/dev
/null
2>&1
44 $TESTDIR/utils
/testapp
/gen-ust-nevents-str
/gen-ust-nevents-str
$NR_ITER \
86 # Trigger the event for 100 iterations
87 echo -n "100" > /proc
/lttng-test-filter-event
90 function test_valid_filter
97 local trace_path
=$
(mktemp
-d -t tmp.test_filtering_invalid_filters_trace_path.XXXXXX
)
99 diag
"Test valid $domain_name filter: $filter"
102 create_lttng_session_ok
$SESSION_NAME $trace_path
105 enable_lttng_event_filter
$domain $SESSION_NAME "$event_name" "$filter"
108 start_lttng_tracing_ok
$SESSION_NAME
110 stop_lttng_tracing_ok
$SESSION_NAME
113 destroy_lttng_session_ok
$SESSION_NAME
115 stats
=`"$BABELTRACE_BIN" $trace_path | $STATS_BIN --tracepoint $event_name`
121 ok $?
"Validate trace filter output"
126 function validate_min_max
133 echo $stats |
grep -q "$field $expected_min $expected_max"
138 function validator_intfield
143 validate_min_max
"$stats" "intfield" "1" "99"
144 status
=$
(($status|$?
))
146 validate_min_max
"$stats" "intfield2" "0x1" "0x63"
147 status
=$
(($status|$?
))
149 validate_min_max
"$stats" "longfield" "1" "99"
150 status
=$
(($status|$?
))
152 validate_min_max
"$stats" "netintfield" "1" "99"
153 status
=$
(($status|$?
))
155 validate_min_max
"$stats" "netintfieldhex" "0x1" "0x63"
156 status
=$
(($status|$?
))
158 if [ $KERNEL_CHECK -eq 0 ]; then
159 validate_min_max
"$stats" "floatfield" "2222" "2222"
160 status
=$
(($status|$?
))
162 validate_min_max
"$stats" "doublefield" "2" "2"
163 status
=$
(($status|$?
))
169 function validator_intfield_gt
174 validate_min_max
"$stats" "intfield" "2" "99"
175 status
=$
(($status|$?
))
180 function validator_has_no_event
185 validate_min_max
"$stats" "intfield" "0" "99"
186 status
=$
(($status|$?
))
188 if [ $status -eq 0 ]; then
195 function validator_str_has_no_event
197 validator_has_no_event
"$1"
200 function validator_has_events
205 validate_min_max
"$stats" "intfield" "0" "99"
206 status
=$
(($status|$?
))
211 function validator_str_has_events
216 echo $stats |
grep -q str
217 status
=$
(($status|$?
))
222 function validator_stringfield_has_events
227 echo $stats |
grep -q stringfield
228 status
=$
(($status|$?
))
233 function validator_intfield_ge
238 validate_min_max
"$stats" "intfield" "1" "99"
239 status
=$
(($status|$?
))
244 function validator_intfield_lt
249 validate_min_max
"$stats" "intfield" "0" "1"
250 status
=$
(($status|$?
))
255 function validator_intfield_le
260 validate_min_max
"$stats" "intfield" "0" "2"
261 status
=$
(($status|$?
))
266 function validator_intfield_eq
271 validate_min_max
"$stats" "intfield" "1" "1"
272 status
=$
(($status|$?
))
277 function validator_intfield_ne
282 validate_min_max
"$stats" "intfield" "0" "98"
283 status
=$
(($status|$?
))
288 function validator_intfield_not
293 validate_min_max
"$stats" "intfield" "0" "0"
294 status
=$
(($status|$?
))
299 function validator_intfield_gt_and_longfield_gt
304 validate_min_max
"$stats" "intfield" "43" "99"
305 status
=$
(($status|$?
))
306 validate_min_max
"$stats" "longfield" "43" "99"
307 status
=$
(($status|$?
))
312 function validator_intfield_ge_and_longfield_le
317 validate_min_max
"$stats" "intfield" "42" "42"
318 status
=$
(($status|$?
))
319 validate_min_max
"$stats" "longfield" "42" "42"
320 status
=$
(($status|$?
))
325 function validator_intfield_lt_or_longfield_gt
330 validate_min_max
"$stats" "intfield" "0" "99"
331 status
=$
(($status|$?
))
332 validate_min_max
"$stats" "longfield" "0" "99"
333 status
=$
(($status|$?
))
338 function validator_mixed_str_or_int_and_int
343 validate_min_max
"$stats" "intfield" "34" "99"
344 status
=$
(($status|$?
))
346 validate_min_max
"$stats" "stringfield" "\"test\"" "\"test\""
347 status
=$
(($status|$?
))
352 function validator_mixed_int_double
357 validate_min_max
"$stats" "intfield" "0" "42"
358 status
=$
(($status|$?
))
363 function validator_true_statement
368 validate_min_max
"$stats" "intfield" "0" "99"
369 status
=$
(($status|$?
))
371 validate_min_max
"$stats" "intfield2" "0x0" "0x63"
372 status
=$
(($status|$?
))
374 validate_min_max
"$stats" "longfield" "0" "99"
375 status
=$
(($status|$?
))
377 validate_min_max
"$stats" "netintfield" "0" "99"
378 status
=$
(($status|$?
))
380 validate_min_max
"$stats" "netintfieldhex" "0x0" "0x63"
381 status
=$
(($status|$?
))
383 if [ $KERNEL_CHECK -eq 0 ]; then
384 validate_min_max
"$stats" "floatfield" "2222" "2222"
385 status
=$
(($status|$?
))
387 validate_min_max
"$stats" "doublefield" "2" "2"
388 status
=$
(($status|$?
))
391 validate_min_max
"$stats" "stringfield" "\"test\"" "\"test\""
392 status
=$
(($status|$?
))
394 validate_min_max
"$stats" "stringfield2" ""\
*"" ""\
*""
395 status
=$
(($status|$?
))
400 plan_tests
$NUM_TESTS
402 print_test_banner
"$TEST_DESC"
404 bail_out_if_no_babeltrace
406 issue_356_filter
="intfield > 0 && intfield > 1 && "
407 issue_356_filter
+="intfield > 2 && intfield > 3 && "
408 issue_356_filter
+="intfield > 4 && intfield > 5 && "
409 issue_356_filter
+="intfield > 6 && intfield > 7 && "
410 issue_356_filter
+="intfield > 8 || intfield > 0"
416 BIN_NAME
="gen-ust-events"
419 # the tests below were written by Kirk Krauss in this article:
420 # http://www.drdobbs.com/architecture-and-design/matching-wildcards-an-empirical-way-to-t/240169123
426 '"mississipissippi" == "*issip*ss*"'
429 '"xxxx\*zzzzzzzzy\*f" == "xxxx*zzy*fffff"'
432 '"xxxx\*zzzzzzzzy\*f" == "xxx*zzy*f"'
435 '"xxxxzzzzzzzzyf" == "xxxx*zzy*fffff"'
438 '"xxxxzzzzzzzzyf" == "xxxx*zzy*f"'
441 '"xyxyxyzyxyz" == "xy*z*xyz"'
444 '"mississippi" == "*sip*"'
447 '"xyxyxyxyz" == "xy*xyz"'
450 '"mississippi" == "mi*sip*"'
453 '"ababac" == "*abac*"'
456 '"ababac" == "*abac*"'
462 '"a12b12" == "*12*23"'
468 '"a12b12" == "*12*12*"'
483 '"XYXYXYZYXYz" == "XY*Z*XYz"'
486 '"missisSIPpi" == "*SIP*"'
489 '"mississipPI" == "*issip*PI"'
492 '"xyxyxyxyz" == "xy*xyz"'
495 '"miSsissippi" == "mi*sip*"'
498 '"miSsissippi" == "mi*Sip*"'
501 '"abAbac" == "*Abac*"'
504 '"abAbac" == "*Abac*"'
510 '"A12b12" == "*12*23"'
513 '"a12B12" == "*12*12*"'
525 '"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab" == "a*a*a*a*a*a*aa*aaa*a*a*b"'
528 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*a*aa*aaa*fa*ga*b*"'
531 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*a*x*aaa*fa*ga*b*"'
534 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*aaaa*fa*ga*gggg*b*"'
537 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*aaaa*fa*ga*ggg*b*"'
540 '"aaabbaabbaab" == "*aabbaa*a*"'
543 '"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*"'
546 '"aaaaaaaaaaaaaaaaa" == "*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*"'
549 '"aaaaaaaaaaaaaaaa" == "*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*"'
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*abc*abc*abc*abc*abc*"'
555 '"abc\*abcd\*abcde\*abcdef\*abcdefg\*abcdefgh\*abcdefghi\*abcdefghij\*abcdefghijk\*abcdefghijkl\*abcdefghijklm\*abcdefghijklmn" == "abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*"'
558 '"abc\*abcd\*abcd\*abc\*abcd" == "abc*abc*abc*abc*abc"'
561 '"abc\*abc\*abc\*abc\*abc\*abc\*abc\*abc\*abc\*abc\*abcd" == "abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abcd"'
564 # Set IFS to newline to facilitate array declaration
604 intfield_gt_and_longfield_gt
605 "intfield > 1 && longfield > 42"
607 intfield_ge_and_longfield_le
608 "intfield >= 42 && longfield <= 42"
610 intfield_lt_or_longfield_gt
611 "intfield < 1 || longfield > 98"
613 mixed_str_or_int_and_int
614 "(stringfield == \"test\" || intfield != 10) && intfield > 33"
617 "intfield < 42.4242424242"
621 "\"test\" == \"test\""
624 "stringfield == \"test\""
627 "stringfield == \"t*\""
630 "stringfield == \"*\""
664 "1 >= (1 >= (1 >= 1))"
667 "(0x101 & 0x100) == 0x100"
670 "(0x101 | 0x10100) == 0x10101"
673 "(0xF00F0F ^ 0xFF0F00) == 0x0F000F"
685 "(262144 >> 16) == 4"
688 "(~0 & 0xffff) == 0xffff"
691 "(~0 & 0xffffffff) == 0xffffffff"
694 "(~0 & 0xffffffffffffffff) == 0xffffffffffffffff"
699 true_statement
# unsigned bitwise ops
700 "~0>>4==0x0fffffffffffffff"
708 true_statement # comparator is signed, shift is unsigned
712 "(1<<2!=4)==0" # operator priority: shift before equality
715 "1&3==1" # operator priority: masks before equality
718 "(3|1==3)==1" # operator priority: masks before equality
721 "(2^1==3)==1" # operator priority: masks before equality
724 "(1 << 32) == 4294967296"
727 "(1 << 63) == 9223372036854775808"
730 "(arrfield1[2] & 1) == 1"
733 "(arrfield1[2] | 0x111000) == 0x111003"
736 "(arrfield1[0] | arrfield1[1] | arrfield1[2]) == 0x3"
739 "(seqfield4[2] & 1) == 1"
742 "(seqfield4[2] | 0x111000) == 0x111003"
745 "intfield < 0xDEADBEEF"
754 "stringfield2 == \"\\\*\""
757 "1.0 || intfield || 1.0"
787 "\$ctx.procname != \"$BIN_NAME\""
790 "\$ctx.procname == \"$BIN_NAME\""
793 "\"$BIN_NAME\" != \$ctx.procname"
796 "\"$BIN_NAME\" == \$ctx.procname"
799 "\$ctx.procname != \"$BIN_NAME*\""
802 "\$ctx.procname == \"$BIN_NAME*\""
805 "\"$BIN_NAME*\" != \$ctx.procname"
808 "\"$BIN_NAME*\" == \$ctx.procname"
811 "\$ctx.procname != \"*\""
814 "\$ctx.procname == \"*\""
817 "\"*\" != \$ctx.procname"
820 "\"*\" == \$ctx.procname"
826 "a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a"
829 "\$ctx.vtid.blah == 0"
832 "asdf.asdfsd.sadf < 4"
835 "0 == \$ctx.vtid.blah"
837 # check that bytecode linker refuses to link against a
840 'arrfield1 != "dontmatch"'
842 # check that bytecode linker refuses to link against a
843 # non-string sequence.
845 'seqfield1 != "dontmatch"'
852 'str == "hypothecary"'
855 '"hypothecary" == str'
858 'str != "hypothecary"'
861 '"hypothecary" != str'
948 'str == "*po***siz*"'
951 '"*po***siz*" == str'
954 'str != "*po***siz*"'
957 '"*po***siz*" != str'
960 'str == "*po*\**siz*"'
963 '"*po*\**siz*" == str'
990 '"salut*" == "salut vous"'
993 '"salut*" == "salut vous*"'
996 '"salut vous*" == "salut*"'
998 ${KIRK_KRAUSS_TESTS[@]}
1003 if [ ! -x "$CURDIR/$BIN_NAME" ]; then
1004 BAIL_OUT "No UST nevents binary detected."
1009 diag "Test UST valid filters"
1014 validator="${UST_FILTERS[$i]}"
1016 if [ "$validator" = END ]; then
1020 filter="${UST_FILTERS[$(( i + 1 ))]}"
1021 test_valid_filter ust -u "tp:tptest" "$filter" "validator_$validator"
1023 if [ $? -eq 1 ]; then
1033 validator="${UST_STR_FILTERS[$i]}"
1035 if [ "$validator" = END ]; then
1039 filter="${UST_STR_FILTERS[$(( i + 1 ))]}"
1040 test_valid_filter ust_str -u "tp:the_string" "$filter" "validator_$validator"
1042 if [ $? -eq 1 ]; then
1052 BIN_NAME="test_valid_filt" # Current script name truncated by kernel
1054 # One to one mapping between filters and validators
1055 # Set IFS to newline to facilitate array declaration
1095 intfield_gt_and_longfield_gt
1096 "intfield > 1 && longfield > 42"
1098 intfield_ge_and_longfield_le
1099 "intfield >= 42 && longfield <= 42"
1101 intfield_lt_or_longfield_gt
1102 "intfield < 1 || longfield > 98"
1104 mixed_str_or_int_and_int
1105 "(stringfield == \"test\" || intfield != 10) && intfield > 33"
1108 "intfield < 42.4242424242"
1111 "\"test\" == \"test\""
1114 "stringfield == \"test\""
1117 "stringfield == \"t*\""
1120 "stringfield == \"*\""
1153 "1 >= (1 >= (1 >= 1))"
1156 "(0x101 & 0x100) == 0x100"
1159 "(0x101 | 0x10100) == 0x10101"
1162 "(0xF00F0F ^ 0xFF0F00) == 0x0F000F"
1174 "(262144 >> 16) == 4"
1177 "(~0 & 0xffff) == 0xffff"
1180 "(~0 & 0xffffffff) == 0xffffffff"
1183 "(~0 & 0xffffffffffffffff) == 0xffffffffffffffff"
1188 true_statement # unsigned bitwise ops
1189 "~0>>4==0x0fffffffffffffff"
1197 true_statement # comparator is signed, shift is unsigned
1201 "(1<<2!=4)==0" # operator priority: shift before equality
1204 "1&3==1" # operator priority: masks before equality
1207 "(3|1==3)==1" # operator priority: masks before equality
1210 "(2^1==3)==1" # operator priority: masks before equality
1213 "(1 << 32) == 4294967296"
1216 "(1 << 63) == 9223372036854775808"
1219 "(arrfield1[2] & 1) == 1"
1222 "(arrfield1[2] | 0x111000) == 0x111003"
1225 "(arrfield1[0] | arrfield1[1] | arrfield1[2]) == 0x3"
1228 "(seqfield4[2] & 1) == 1"
1231 "(seqfield4[2] | 0x111000) == 0x111003"
1234 "intfield < 0xDEADBEEF"
1243 "stringfield2 == \"\\\*\""
1246 "1.0 || intfield || 1.0"
1276 "\$ctx.procname != \"$BIN_NAME\""
1279 "\$ctx.procname == \"$BIN_NAME\""
1282 "\"$BIN_NAME\" != \$ctx.procname"
1285 "\"$BIN_NAME\" == \$ctx.procname"
1288 "\$ctx.procname != \"$BIN_NAME*\""
1291 "\$ctx.procname == \"$BIN_NAME*\""
1294 "\"$BIN_NAME*\" != \$ctx.procname"
1297 "\"$BIN_NAME*\" == \$ctx.procname"
1300 "\$ctx.procname != \"*\""
1303 "\$ctx.procname == \"*\""
1306 "\"*\" != \$ctx.procname"
1309 "\"*\" == \$ctx.procname"
1315 "a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a"
1318 "\$ctx.vtid.blah == 0"
1321 "asdf.asdfsd.sadf < 4"
1324 "0 == \$ctx.vtid.blah"
1326 stringfield_has_events
1327 'stringfield == "test"'
1329 stringfield_has_events
1330 '"test" == stringfield'
1333 'stringfield != "test"'
1336 '"test" != stringfield'
1338 stringfield_has_events
1339 'stringfield == "*st"'
1341 stringfield_has_events
1342 '"*st" == stringfield'
1345 'stringfield != "*st"'
1348 '"*st" != stringfield'
1350 stringfield_has_events
1351 'stringfield == "te*"'
1353 stringfield_has_events
1354 '"te*" == stringfield'
1357 'stringfield != "te*"'
1360 '"te*" != stringfield'
1362 stringfield_has_events
1363 'stringfield == "te*t"'
1365 stringfield_has_events
1366 '"te*t" == stringfield'
1369 'stringfield != "te*t"'
1372 '"te*t" != stringfield'
1374 stringfield_has_events
1375 'stringfield == "tes*t"'
1377 stringfield_has_events
1378 '"tes*t" == stringfield'
1381 'stringfield != "tes*t"'
1384 '"tes*t" != stringfield'
1386 stringfield_has_events
1387 'stringfield == "*test"'
1389 stringfield_has_events
1390 '"*test" == stringfield'
1393 'stringfield != "*test"'
1396 '"*test" != stringfield'
1398 stringfield_has_events
1399 'stringfield == "test*"'
1401 stringfield_has_events
1402 '"test*" == stringfield'
1405 'stringfield != "test*"'
1408 '"test*" != stringfield'
1410 stringfield_has_events
1411 'stringfield == "*"'
1413 stringfield_has_events
1414 '"*" == stringfield'
1417 'stringfield != "*"'
1420 '"*" != stringfield'
1423 'stringfield == "test*2"'
1426 'stringfield == "2*test"'
1429 'stringfield == "te\*st"'
1432 'stringfield == "te*ts"'
1435 'stringfield == "*\*test"'
1438 'stringfield == "test\*"'
1440 # check that bytecode linker refuses to link against a
1443 'arrfield1 != "dontmatch"'
1445 # check that bytecode linker refuses to link against a
1446 # non-string sequence.
1448 'seqfield1 != "dontmatch"'
1450 ${KIRK_KRAUSS_TESTS[@]}
1457 if [ "$(id -u)" == "0" ]; then
1463 skip $isroot "Root access is needed. Skipping all kernel valid filter tests." $NUM_KERNEL_TESTS ||
1465 diag "Test kernel valid filters"
1472 validator="${KERNEL_FILTERS[$i]}"
1474 if [ "$validator" = END ]; then
1478 filter="${KERNEL_FILTERS[$(( i + 1 ))]}"
1479 test_valid_filter kernel -k "lttng_test_filter_event" "$filter" "validator_$validator"
1481 if [ $? -eq 1 ]; then
1489 modprobe --remove lttng-test