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
98 diag
"Test valid $domain_name filter: $filter"
100 trace_path
=$
(mktemp
-d)
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
116 stats
=`babeltrace $trace_path | $STATS_BIN --tracepoint $event_name`
122 ok $?
"Validate trace filter output"
127 function validate_min_max
134 echo $stats |
grep -q "$field $expected_min $expected_max"
139 function validator_intfield
144 validate_min_max
"$stats" "intfield" "1" "99"
145 status
=$
(($status|$?
))
147 validate_min_max
"$stats" "intfield2" "0x1" "0x63"
148 status
=$
(($status|$?
))
150 validate_min_max
"$stats" "longfield" "1" "99"
151 status
=$
(($status|$?
))
153 validate_min_max
"$stats" "netintfield" "1" "99"
154 status
=$
(($status|$?
))
156 validate_min_max
"$stats" "netintfieldhex" "0x1" "0x63"
157 status
=$
(($status|$?
))
159 if [ $KERNEL_CHECK -eq 0 ]; then
160 validate_min_max
"$stats" "floatfield" "2222" "2222"
161 status
=$
(($status|$?
))
163 validate_min_max
"$stats" "doublefield" "2" "2"
164 status
=$
(($status|$?
))
170 function validator_intfield_gt
175 validate_min_max
"$stats" "intfield" "2" "99"
176 status
=$
(($status|$?
))
181 function validator_has_no_event
186 validate_min_max
"$stats" "intfield" "0" "99"
187 status
=$
(($status|$?
))
189 if [ $status -eq 0 ]; then
196 function validator_str_has_no_event
198 validator_has_no_event
"$1"
201 function validator_has_events
206 validate_min_max
"$stats" "intfield" "0" "99"
207 status
=$
(($status|$?
))
212 function validator_str_has_events
217 echo $stats |
grep -q str
218 status
=$
(($status|$?
))
223 function validator_stringfield_has_events
228 echo $stats |
grep -q stringfield
229 status
=$
(($status|$?
))
234 function validator_intfield_ge
239 validate_min_max
"$stats" "intfield" "1" "99"
240 status
=$
(($status|$?
))
245 function validator_intfield_lt
250 validate_min_max
"$stats" "intfield" "0" "1"
251 status
=$
(($status|$?
))
256 function validator_intfield_le
261 validate_min_max
"$stats" "intfield" "0" "2"
262 status
=$
(($status|$?
))
267 function validator_intfield_eq
272 validate_min_max
"$stats" "intfield" "1" "1"
273 status
=$
(($status|$?
))
278 function validator_intfield_ne
283 validate_min_max
"$stats" "intfield" "0" "98"
284 status
=$
(($status|$?
))
289 function validator_intfield_not
294 validate_min_max
"$stats" "intfield" "0" "0"
295 status
=$
(($status|$?
))
300 function validator_intfield_gt_and_longfield_gt
305 validate_min_max
"$stats" "intfield" "43" "99"
306 status
=$
(($status|$?
))
307 validate_min_max
"$stats" "longfield" "43" "99"
308 status
=$
(($status|$?
))
313 function validator_intfield_ge_and_longfield_le
318 validate_min_max
"$stats" "intfield" "42" "42"
319 status
=$
(($status|$?
))
320 validate_min_max
"$stats" "longfield" "42" "42"
321 status
=$
(($status|$?
))
326 function validator_intfield_lt_or_longfield_gt
331 validate_min_max
"$stats" "intfield" "0" "99"
332 status
=$
(($status|$?
))
333 validate_min_max
"$stats" "longfield" "0" "99"
334 status
=$
(($status|$?
))
339 function validator_mixed_str_or_int_and_int
344 validate_min_max
"$stats" "intfield" "34" "99"
345 status
=$
(($status|$?
))
347 validate_min_max
"$stats" "stringfield" "\"test\"" "\"test\""
348 status
=$
(($status|$?
))
353 function validator_mixed_int_double
358 validate_min_max
"$stats" "intfield" "0" "42"
359 status
=$
(($status|$?
))
364 function validator_true_statement
369 validate_min_max
"$stats" "intfield" "0" "99"
370 status
=$
(($status|$?
))
372 validate_min_max
"$stats" "intfield2" "0x0" "0x63"
373 status
=$
(($status|$?
))
375 validate_min_max
"$stats" "longfield" "0" "99"
376 status
=$
(($status|$?
))
378 validate_min_max
"$stats" "netintfield" "0" "99"
379 status
=$
(($status|$?
))
381 validate_min_max
"$stats" "netintfieldhex" "0x0" "0x63"
382 status
=$
(($status|$?
))
384 if [ $KERNEL_CHECK -eq 0 ]; then
385 validate_min_max
"$stats" "floatfield" "2222" "2222"
386 status
=$
(($status|$?
))
388 validate_min_max
"$stats" "doublefield" "2" "2"
389 status
=$
(($status|$?
))
392 validate_min_max
"$stats" "stringfield" "\"test\"" "\"test\""
393 status
=$
(($status|$?
))
395 validate_min_max
"$stats" "stringfield2" ""\
*"" ""\
*""
396 status
=$
(($status|$?
))
401 plan_tests
$NUM_TESTS
403 print_test_banner
"$TEST_DESC"
405 issue_356_filter
="intfield > 0 && intfield > 1 && "
406 issue_356_filter
+="intfield > 2 && intfield > 3 && "
407 issue_356_filter
+="intfield > 4 && intfield > 5 && "
408 issue_356_filter
+="intfield > 6 && intfield > 7 && "
409 issue_356_filter
+="intfield > 8 || intfield > 0"
415 BIN_NAME
="gen-ust-events"
418 # the tests below were written by Kirk Krauss in this article:
419 # http://www.drdobbs.com/architecture-and-design/matching-wildcards-an-empirical-way-to-t/240169123
425 '"mississipissippi" == "*issip*ss*"'
428 '"xxxx\*zzzzzzzzy\*f" == "xxxx*zzy*fffff"'
431 '"xxxx\*zzzzzzzzy\*f" == "xxx*zzy*f"'
434 '"xxxxzzzzzzzzyf" == "xxxx*zzy*fffff"'
437 '"xxxxzzzzzzzzyf" == "xxxx*zzy*f"'
440 '"xyxyxyzyxyz" == "xy*z*xyz"'
443 '"mississippi" == "*sip*"'
446 '"xyxyxyxyz" == "xy*xyz"'
449 '"mississippi" == "mi*sip*"'
452 '"ababac" == "*abac*"'
455 '"ababac" == "*abac*"'
461 '"a12b12" == "*12*23"'
467 '"a12b12" == "*12*12*"'
482 '"XYXYXYZYXYz" == "XY*Z*XYz"'
485 '"missisSIPpi" == "*SIP*"'
488 '"mississipPI" == "*issip*PI"'
491 '"xyxyxyxyz" == "xy*xyz"'
494 '"miSsissippi" == "mi*sip*"'
497 '"miSsissippi" == "mi*Sip*"'
500 '"abAbac" == "*Abac*"'
503 '"abAbac" == "*Abac*"'
509 '"A12b12" == "*12*23"'
512 '"a12B12" == "*12*12*"'
524 '"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab" == "a*a*a*a*a*a*aa*aaa*a*a*b"'
527 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*a*aa*aaa*fa*ga*b*"'
530 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*a*x*aaa*fa*ga*b*"'
533 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*aaaa*fa*ga*gggg*b*"'
536 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*aaaa*fa*ga*ggg*b*"'
539 '"aaabbaabbaab" == "*aabbaa*a*"'
542 '"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*"'
545 '"aaaaaaaaaaaaaaaaa" == "*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*"'
548 '"aaaaaaaaaaaaaaaa" == "*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*"'
551 '"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*"'
554 '"abc\*abcd\*abcde\*abcdef\*abcdefg\*abcdefgh\*abcdefghi\*abcdefghij\*abcdefghijk\*abcdefghijkl\*abcdefghijklm\*abcdefghijklmn" == "abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*"'
557 '"abc\*abcd\*abcd\*abc\*abcd" == "abc*abc*abc*abc*abc"'
560 '"abc\*abc\*abc\*abc\*abc\*abc\*abc\*abc\*abc\*abc\*abcd" == "abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abcd"'
563 # Set IFS to newline to facilitate array declaration
603 intfield_gt_and_longfield_gt
604 "intfield > 1 && longfield > 42"
606 intfield_ge_and_longfield_le
607 "intfield >= 42 && longfield <= 42"
609 intfield_lt_or_longfield_gt
610 "intfield < 1 || longfield > 98"
612 mixed_str_or_int_and_int
613 "(stringfield == \"test\" || intfield != 10) && intfield > 33"
616 "intfield < 42.4242424242"
620 "\"test\" == \"test\""
623 "stringfield == \"test\""
626 "stringfield == \"t*\""
629 "stringfield == \"*\""
663 "1 >= (1 >= (1 >= 1))"
666 "(0x101 & 0x100) == 0x100"
669 "(0x101 | 0x10100) == 0x10101"
672 "(0xF00F0F ^ 0xFF0F00) == 0x0F000F"
684 "(262144 >> 16) == 4"
687 "(~0 & 0xffff) == 0xffff"
690 "(~0 & 0xffffffff) == 0xffffffff"
693 "(~0 & 0xffffffffffffffff) == 0xffffffffffffffff"
698 true_statement
# unsigned bitwise ops
699 "~0>>4==0x0fffffffffffffff"
707 true_statement # comparator is signed, shift is unsigned
711 "(1<<2!=4)==0" # operator priority: shift before equality
714 "1&3==1" # operator priority: masks before equality
717 "(3|1==3)==1" # operator priority: masks before equality
720 "(2^1==3)==1" # operator priority: masks before equality
723 "(1 << 32) == 4294967296"
726 "(1 << 63) == 9223372036854775808"
729 "(arrfield1[2] & 1) == 1"
732 "(arrfield1[2] | 0x111000) == 0x111003"
735 "(arrfield1[0] | arrfield1[1] | arrfield1[2]) == 0x3"
738 "(seqfield4[2] & 1) == 1"
741 "(seqfield4[2] | 0x111000) == 0x111003"
744 "intfield < 0xDEADBEEF"
753 "stringfield2 == \"\\\*\""
756 "1.0 || intfield || 1.0"
786 "\$ctx.procname != \"$BIN_NAME\""
789 "\$ctx.procname == \"$BIN_NAME\""
792 "\"$BIN_NAME\" != \$ctx.procname"
795 "\"$BIN_NAME\" == \$ctx.procname"
798 "\$ctx.procname != \"$BIN_NAME*\""
801 "\$ctx.procname == \"$BIN_NAME*\""
804 "\"$BIN_NAME*\" != \$ctx.procname"
807 "\"$BIN_NAME*\" == \$ctx.procname"
810 "\$ctx.procname != \"*\""
813 "\$ctx.procname == \"*\""
816 "\"*\" != \$ctx.procname"
819 "\"*\" == \$ctx.procname"
825 "a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a"
828 "\$ctx.vtid.blah == 0"
831 "asdf.asdfsd.sadf < 4"
834 "0 == \$ctx.vtid.blah"
836 # check that bytecode linker refuses to link against a
839 'arrfield1 != "dontmatch"'
841 # check that bytecode linker refuses to link against a
842 # non-string sequence.
844 'seqfield1 != "dontmatch"'
851 'str == "hypothecary"'
854 '"hypothecary" == str'
857 'str != "hypothecary"'
860 '"hypothecary" != str'
947 'str == "*po***siz*"'
950 '"*po***siz*" == str'
953 'str != "*po***siz*"'
956 '"*po***siz*" != str'
959 'str == "*po*\**siz*"'
962 '"*po*\**siz*" == str'
989 '"salut*" == "salut vous"'
992 '"salut*" == "salut vous*"'
995 '"salut vous*" == "salut*"'
997 ${KIRK_KRAUSS_TESTS[@]}
1002 if [ ! -x "$CURDIR/$BIN_NAME" ]; then
1003 BAIL_OUT "No UST nevents binary detected."
1008 diag "Test UST valid filters"
1013 validator="${UST_FILTERS[$i]}"
1015 if [ "$validator" = END ]; then
1019 filter="${UST_FILTERS[$(( i + 1 ))]}"
1020 test_valid_filter ust -u "tp:tptest" "$filter" "validator_$validator"
1022 if [ $? -eq 1 ]; then
1032 validator="${UST_STR_FILTERS[$i]}"
1034 if [ "$validator" = END ]; then
1038 filter="${UST_STR_FILTERS[$(( i + 1 ))]}"
1039 test_valid_filter ust_str -u "tp:the_string" "$filter" "validator_$validator"
1041 if [ $? -eq 1 ]; then
1051 BIN_NAME="test_valid_filt" # Current script name truncated by kernel
1053 # One to one mapping between filters and validators
1054 # Set IFS to newline to facilitate array declaration
1094 intfield_gt_and_longfield_gt
1095 "intfield > 1 && longfield > 42"
1097 intfield_ge_and_longfield_le
1098 "intfield >= 42 && longfield <= 42"
1100 intfield_lt_or_longfield_gt
1101 "intfield < 1 || longfield > 98"
1103 mixed_str_or_int_and_int
1104 "(stringfield == \"test\" || intfield != 10) && intfield > 33"
1107 "intfield < 42.4242424242"
1110 "\"test\" == \"test\""
1113 "stringfield == \"test\""
1116 "stringfield == \"t*\""
1119 "stringfield == \"*\""
1152 "1 >= (1 >= (1 >= 1))"
1155 "(0x101 & 0x100) == 0x100"
1158 "(0x101 | 0x10100) == 0x10101"
1161 "(0xF00F0F ^ 0xFF0F00) == 0x0F000F"
1173 "(262144 >> 16) == 4"
1176 "(~0 & 0xffff) == 0xffff"
1179 "(~0 & 0xffffffff) == 0xffffffff"
1182 "(~0 & 0xffffffffffffffff) == 0xffffffffffffffff"
1187 true_statement # unsigned bitwise ops
1188 "~0>>4==0x0fffffffffffffff"
1196 true_statement # comparator is signed, shift is unsigned
1200 "(1<<2!=4)==0" # operator priority: shift before equality
1203 "1&3==1" # operator priority: masks before equality
1206 "(3|1==3)==1" # operator priority: masks before equality
1209 "(2^1==3)==1" # operator priority: masks before equality
1212 "(1 << 32) == 4294967296"
1215 "(1 << 63) == 9223372036854775808"
1218 "(arrfield1[2] & 1) == 1"
1221 "(arrfield1[2] | 0x111000) == 0x111003"
1224 "(arrfield1[0] | arrfield1[1] | arrfield1[2]) == 0x3"
1227 "(seqfield4[2] & 1) == 1"
1230 "(seqfield4[2] | 0x111000) == 0x111003"
1233 "intfield < 0xDEADBEEF"
1242 "stringfield2 == \"\\\*\""
1245 "1.0 || intfield || 1.0"
1275 "\$ctx.procname != \"$BIN_NAME\""
1278 "\$ctx.procname == \"$BIN_NAME\""
1281 "\"$BIN_NAME\" != \$ctx.procname"
1284 "\"$BIN_NAME\" == \$ctx.procname"
1287 "\$ctx.procname != \"$BIN_NAME*\""
1290 "\$ctx.procname == \"$BIN_NAME*\""
1293 "\"$BIN_NAME*\" != \$ctx.procname"
1296 "\"$BIN_NAME*\" == \$ctx.procname"
1299 "\$ctx.procname != \"*\""
1302 "\$ctx.procname == \"*\""
1305 "\"*\" != \$ctx.procname"
1308 "\"*\" == \$ctx.procname"
1314 "a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a"
1317 "\$ctx.vtid.blah == 0"
1320 "asdf.asdfsd.sadf < 4"
1323 "0 == \$ctx.vtid.blah"
1325 stringfield_has_events
1326 'stringfield == "test"'
1328 stringfield_has_events
1329 '"test" == stringfield'
1332 'stringfield != "test"'
1335 '"test" != stringfield'
1337 stringfield_has_events
1338 'stringfield == "*st"'
1340 stringfield_has_events
1341 '"*st" == stringfield'
1344 'stringfield != "*st"'
1347 '"*st" != stringfield'
1349 stringfield_has_events
1350 'stringfield == "te*"'
1352 stringfield_has_events
1353 '"te*" == stringfield'
1356 'stringfield != "te*"'
1359 '"te*" != stringfield'
1361 stringfield_has_events
1362 'stringfield == "te*t"'
1364 stringfield_has_events
1365 '"te*t" == stringfield'
1368 'stringfield != "te*t"'
1371 '"te*t" != stringfield'
1373 stringfield_has_events
1374 'stringfield == "tes*t"'
1376 stringfield_has_events
1377 '"tes*t" == stringfield'
1380 'stringfield != "tes*t"'
1383 '"tes*t" != stringfield'
1385 stringfield_has_events
1386 'stringfield == "*test"'
1388 stringfield_has_events
1389 '"*test" == stringfield'
1392 'stringfield != "*test"'
1395 '"*test" != stringfield'
1397 stringfield_has_events
1398 'stringfield == "test*"'
1400 stringfield_has_events
1401 '"test*" == stringfield'
1404 'stringfield != "test*"'
1407 '"test*" != stringfield'
1409 stringfield_has_events
1410 'stringfield == "*"'
1412 stringfield_has_events
1413 '"*" == stringfield'
1416 'stringfield != "*"'
1419 '"*" != stringfield'
1422 'stringfield == "test*2"'
1425 'stringfield == "2*test"'
1428 'stringfield == "te\*st"'
1431 'stringfield == "te*ts"'
1434 'stringfield == "*\*test"'
1437 'stringfield == "test\*"'
1439 # check that bytecode linker refuses to link against a
1442 'arrfield1 != "dontmatch"'
1444 # check that bytecode linker refuses to link against a
1445 # non-string sequence.
1447 'seqfield1 != "dontmatch"'
1449 ${KIRK_KRAUSS_TESTS[@]}
1456 if [ "$(id -u)" == "0" ]; then
1462 skip $isroot "Root access is needed. Skipping all kernel valid filter tests." $NUM_KERNEL_TESTS ||
1464 diag "Test kernel valid filters"
1471 validator="${KERNEL_FILTERS[$i]}"
1473 if [ "$validator" = END ]; then
1477 filter="${KERNEL_FILTERS[$(( i + 1 ))]}"
1478 test_valid_filter kernel -k "lttng_test_filter_event" "$filter" "validator_$validator"
1480 if [ $? -eq 1 ]; then
1488 modprobe --remove lttng-test