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
--tmpdir -d 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 $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 issue_356_filter
="intfield > 0 && intfield > 1 && "
405 issue_356_filter
+="intfield > 2 && intfield > 3 && "
406 issue_356_filter
+="intfield > 4 && intfield > 5 && "
407 issue_356_filter
+="intfield > 6 && intfield > 7 && "
408 issue_356_filter
+="intfield > 8 || intfield > 0"
414 BIN_NAME
="gen-ust-events"
417 # the tests below were written by Kirk Krauss in this article:
418 # http://www.drdobbs.com/architecture-and-design/matching-wildcards-an-empirical-way-to-t/240169123
424 '"mississipissippi" == "*issip*ss*"'
427 '"xxxx\*zzzzzzzzy\*f" == "xxxx*zzy*fffff"'
430 '"xxxx\*zzzzzzzzy\*f" == "xxx*zzy*f"'
433 '"xxxxzzzzzzzzyf" == "xxxx*zzy*fffff"'
436 '"xxxxzzzzzzzzyf" == "xxxx*zzy*f"'
439 '"xyxyxyzyxyz" == "xy*z*xyz"'
442 '"mississippi" == "*sip*"'
445 '"xyxyxyxyz" == "xy*xyz"'
448 '"mississippi" == "mi*sip*"'
451 '"ababac" == "*abac*"'
454 '"ababac" == "*abac*"'
460 '"a12b12" == "*12*23"'
466 '"a12b12" == "*12*12*"'
481 '"XYXYXYZYXYz" == "XY*Z*XYz"'
484 '"missisSIPpi" == "*SIP*"'
487 '"mississipPI" == "*issip*PI"'
490 '"xyxyxyxyz" == "xy*xyz"'
493 '"miSsissippi" == "mi*sip*"'
496 '"miSsissippi" == "mi*Sip*"'
499 '"abAbac" == "*Abac*"'
502 '"abAbac" == "*Abac*"'
508 '"A12b12" == "*12*23"'
511 '"a12B12" == "*12*12*"'
523 '"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab" == "a*a*a*a*a*a*aa*aaa*a*a*b"'
526 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*a*aa*aaa*fa*ga*b*"'
529 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*a*x*aaa*fa*ga*b*"'
532 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*aaaa*fa*ga*gggg*b*"'
535 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*aaaa*fa*ga*ggg*b*"'
538 '"aaabbaabbaab" == "*aabbaa*a*"'
541 '"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*"'
544 '"aaaaaaaaaaaaaaaaa" == "*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*"'
547 '"aaaaaaaaaaaaaaaa" == "*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*"'
550 '"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*"'
553 '"abc\*abcd\*abcde\*abcdef\*abcdefg\*abcdefgh\*abcdefghi\*abcdefghij\*abcdefghijk\*abcdefghijkl\*abcdefghijklm\*abcdefghijklmn" == "abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*"'
556 '"abc\*abcd\*abcd\*abc\*abcd" == "abc*abc*abc*abc*abc"'
559 '"abc\*abc\*abc\*abc\*abc\*abc\*abc\*abc\*abc\*abc\*abcd" == "abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abcd"'
562 # Set IFS to newline to facilitate array declaration
602 intfield_gt_and_longfield_gt
603 "intfield > 1 && longfield > 42"
605 intfield_ge_and_longfield_le
606 "intfield >= 42 && longfield <= 42"
608 intfield_lt_or_longfield_gt
609 "intfield < 1 || longfield > 98"
611 mixed_str_or_int_and_int
612 "(stringfield == \"test\" || intfield != 10) && intfield > 33"
615 "intfield < 42.4242424242"
619 "\"test\" == \"test\""
622 "stringfield == \"test\""
625 "stringfield == \"t*\""
628 "stringfield == \"*\""
662 "1 >= (1 >= (1 >= 1))"
665 "(0x101 & 0x100) == 0x100"
668 "(0x101 | 0x10100) == 0x10101"
671 "(0xF00F0F ^ 0xFF0F00) == 0x0F000F"
683 "(262144 >> 16) == 4"
686 "(~0 & 0xffff) == 0xffff"
689 "(~0 & 0xffffffff) == 0xffffffff"
692 "(~0 & 0xffffffffffffffff) == 0xffffffffffffffff"
697 true_statement
# unsigned bitwise ops
698 "~0>>4==0x0fffffffffffffff"
706 true_statement # comparator is signed, shift is unsigned
710 "(1<<2!=4)==0" # operator priority: shift before equality
713 "1&3==1" # operator priority: masks before equality
716 "(3|1==3)==1" # operator priority: masks before equality
719 "(2^1==3)==1" # operator priority: masks before equality
722 "(1 << 32) == 4294967296"
725 "(1 << 63) == 9223372036854775808"
728 "(arrfield1[2] & 1) == 1"
731 "(arrfield1[2] | 0x111000) == 0x111003"
734 "(arrfield1[0] | arrfield1[1] | arrfield1[2]) == 0x3"
737 "(seqfield4[2] & 1) == 1"
740 "(seqfield4[2] | 0x111000) == 0x111003"
743 "intfield < 0xDEADBEEF"
752 "stringfield2 == \"\\\*\""
755 "1.0 || intfield || 1.0"
785 "\$ctx.procname != \"$BIN_NAME\""
788 "\$ctx.procname == \"$BIN_NAME\""
791 "\"$BIN_NAME\" != \$ctx.procname"
794 "\"$BIN_NAME\" == \$ctx.procname"
797 "\$ctx.procname != \"$BIN_NAME*\""
800 "\$ctx.procname == \"$BIN_NAME*\""
803 "\"$BIN_NAME*\" != \$ctx.procname"
806 "\"$BIN_NAME*\" == \$ctx.procname"
809 "\$ctx.procname != \"*\""
812 "\$ctx.procname == \"*\""
815 "\"*\" != \$ctx.procname"
818 "\"*\" == \$ctx.procname"
824 "a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a"
827 "\$ctx.vtid.blah == 0"
830 "asdf.asdfsd.sadf < 4"
833 "0 == \$ctx.vtid.blah"
835 # check that bytecode linker refuses to link against a
838 'arrfield1 != "dontmatch"'
840 # check that bytecode linker refuses to link against a
841 # non-string sequence.
843 'seqfield1 != "dontmatch"'
850 'str == "hypothecary"'
853 '"hypothecary" == str'
856 'str != "hypothecary"'
859 '"hypothecary" != str'
946 'str == "*po***siz*"'
949 '"*po***siz*" == str'
952 'str != "*po***siz*"'
955 '"*po***siz*" != str'
958 'str == "*po*\**siz*"'
961 '"*po*\**siz*" == str'
988 '"salut*" == "salut vous"'
991 '"salut*" == "salut vous*"'
994 '"salut vous*" == "salut*"'
996 ${KIRK_KRAUSS_TESTS[@]}
1001 if [ ! -x "$CURDIR/$BIN_NAME" ]; then
1002 BAIL_OUT "No UST nevents binary detected."
1007 diag "Test UST valid filters"
1012 validator="${UST_FILTERS[$i]}"
1014 if [ "$validator" = END ]; then
1018 filter="${UST_FILTERS[$(( i + 1 ))]}"
1019 test_valid_filter ust -u "tp:tptest" "$filter" "validator_$validator"
1021 if [ $? -eq 1 ]; then
1031 validator="${UST_STR_FILTERS[$i]}"
1033 if [ "$validator" = END ]; then
1037 filter="${UST_STR_FILTERS[$(( i + 1 ))]}"
1038 test_valid_filter ust_str -u "tp:the_string" "$filter" "validator_$validator"
1040 if [ $? -eq 1 ]; then
1050 BIN_NAME="test_valid_filt" # Current script name truncated by kernel
1052 # One to one mapping between filters and validators
1053 # Set IFS to newline to facilitate array declaration
1093 intfield_gt_and_longfield_gt
1094 "intfield > 1 && longfield > 42"
1096 intfield_ge_and_longfield_le
1097 "intfield >= 42 && longfield <= 42"
1099 intfield_lt_or_longfield_gt
1100 "intfield < 1 || longfield > 98"
1102 mixed_str_or_int_and_int
1103 "(stringfield == \"test\" || intfield != 10) && intfield > 33"
1106 "intfield < 42.4242424242"
1109 "\"test\" == \"test\""
1112 "stringfield == \"test\""
1115 "stringfield == \"t*\""
1118 "stringfield == \"*\""
1151 "1 >= (1 >= (1 >= 1))"
1154 "(0x101 & 0x100) == 0x100"
1157 "(0x101 | 0x10100) == 0x10101"
1160 "(0xF00F0F ^ 0xFF0F00) == 0x0F000F"
1172 "(262144 >> 16) == 4"
1175 "(~0 & 0xffff) == 0xffff"
1178 "(~0 & 0xffffffff) == 0xffffffff"
1181 "(~0 & 0xffffffffffffffff) == 0xffffffffffffffff"
1186 true_statement # unsigned bitwise ops
1187 "~0>>4==0x0fffffffffffffff"
1195 true_statement # comparator is signed, shift is unsigned
1199 "(1<<2!=4)==0" # operator priority: shift before equality
1202 "1&3==1" # operator priority: masks before equality
1205 "(3|1==3)==1" # operator priority: masks before equality
1208 "(2^1==3)==1" # operator priority: masks before equality
1211 "(1 << 32) == 4294967296"
1214 "(1 << 63) == 9223372036854775808"
1217 "(arrfield1[2] & 1) == 1"
1220 "(arrfield1[2] | 0x111000) == 0x111003"
1223 "(arrfield1[0] | arrfield1[1] | arrfield1[2]) == 0x3"
1226 "(seqfield4[2] & 1) == 1"
1229 "(seqfield4[2] | 0x111000) == 0x111003"
1232 "intfield < 0xDEADBEEF"
1241 "stringfield2 == \"\\\*\""
1244 "1.0 || intfield || 1.0"
1274 "\$ctx.procname != \"$BIN_NAME\""
1277 "\$ctx.procname == \"$BIN_NAME\""
1280 "\"$BIN_NAME\" != \$ctx.procname"
1283 "\"$BIN_NAME\" == \$ctx.procname"
1286 "\$ctx.procname != \"$BIN_NAME*\""
1289 "\$ctx.procname == \"$BIN_NAME*\""
1292 "\"$BIN_NAME*\" != \$ctx.procname"
1295 "\"$BIN_NAME*\" == \$ctx.procname"
1298 "\$ctx.procname != \"*\""
1301 "\$ctx.procname == \"*\""
1304 "\"*\" != \$ctx.procname"
1307 "\"*\" == \$ctx.procname"
1313 "a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a"
1316 "\$ctx.vtid.blah == 0"
1319 "asdf.asdfsd.sadf < 4"
1322 "0 == \$ctx.vtid.blah"
1324 stringfield_has_events
1325 'stringfield == "test"'
1327 stringfield_has_events
1328 '"test" == stringfield'
1331 'stringfield != "test"'
1334 '"test" != stringfield'
1336 stringfield_has_events
1337 'stringfield == "*st"'
1339 stringfield_has_events
1340 '"*st" == stringfield'
1343 'stringfield != "*st"'
1346 '"*st" != stringfield'
1348 stringfield_has_events
1349 'stringfield == "te*"'
1351 stringfield_has_events
1352 '"te*" == stringfield'
1355 'stringfield != "te*"'
1358 '"te*" != stringfield'
1360 stringfield_has_events
1361 'stringfield == "te*t"'
1363 stringfield_has_events
1364 '"te*t" == stringfield'
1367 'stringfield != "te*t"'
1370 '"te*t" != stringfield'
1372 stringfield_has_events
1373 'stringfield == "tes*t"'
1375 stringfield_has_events
1376 '"tes*t" == stringfield'
1379 'stringfield != "tes*t"'
1382 '"tes*t" != stringfield'
1384 stringfield_has_events
1385 'stringfield == "*test"'
1387 stringfield_has_events
1388 '"*test" == stringfield'
1391 'stringfield != "*test"'
1394 '"*test" != stringfield'
1396 stringfield_has_events
1397 'stringfield == "test*"'
1399 stringfield_has_events
1400 '"test*" == stringfield'
1403 'stringfield != "test*"'
1406 '"test*" != stringfield'
1408 stringfield_has_events
1409 'stringfield == "*"'
1411 stringfield_has_events
1412 '"*" == stringfield'
1415 'stringfield != "*"'
1418 '"*" != stringfield'
1421 'stringfield == "test*2"'
1424 'stringfield == "2*test"'
1427 'stringfield == "te\*st"'
1430 'stringfield == "te*ts"'
1433 'stringfield == "*\*test"'
1436 'stringfield == "test\*"'
1438 # check that bytecode linker refuses to link against a
1441 'arrfield1 != "dontmatch"'
1443 # check that bytecode linker refuses to link against a
1444 # non-string sequence.
1446 'seqfield1 != "dontmatch"'
1448 ${KIRK_KRAUSS_TESTS[@]}
1455 if [ "$(id -u)" == "0" ]; then
1461 skip $isroot "Root access is needed. Skipping all kernel valid filter tests." $NUM_KERNEL_TESTS ||
1463 diag "Test kernel valid filters"
1470 validator="${KERNEL_FILTERS[$i]}"
1472 if [ "$validator" = END ]; then
1476 filter="${KERNEL_FILTERS[$(( i + 1 ))]}"
1477 test_valid_filter kernel -k "lttng_test_filter_event" "$filter" "validator_$validator"
1479 if [ $? -eq 1 ]; then
1487 modprobe --remove lttng-test