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"
841 'str == "hypothecary"'
844 '"hypothecary" == str'
847 'str != "hypothecary"'
850 '"hypothecary" != str'
937 'str == "*po***siz*"'
940 '"*po***siz*" == str'
943 'str != "*po***siz*"'
946 '"*po***siz*" != str'
949 'str == "*po*\**siz*"'
952 '"*po*\**siz*" == str'
979 '"salut*" == "salut vous"'
982 '"salut*" == "salut vous*"'
985 '"salut vous*" == "salut*"'
987 ${KIRK_KRAUSS_TESTS[@]}
992 if [ ! -x "$CURDIR/$BIN_NAME" ]; then
993 BAIL_OUT "No UST nevents binary detected."
998 diag "Test UST valid filters"
1003 validator="${UST_FILTERS[$i]}"
1005 if [ "$validator" = END ]; then
1009 filter="${UST_FILTERS[$(( i + 1 ))]}"
1010 test_valid_filter ust -u "tp:tptest" "$filter" "validator_$validator"
1012 if [ $? -eq 1 ]; then
1022 validator="${UST_STR_FILTERS[$i]}"
1024 if [ "$validator" = END ]; then
1028 filter="${UST_STR_FILTERS[$(( i + 1 ))]}"
1029 test_valid_filter ust_str -u "tp:the_string" "$filter" "validator_$validator"
1031 if [ $? -eq 1 ]; then
1041 BIN_NAME="test_valid_filt" # Current script name truncated by kernel
1043 # One to one mapping between filters and validators
1044 # Set IFS to newline to facilitate array declaration
1084 intfield_gt_and_longfield_gt
1085 "intfield > 1 && longfield > 42"
1087 intfield_ge_and_longfield_le
1088 "intfield >= 42 && longfield <= 42"
1090 intfield_lt_or_longfield_gt
1091 "intfield < 1 || longfield > 98"
1093 mixed_str_or_int_and_int
1094 "(stringfield == \"test\" || intfield != 10) && intfield > 33"
1097 "intfield < 42.4242424242"
1100 "\"test\" == \"test\""
1103 "stringfield == \"test\""
1106 "stringfield == \"t*\""
1109 "stringfield == \"*\""
1142 "1 >= (1 >= (1 >= 1))"
1145 "(0x101 & 0x100) == 0x100"
1148 "(0x101 | 0x10100) == 0x10101"
1151 "(0xF00F0F ^ 0xFF0F00) == 0x0F000F"
1163 "(262144 >> 16) == 4"
1166 "(~0 & 0xffff) == 0xffff"
1169 "(~0 & 0xffffffff) == 0xffffffff"
1172 "(~0 & 0xffffffffffffffff) == 0xffffffffffffffff"
1177 true_statement # unsigned bitwise ops
1178 "~0>>4==0x0fffffffffffffff"
1186 true_statement # comparator is signed, shift is unsigned
1190 "(1<<2!=4)==0" # operator priority: shift before equality
1193 "1&3==1" # operator priority: masks before equality
1196 "(3|1==3)==1" # operator priority: masks before equality
1199 "(2^1==3)==1" # operator priority: masks before equality
1202 "(1 << 32) == 4294967296"
1205 "(1 << 63) == 9223372036854775808"
1208 "(arrfield1[2] & 1) == 1"
1211 "(arrfield1[2] | 0x111000) == 0x111003"
1214 "(arrfield1[0] | arrfield1[1] | arrfield1[2]) == 0x3"
1217 "(seqfield4[2] & 1) == 1"
1220 "(seqfield4[2] | 0x111000) == 0x111003"
1223 "intfield < 0xDEADBEEF"
1232 "stringfield2 == \"\\\*\""
1235 "1.0 || intfield || 1.0"
1265 "\$ctx.procname != \"$BIN_NAME\""
1268 "\$ctx.procname == \"$BIN_NAME\""
1271 "\"$BIN_NAME\" != \$ctx.procname"
1274 "\"$BIN_NAME\" == \$ctx.procname"
1277 "\$ctx.procname != \"$BIN_NAME*\""
1280 "\$ctx.procname == \"$BIN_NAME*\""
1283 "\"$BIN_NAME*\" != \$ctx.procname"
1286 "\"$BIN_NAME*\" == \$ctx.procname"
1289 "\$ctx.procname != \"*\""
1292 "\$ctx.procname == \"*\""
1295 "\"*\" != \$ctx.procname"
1298 "\"*\" == \$ctx.procname"
1304 "a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a"
1307 "\$ctx.vtid.blah == 0"
1310 "asdf.asdfsd.sadf < 4"
1313 "0 == \$ctx.vtid.blah"
1315 stringfield_has_events
1316 'stringfield == "test"'
1318 stringfield_has_events
1319 '"test" == stringfield'
1322 'stringfield != "test"'
1325 '"test" != stringfield'
1327 stringfield_has_events
1328 'stringfield == "*st"'
1330 stringfield_has_events
1331 '"*st" == stringfield'
1334 'stringfield != "*st"'
1337 '"*st" != stringfield'
1339 stringfield_has_events
1340 'stringfield == "te*"'
1342 stringfield_has_events
1343 '"te*" == stringfield'
1346 'stringfield != "te*"'
1349 '"te*" != stringfield'
1351 stringfield_has_events
1352 'stringfield == "te*t"'
1354 stringfield_has_events
1355 '"te*t" == stringfield'
1358 'stringfield != "te*t"'
1361 '"te*t" != stringfield'
1363 stringfield_has_events
1364 'stringfield == "tes*t"'
1366 stringfield_has_events
1367 '"tes*t" == stringfield'
1370 'stringfield != "tes*t"'
1373 '"tes*t" != stringfield'
1375 stringfield_has_events
1376 'stringfield == "*test"'
1378 stringfield_has_events
1379 '"*test" == stringfield'
1382 'stringfield != "*test"'
1385 '"*test" != stringfield'
1387 stringfield_has_events
1388 'stringfield == "test*"'
1390 stringfield_has_events
1391 '"test*" == stringfield'
1394 'stringfield != "test*"'
1397 '"test*" != stringfield'
1399 stringfield_has_events
1400 'stringfield == "*"'
1402 stringfield_has_events
1403 '"*" == stringfield'
1406 'stringfield != "*"'
1409 '"*" != stringfield'
1412 'stringfield == "test*2"'
1415 'stringfield == "2*test"'
1418 'stringfield == "te\*st"'
1421 'stringfield == "te*ts"'
1424 'stringfield == "*\*test"'
1427 'stringfield == "test\*"'
1429 ${KIRK_KRAUSS_TESTS[@]}
1436 if [ "$(id -u)" == "0" ]; then
1442 skip $isroot "Root access is needed. Skipping all kernel valid filter tests." $NUM_KERNEL_TESTS ||
1444 diag "Test kernel valid filters"
1451 validator="${KERNEL_FILTERS[$i]}"
1453 if [ "$validator" = END ]; then
1457 filter="${KERNEL_FILTERS[$(( i + 1 ))]}"
1458 test_valid_filter kernel -k "lttng_test_filter_event" "$filter" "validator_$validator"
1460 if [ $? -eq 1 ]; then
1468 modprobe --remove lttng-test