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/..
/..
/..
23 STATS_BIN
="$TESTDIR/utils/babelstats.pl"
24 SESSION_NAME
="valid_filter"
29 NUM_TESTS
=$
(($NUM_UST_TESTS+$NUM_KERNEL_TESTS+$NUM_GLOBAL_TESTS))
31 source $TESTDIR/utils
/utils.sh
33 function enable_lttng_event_filter
()
40 $TESTDIR/..
/src
/bin
/lttng
/$LTTNG_BIN enable-event
$event_name \
41 -s $sess_name $domain --filter "$filter" 2>&1 >/dev
/null
42 $TESTDIR/..
/src
/bin
/lttng
/$LTTNG_BIN add-context \
43 -s $sess_name $domain -t procname
2>&1 >/dev
/null
45 ok $?
"Enable lttng event with filtering"
50 .
/$CURDIR/$BIN_NAME $NR_ITER >/dev
/null
2>&1
55 $TESTDIR/utils
/testapp
/gen-ust-nevents-str
/gen-ust-nevents-str
$NR_ITER \
97 # Trigger the event for 100 iterations
98 echo -n "100" > /proc
/lttng-test-filter-event
101 function test_valid_filter
109 diag
"Test valid $domain_name filter: $filter"
111 trace_path
=$
(mktemp
-d)
114 create_lttng_session_ok
$SESSION_NAME $trace_path
117 enable_lttng_event_filter
$domain $SESSION_NAME "$event_name" "$filter"
120 start_lttng_tracing_ok
$SESSION_NAME
122 stop_lttng_tracing_ok
$SESSION_NAME
125 destroy_lttng_session_ok
$SESSION_NAME
127 stats
=`babeltrace $trace_path | $STATS_BIN --tracepoint $event_name`
133 ok $?
"Validate trace filter output"
138 function validate_min_max
145 echo $stats |
grep -q "$field $expected_min $expected_max"
150 function validator_intfield
155 validate_min_max
"$stats" "intfield" "1" "99"
156 status
=$
(($status|$?
))
158 validate_min_max
"$stats" "intfield2" "0x1" "0x63"
159 status
=$
(($status|$?
))
161 validate_min_max
"$stats" "longfield" "1" "99"
162 status
=$
(($status|$?
))
164 validate_min_max
"$stats" "netintfield" "1" "99"
165 status
=$
(($status|$?
))
167 validate_min_max
"$stats" "netintfieldhex" "0x1" "0x63"
168 status
=$
(($status|$?
))
170 if [ $KERNEL_CHECK -eq 0 ]; then
171 validate_min_max
"$stats" "floatfield" "2222" "2222"
172 status
=$
(($status|$?
))
174 validate_min_max
"$stats" "doublefield" "2" "2"
175 status
=$
(($status|$?
))
181 function validator_intfield_gt
186 validate_min_max
"$stats" "intfield" "2" "99"
187 status
=$
(($status|$?
))
192 function validator_has_no_event
197 validate_min_max
"$stats" "intfield" "0" "99"
198 status
=$
(($status|$?
))
200 if [ $status -eq 0 ]; then
207 function validator_str_has_no_event
209 validator_has_no_event
"$1"
212 function validator_has_events
217 validate_min_max
"$stats" "intfield" "0" "99"
218 status
=$
(($status|$?
))
223 function validator_str_has_events
228 echo $stats |
grep -q str
229 status
=$
(($status|$?
))
234 function validator_stringfield_has_events
239 echo $stats |
grep -q stringfield
240 status
=$
(($status|$?
))
245 function validator_intfield_ge
250 validate_min_max
"$stats" "intfield" "1" "99"
251 status
=$
(($status|$?
))
256 function validator_intfield_lt
261 validate_min_max
"$stats" "intfield" "0" "1"
262 status
=$
(($status|$?
))
267 function validator_intfield_le
272 validate_min_max
"$stats" "intfield" "0" "2"
273 status
=$
(($status|$?
))
278 function validator_intfield_eq
283 validate_min_max
"$stats" "intfield" "1" "1"
284 status
=$
(($status|$?
))
289 function validator_intfield_ne
294 validate_min_max
"$stats" "intfield" "0" "98"
295 status
=$
(($status|$?
))
300 function validator_intfield_not
305 validate_min_max
"$stats" "intfield" "0" "0"
306 status
=$
(($status|$?
))
311 function validator_intfield_gt_and_longfield_gt
316 validate_min_max
"$stats" "intfield" "43" "99"
317 status
=$
(($status|$?
))
318 validate_min_max
"$stats" "longfield" "43" "99"
319 status
=$
(($status|$?
))
324 function validator_intfield_ge_and_longfield_le
329 validate_min_max
"$stats" "intfield" "42" "42"
330 status
=$
(($status|$?
))
331 validate_min_max
"$stats" "longfield" "42" "42"
332 status
=$
(($status|$?
))
337 function validator_intfield_lt_or_longfield_gt
342 validate_min_max
"$stats" "intfield" "0" "99"
343 status
=$
(($status|$?
))
344 validate_min_max
"$stats" "longfield" "0" "99"
345 status
=$
(($status|$?
))
350 function validator_mixed_str_or_int_and_int
355 validate_min_max
"$stats" "intfield" "34" "99"
356 status
=$
(($status|$?
))
358 validate_min_max
"$stats" "stringfield" "\"test\"" "\"test\""
359 status
=$
(($status|$?
))
364 function validator_mixed_int_double
369 validate_min_max
"$stats" "intfield" "0" "42"
370 status
=$
(($status|$?
))
375 function validator_true_statement
380 validate_min_max
"$stats" "intfield" "0" "99"
381 status
=$
(($status|$?
))
383 validate_min_max
"$stats" "intfield2" "0x0" "0x63"
384 status
=$
(($status|$?
))
386 validate_min_max
"$stats" "longfield" "0" "99"
387 status
=$
(($status|$?
))
389 validate_min_max
"$stats" "netintfield" "0" "99"
390 status
=$
(($status|$?
))
392 validate_min_max
"$stats" "netintfieldhex" "0x0" "0x63"
393 status
=$
(($status|$?
))
395 if [ $KERNEL_CHECK -eq 0 ]; then
396 validate_min_max
"$stats" "floatfield" "2222" "2222"
397 status
=$
(($status|$?
))
399 validate_min_max
"$stats" "doublefield" "2" "2"
400 status
=$
(($status|$?
))
403 validate_min_max
"$stats" "stringfield" "\"test\"" "\"test\""
404 status
=$
(($status|$?
))
406 validate_min_max
"$stats" "stringfield2" ""\
*"" ""\
*""
407 status
=$
(($status|$?
))
412 plan_tests
$NUM_TESTS
414 print_test_banner
"$TEST_DESC"
416 issue_356_filter
="intfield > 0 && intfield > 1 && "
417 issue_356_filter
+="intfield > 2 && intfield > 3 && "
418 issue_356_filter
+="intfield > 4 && intfield > 5 && "
419 issue_356_filter
+="intfield > 6 && intfield > 7 && "
420 issue_356_filter
+="intfield > 8 || intfield > 0"
426 BIN_NAME
="gen-ust-events"
429 # the tests below were written by Kirk Krauss in this article:
430 # http://www.drdobbs.com/architecture-and-design/matching-wildcards-an-empirical-way-to-t/240169123
436 '"mississipissippi" == "*issip*ss*"'
439 '"xxxx\*zzzzzzzzy\*f" == "xxxx*zzy*fffff"'
442 '"xxxx\*zzzzzzzzy\*f" == "xxx*zzy*f"'
445 '"xxxxzzzzzzzzyf" == "xxxx*zzy*fffff"'
448 '"xxxxzzzzzzzzyf" == "xxxx*zzy*f"'
451 '"xyxyxyzyxyz" == "xy*z*xyz"'
454 '"mississippi" == "*sip*"'
457 '"xyxyxyxyz" == "xy*xyz"'
460 '"mississippi" == "mi*sip*"'
463 '"ababac" == "*abac*"'
466 '"ababac" == "*abac*"'
472 '"a12b12" == "*12*23"'
478 '"a12b12" == "*12*12*"'
493 '"XYXYXYZYXYz" == "XY*Z*XYz"'
496 '"missisSIPpi" == "*SIP*"'
499 '"mississipPI" == "*issip*PI"'
502 '"xyxyxyxyz" == "xy*xyz"'
505 '"miSsissippi" == "mi*sip*"'
508 '"miSsissippi" == "mi*Sip*"'
511 '"abAbac" == "*Abac*"'
514 '"abAbac" == "*Abac*"'
520 '"A12b12" == "*12*23"'
523 '"a12B12" == "*12*12*"'
535 '"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab" == "a*a*a*a*a*a*aa*aaa*a*a*b"'
538 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*a*aa*aaa*fa*ga*b*"'
541 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*a*x*aaa*fa*ga*b*"'
544 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*aaaa*fa*ga*gggg*b*"'
547 '"abababababababababababababababababababaacacacacacacacadaeafagahaiajakalaaaaaaaaaaaaaaaaaffafagaagggagaaaaaaaab" == "*a*b*ba*ca*aaaa*fa*ga*ggg*b*"'
550 '"aaabbaabbaab" == "*aabbaa*a*"'
553 '"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*"'
556 '"aaaaaaaaaaaaaaaaa" == "*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*"'
559 '"aaaaaaaaaaaaaaaa" == "*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*"'
562 '"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*"'
565 '"abc\*abcd\*abcde\*abcdef\*abcdefg\*abcdefgh\*abcdefghi\*abcdefghij\*abcdefghijk\*abcdefghijkl\*abcdefghijklm\*abcdefghijklmn" == "abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*"'
568 '"abc\*abcd\*abcd\*abc\*abcd" == "abc*abc*abc*abc*abc"'
571 '"abc\*abc\*abc\*abc\*abc\*abc\*abc\*abc\*abc\*abc\*abcd" == "abc*abc*abc*abc*abc*abc*abc*abc*abc*abc*abcd"'
574 # Set IFS to newline to facilitate array declaration
614 intfield_gt_and_longfield_gt
615 "intfield > 1 && longfield > 42"
617 intfield_ge_and_longfield_le
618 "intfield >= 42 && longfield <= 42"
620 intfield_lt_or_longfield_gt
621 "intfield < 1 || longfield > 98"
623 mixed_str_or_int_and_int
624 "(stringfield == \"test\" || intfield != 10) && intfield > 33"
627 "intfield < 42.4242424242"
631 "\"test\" == \"test\""
634 "stringfield == \"test\""
637 "stringfield == \"t*\""
640 "stringfield == \"*\""
674 "1 >= (1 >= (1 >= 1))"
677 "0x101 & 0x100 == 0x100"
680 "0x101 | 0x10100 == 0x10101"
683 "0xF00F0F ^ 0xFF0F00 == 0x0F000F"
695 "(262144 >> 16) == 4"
698 "(~0 & 0xffff) == 0xffff"
701 "(~0 & 0xffffffff) == 0xffffffff"
704 "(~0 & 0xffffffffffffffff) == 0xffffffffffffffff"
710 "1<<1==2" # C99 operator priority: comparator before bitwise
713 "!(1<<1==2)" # C99 operator priority: comparator before bitwise
716 "(1 << 32) == 4294967296"
719 "(1 << 63) == 9223372036854775808"
722 "arrfield1[2] & 1 == 1"
725 "arrfield1[2] | 0x111000 == 0x111003"
728 "(arrfield1[0] | arrfield1[1] | arrfield1[2]) == 0x3"
731 "seqfield4[2] & 1 == 1"
734 "seqfield4[2] | 0x111000 == 0x111003"
737 "intfield < 0xDEADBEEF"
746 "stringfield2 == \"\\\*\""
749 "1.0 || intfield || 1.0"
779 "\$ctx.procname != \"$BIN_NAME\""
782 "\$ctx.procname == \"$BIN_NAME\""
785 "\"$BIN_NAME\" != \$ctx.procname"
788 "\"$BIN_NAME\" == \$ctx.procname"
791 "\$ctx.procname != \"$BIN_NAME*\""
794 "\$ctx.procname == \"$BIN_NAME*\""
797 "\"$BIN_NAME*\" != \$ctx.procname"
800 "\"$BIN_NAME*\" == \$ctx.procname"
803 "\$ctx.procname != \"*\""
806 "\$ctx.procname == \"*\""
809 "\"*\" != \$ctx.procname"
812 "\"*\" == \$ctx.procname"
818 "a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a"
821 "\$ctx.vtid.blah == 0"
824 "asdf.asdfsd.sadf < 4"
827 "0 == \$ctx.vtid.blah"
834 'str == "hypothecary"'
837 '"hypothecary" == str'
840 'str != "hypothecary"'
843 '"hypothecary" != str'
930 'str == "*po***siz*"'
933 '"*po***siz*" == str'
936 'str != "*po***siz*"'
939 '"*po***siz*" != str'
942 'str == "*po*\**siz*"'
945 '"*po*\**siz*" == str'
972 '"salut*" == "salut vous"'
975 '"salut*" == "salut vous*"'
978 '"salut vous*" == "salut*"'
980 ${KIRK_KRAUSS_TESTS[@]}
985 if [ ! -x "$CURDIR/$BIN_NAME" ]; then
986 BAIL_OUT
"No UST nevents binary detected."
991 diag
"Test UST valid filters"
996 validator
="${UST_FILTERS[$i]}"
998 if [ "$validator" = END
]; then
1002 filter
="${UST_FILTERS[$(( i + 1 ))]}"
1003 test_valid_filter ust
-u "tp:tptest" "$filter" "validator_$validator"
1005 if [ $?
-eq 1 ]; then
1015 validator
="${UST_STR_FILTERS[$i]}"
1017 if [ "$validator" = END
]; then
1021 filter
="${UST_STR_FILTERS[$(( i + 1 ))]}"
1022 test_valid_filter ust_str
-u "tp:the_string" "$filter" "validator_$validator"
1024 if [ $?
-eq 1 ]; then
1034 BIN_NAME
="test_valid_filt" # Current script name truncated by kernel
1036 # One to one mapping between filters and validators
1037 # Set IFS to newline to facilitate array declaration
1077 intfield_gt_and_longfield_gt
1078 "intfield > 1 && longfield > 42"
1080 intfield_ge_and_longfield_le
1081 "intfield >= 42 && longfield <= 42"
1083 intfield_lt_or_longfield_gt
1084 "intfield < 1 || longfield > 98"
1086 mixed_str_or_int_and_int
1087 "(stringfield == \"test\" || intfield != 10) && intfield > 33"
1090 "intfield < 42.4242424242"
1093 "\"test\" == \"test\""
1096 "stringfield == \"test\""
1099 "stringfield == \"t*\""
1102 "stringfield == \"*\""
1135 "1 >= (1 >= (1 >= 1))"
1138 "0x101 & 0x100 == 0x100"
1141 "0x101 | 0x10100 == 0x10101"
1144 "0xF00F0F ^ 0xFF0F00 == 0x0F000F"
1156 "(262144 >> 16) == 4"
1159 "(~0 & 0xffff) == 0xffff"
1162 "(~0 & 0xffffffff) == 0xffffffff"
1165 "(~0 & 0xffffffffffffffff) == 0xffffffffffffffff"
1171 "1<<1==2" # C99 operator priority: comparator before bitwise
1174 "!(1<<1==2)" # C99 operator priority: comparator before bitwise
1177 "(1 << 32) == 4294967296"
1180 "(1 << 63) == 9223372036854775808"
1183 "arrfield1[2] & 1 == 1"
1186 "arrfield1[2] | 0x111000 == 0x111003"
1189 "(arrfield1[0] | arrfield1[1] | arrfield1[2]) == 0x3"
1192 "seqfield4[2] & 1 == 1"
1195 "seqfield4[2] | 0x111000 == 0x111003"
1198 "intfield < 0xDEADBEEF"
1207 "stringfield2 == \"\\\*\""
1210 "1.0 || intfield || 1.0"
1240 "\$ctx.procname != \"$BIN_NAME\""
1243 "\$ctx.procname == \"$BIN_NAME\""
1246 "\"$BIN_NAME\" != \$ctx.procname"
1249 "\"$BIN_NAME\" == \$ctx.procname"
1252 "\$ctx.procname != \"$BIN_NAME*\""
1255 "\$ctx.procname == \"$BIN_NAME*\""
1258 "\"$BIN_NAME*\" != \$ctx.procname"
1261 "\"$BIN_NAME*\" == \$ctx.procname"
1264 "\$ctx.procname != \"*\""
1267 "\$ctx.procname == \"*\""
1270 "\"*\" != \$ctx.procname"
1273 "\"*\" == \$ctx.procname"
1279 "a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a"
1282 "\$ctx.vtid.blah == 0"
1285 "asdf.asdfsd.sadf < 4"
1288 "0 == \$ctx.vtid.blah"
1290 stringfield_has_events
1291 'stringfield == "test"'
1293 stringfield_has_events
1294 '"test" == stringfield'
1297 'stringfield != "test"'
1300 '"test" != stringfield'
1302 stringfield_has_events
1303 'stringfield == "*st"'
1305 stringfield_has_events
1306 '"*st" == stringfield'
1309 'stringfield != "*st"'
1312 '"*st" != stringfield'
1314 stringfield_has_events
1315 'stringfield == "te*"'
1317 stringfield_has_events
1318 '"te*" == stringfield'
1321 'stringfield != "te*"'
1324 '"te*" != stringfield'
1326 stringfield_has_events
1327 'stringfield == "te*t"'
1329 stringfield_has_events
1330 '"te*t" == stringfield'
1333 'stringfield != "te*t"'
1336 '"te*t" != stringfield'
1338 stringfield_has_events
1339 'stringfield == "tes*t"'
1341 stringfield_has_events
1342 '"tes*t" == stringfield'
1345 'stringfield != "tes*t"'
1348 '"tes*t" != stringfield'
1350 stringfield_has_events
1351 'stringfield == "*test"'
1353 stringfield_has_events
1354 '"*test" == stringfield'
1357 'stringfield != "*test"'
1360 '"*test" != stringfield'
1362 stringfield_has_events
1363 'stringfield == "test*"'
1365 stringfield_has_events
1366 '"test*" == stringfield'
1369 'stringfield != "test*"'
1372 '"test*" != stringfield'
1374 stringfield_has_events
1375 'stringfield == "*"'
1377 stringfield_has_events
1378 '"*" == stringfield'
1381 'stringfield != "*"'
1384 '"*" != stringfield'
1387 'stringfield == "test*2"'
1390 'stringfield == "2*test"'
1393 'stringfield == "te\*st"'
1396 'stringfield == "te*ts"'
1399 'stringfield == "*\*test"'
1402 'stringfield == "test\*"'
1404 ${KIRK_KRAUSS_TESTS[@]}
1411 if [ "$(id -u)" == "0" ]; then
1417 skip
$isroot "Root access is needed. Skipping all kernel valid filter tests." $NUM_KERNEL_TESTS ||
1419 diag
"Test kernel valid filters"
1426 validator
="${KERNEL_FILTERS[$i]}"
1428 if [ "$validator" = END
]; then
1432 filter
="${KERNEL_FILTERS[$(( i + 1 ))]}"
1433 test_valid_filter kernel
-k "lttng_test_filter_event" "$filter" "validator_$validator"
1435 if [ $?
-eq 1 ]; then