3 # Copyright (C) - 2012 Christian Babeux <christian.babeux@efficios.com>
5 # This program is free software; you can redistribute it and/or modify it
6 # under the terms of the GNU General Public License, version 2 only, as
7 # published by the Free Software Foundation.
9 # This program is distributed in the hope that it will be useful, but WITHOUT
10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 # You should have received a copy of the GNU General Public License along with
15 # this program; if not, write to the Free Software Foundation, Inc., 51
16 # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 TEST_DESC
="Filtering - Valid filters"
21 TESTDIR
=$CURDIR/..
/..
/..
22 STATS_BIN
="$TESTDIR/utils/babelstats.pl"
23 SESSION_NAME
="valid_filter"
28 NUM_TESTS
=$
(($NUM_UST_TESTS+$NUM_KERNEL_TESTS+$NUM_GLOBAL_TESTS))
30 source $TESTDIR/utils
/utils.sh
32 function enable_lttng_event_filter
()
39 $TESTDIR/..
/src
/bin
/lttng
/$LTTNG_BIN enable-event
$event_name \
40 -s $sess_name $domain --filter "$filter" 2>&1 >/dev
/null
41 $TESTDIR/..
/src
/bin
/lttng
/$LTTNG_BIN add-context \
42 -s $sess_name $domain -t procname
2>&1 >/dev
/null
44 ok $?
"Enable lttng event with filtering"
49 .
/$CURDIR/$BIN_NAME $NR_ITER >/dev
/null
2>&1
54 $TESTDIR/utils
/testapp
/gen-ust-nevents-str
/gen-ust-nevents-str
$NR_ITER \
96 # Trigger the event for 100 iterations
97 echo -n "100" > /proc
/lttng-test-filter-event
100 function test_valid_filter
108 diag
"Test valid $domain_name filter: $filter"
110 trace_path
=$
(mktemp
-d)
113 create_lttng_session_ok
$SESSION_NAME $trace_path
116 enable_lttng_event_filter
$domain $SESSION_NAME "$event_name" "$filter"
119 start_lttng_tracing_ok
$SESSION_NAME
121 stop_lttng_tracing_ok
$SESSION_NAME
124 destroy_lttng_session_ok
$SESSION_NAME
126 stats
=`babeltrace $trace_path | $STATS_BIN --tracepoint $event_name`
132 ok $?
"Validate trace filter output"
137 function validate_min_max
144 echo $stats |
grep -q "$field $expected_min $expected_max"
149 function validator_intfield
154 validate_min_max
"$stats" "intfield" "1" "99"
155 status
=$
(($status|$?
))
157 validate_min_max
"$stats" "intfield2" "0x1" "0x63"
158 status
=$
(($status|$?
))
160 validate_min_max
"$stats" "longfield" "1" "99"
161 status
=$
(($status|$?
))
163 validate_min_max
"$stats" "netintfield" "1" "99"
164 status
=$
(($status|$?
))
166 validate_min_max
"$stats" "netintfieldhex" "0x1" "0x63"
167 status
=$
(($status|$?
))
169 if [ $KERNEL_CHECK -eq 0 ]; then
170 validate_min_max
"$stats" "floatfield" "2222" "2222"
171 status
=$
(($status|$?
))
173 validate_min_max
"$stats" "doublefield" "2" "2"
174 status
=$
(($status|$?
))
180 function validator_intfield_gt
185 validate_min_max
"$stats" "intfield" "2" "99"
186 status
=$
(($status|$?
))
191 function validator_has_no_event
196 validate_min_max
"$stats" "intfield" "0" "99"
197 status
=$
(($status|$?
))
199 if [ $status -eq 0 ]; then
206 function validator_str_has_no_event
208 validator_has_no_event
"$1"
211 function validator_has_events
216 validate_min_max
"$stats" "intfield" "0" "99"
217 status
=$
(($status|$?
))
222 function validator_str_has_events
227 echo $stats |
grep -q str
228 status
=$
(($status|$?
))
233 function validator_stringfield_has_events
238 echo $stats |
grep -q stringfield
239 status
=$
(($status|$?
))
244 function validator_intfield_ge
249 validate_min_max
"$stats" "intfield" "1" "99"
250 status
=$
(($status|$?
))
255 function validator_intfield_lt
260 validate_min_max
"$stats" "intfield" "0" "1"
261 status
=$
(($status|$?
))
266 function validator_intfield_le
271 validate_min_max
"$stats" "intfield" "0" "2"
272 status
=$
(($status|$?
))
277 function validator_intfield_eq
282 validate_min_max
"$stats" "intfield" "1" "1"
283 status
=$
(($status|$?
))
288 function validator_intfield_ne
293 validate_min_max
"$stats" "intfield" "0" "98"
294 status
=$
(($status|$?
))
299 function validator_intfield_not
304 validate_min_max
"$stats" "intfield" "0" "0"
305 status
=$
(($status|$?
))
310 function validator_intfield_gt_and_longfield_gt
315 validate_min_max
"$stats" "intfield" "43" "99"
316 status
=$
(($status|$?
))
317 validate_min_max
"$stats" "longfield" "43" "99"
318 status
=$
(($status|$?
))
323 function validator_intfield_ge_and_longfield_le
328 validate_min_max
"$stats" "intfield" "42" "42"
329 status
=$
(($status|$?
))
330 validate_min_max
"$stats" "longfield" "42" "42"
331 status
=$
(($status|$?
))
336 function validator_intfield_lt_or_longfield_gt
341 validate_min_max
"$stats" "intfield" "0" "99"
342 status
=$
(($status|$?
))
343 validate_min_max
"$stats" "longfield" "0" "99"
344 status
=$
(($status|$?
))
349 function validator_mixed_str_or_int_and_int
354 validate_min_max
"$stats" "intfield" "34" "99"
355 status
=$
(($status|$?
))
357 validate_min_max
"$stats" "stringfield" "\"test\"" "\"test\""
358 status
=$
(($status|$?
))
363 function validator_mixed_int_double
368 validate_min_max
"$stats" "intfield" "0" "42"
369 status
=$
(($status|$?
))
374 function validator_true_statement
379 validate_min_max
"$stats" "intfield" "0" "99"
380 status
=$
(($status|$?
))
382 validate_min_max
"$stats" "intfield2" "0x0" "0x63"
383 status
=$
(($status|$?
))
385 validate_min_max
"$stats" "longfield" "0" "99"
386 status
=$
(($status|$?
))
388 validate_min_max
"$stats" "netintfield" "0" "99"
389 status
=$
(($status|$?
))
391 validate_min_max
"$stats" "netintfieldhex" "0x0" "0x63"
392 status
=$
(($status|$?
))
394 if [ $KERNEL_CHECK -eq 0 ]; then
395 validate_min_max
"$stats" "floatfield" "2222" "2222"
396 status
=$
(($status|$?
))
398 validate_min_max
"$stats" "doublefield" "2" "2"
399 status
=$
(($status|$?
))
402 validate_min_max
"$stats" "stringfield" "\"test\"" "\"test\""
403 status
=$
(($status|$?
))
405 validate_min_max
"$stats" "stringfield2" ""\
*"" ""\
*""
406 status
=$
(($status|$?
))
411 plan_tests
$NUM_TESTS
413 print_test_banner
"$TEST_DESC"
415 issue_356_filter
="intfield > 0 && intfield > 1 && "
416 issue_356_filter
+="intfield > 2 && intfield > 3 && "
417 issue_356_filter
+="intfield > 4 && intfield > 5 && "
418 issue_356_filter
+="intfield > 6 && intfield > 7 && "
419 issue_356_filter
+="intfield > 8 || intfield > 0"
425 BIN_NAME
="gen-ust-events"
428 # the tests below were written by Kirk Krauss in this article:
429 # http://www.drdobbs.com/architecture-and-design/matching-wildcards-an-empirical-way-to-t/240169123
435 '"mississipissippi" == "*issip*ss*"'
438 '"xxxx\*zzzzzzzzy\*f" == "xxxx*zzy*fffff"'
441 '"xxxx\*zzzzzzzzy\*f" == "xxx*zzy*f"'
444 '"xxxxzzzzzzzzyf" == "xxxx*zzy*fffff"'
447 '"xxxxzzzzzzzzyf" == "xxxx*zzy*f"'
450 '"xyxyxyzyxyz" == "xy*z*xyz"'
453 '"mississippi" == "*sip*"'
456 '"xyxyxyxyz" == "xy*xyz"'
459 '"mississippi" == "mi*sip*"'
462 '"ababac" == "*abac*"'
465 '"ababac" == "*abac*"'
471 '"a12b12" == "*12*23"'
477 '"a12b12" == "*12*12*"'
492 '"XYXYXYZYXYz" == "XY*Z*XYz"'
495 '"missisSIPpi" == "*SIP*"'
498 '"mississipPI" == "*issip*PI"'
501 '"xyxyxyxyz" == "xy*xyz"'
504 '"miSsissippi" == "mi*sip*"'
507 '"miSsissippi" == "mi*Sip*"'
510 '"abAbac" == "*Abac*"'
513 '"abAbac" == "*Abac*"'
519 '"A12b12" == "*12*23"'
522 '"a12B12" == "*12*12*"'
534 '"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab" == "a*a*a*a*a*a*aa*aaa*a*a*b"'
537 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*a*aa*aaa*fa*ga*b*"'
540 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*a*x*aaa*fa*ga*b*"'
543 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*aaaa*fa*ga*gggg*b*"'
546 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*aaaa*fa*ga*ggg*b*"'
549 '"aaabbaabbaab" == "*aabbaa*a*"'
552 '"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*"'
555 '"aaaaaaaaaaaaaaaaa" == "*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*"'
558 '"aaaaaaaaaaaaaaaa" == "*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*"'
561 '"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*"'
564 '"abc\*abcd\*abcde\*abcdef\*abcdefg\*abcdefgh\*abcdefghi\*abcdefghij\*abcdefghijk\*abcdefghijkl\*abcdefghijklm\*abcdefghijklmn" == "abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*"'
567 '"abc\*abcd\*abcd\*abc\*abcd" == "abc*abc*abc*abc*abc"'
570 '"abc\*abc\*abc\*abc\*abc\*abc\*abc\*abc\*abc\*abc\*abcd" == "abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abcd"'
573 # Set IFS to newline to facilitate array declaration
613 intfield_gt_and_longfield_gt
614 "intfield > 1 && longfield > 42"
616 intfield_ge_and_longfield_le
617 "intfield >= 42 && longfield <= 42"
619 intfield_lt_or_longfield_gt
620 "intfield < 1 || longfield > 98"
622 mixed_str_or_int_and_int
623 "(stringfield == \"test\" || intfield != 10) && intfield > 33"
626 "intfield < 42.4242424242"
630 "\"test\" == \"test\""
633 "stringfield == \"test\""
636 "stringfield == \"t*\""
639 "stringfield == \"*\""
673 "1 >= (1 >= (1 >= 1))"
676 "(0x101 & 0x100) == 0x100"
679 "(0x101 | 0x10100) == 0x10101"
682 "(0xF00F0F ^ 0xFF0F00) == 0x0F000F"
694 "(262144 >> 16) == 4"
697 "(~0 & 0xffff) == 0xffff"
700 "(~0 & 0xffffffff) == 0xffffffff"
703 "(~0 & 0xffffffffffffffff) == 0xffffffffffffffff"
708 true_statement
# unsigned bitwise ops
709 "~0>>4==0x0fffffffffffffff"
717 true_statement # comparator is signed, shift is unsigned
721 "(1<<2!=4)==0" # operator priority: shift before equality
724 "1&3==1" # operator priority: masks before equality
727 "(3|1==3)==1" # operator priority: masks before equality
730 "(2^1==3)==1" # operator priority: masks before equality
733 "(1 << 32) == 4294967296"
736 "(1 << 63) == 9223372036854775808"
739 "(arrfield1[2] & 1) == 1"
742 "(arrfield1[2] | 0x111000) == 0x111003"
745 "(arrfield1[0] | arrfield1[1] | arrfield1[2]) == 0x3"
748 "(seqfield4[2] & 1) == 1"
751 "(seqfield4[2] | 0x111000) == 0x111003"
754 "intfield < 0xDEADBEEF"
763 "stringfield2 == \"\\\*\""
766 "1.0 || intfield || 1.0"
796 "\$ctx.procname != \"$BIN_NAME\""
799 "\$ctx.procname == \"$BIN_NAME\""
802 "\"$BIN_NAME\" != \$ctx.procname"
805 "\"$BIN_NAME\" == \$ctx.procname"
808 "\$ctx.procname != \"$BIN_NAME*\""
811 "\$ctx.procname == \"$BIN_NAME*\""
814 "\"$BIN_NAME*\" != \$ctx.procname"
817 "\"$BIN_NAME*\" == \$ctx.procname"
820 "\$ctx.procname != \"*\""
823 "\$ctx.procname == \"*\""
826 "\"*\" != \$ctx.procname"
829 "\"*\" == \$ctx.procname"
835 "a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a"
838 "\$ctx.vtid.blah == 0"
841 "asdf.asdfsd.sadf < 4"
844 "0 == \$ctx.vtid.blah"
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 ${KIRK_KRAUSS_TESTS[@]}
1446 if [ "$(id -u)" == "0" ]; then
1452 skip $isroot "Root access is needed. Skipping all kernel valid filter tests." $NUM_KERNEL_TESTS ||
1454 diag "Test kernel valid filters"
1461 validator="${KERNEL_FILTERS[$i]}"
1463 if [ "$validator" = END ]; then
1467 filter="${KERNEL_FILTERS[$(( i + 1 ))]}"
1468 test_valid_filter kernel -k "lttng_test_filter_event" "$filter" "validator_$validator"
1470 if [ $? -eq 1 ]; then