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 == \"*\""
646 "intfield < 0xDEADBEEF"
655 "stringfield2 == \"\\\*\""
658 "1.0 || intfield || 1.0"
688 "\$ctx.procname != \"$BIN_NAME\""
691 "\$ctx.procname == \"$BIN_NAME\""
694 "\"$BIN_NAME\" != \$ctx.procname"
697 "\"$BIN_NAME\" == \$ctx.procname"
700 "\$ctx.procname != \"$BIN_NAME*\""
703 "\$ctx.procname == \"$BIN_NAME*\""
706 "\"$BIN_NAME*\" != \$ctx.procname"
709 "\"$BIN_NAME*\" == \$ctx.procname"
712 "\$ctx.procname != \"*\""
715 "\$ctx.procname == \"*\""
718 "\"*\" != \$ctx.procname"
721 "\"*\" == \$ctx.procname"
727 "a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a"
730 "\$ctx.vtid.blah == 0"
733 "asdf.asdfsd.sadf < 4"
736 "0 == \$ctx.vtid.blah"
749 'str == "hypothecary"'
752 '"hypothecary" == str'
755 'str != "hypothecary"'
758 '"hypothecary" != str'
845 'str == "*po***siz*"'
848 '"*po***siz*" == str'
851 'str != "*po***siz*"'
854 '"*po***siz*" != str'
857 'str == "*po*\**siz*"'
860 '"*po*\**siz*" == str'
887 '"salut*" == "salut vous"'
890 '"salut*" == "salut vous*"'
893 '"salut vous*" == "salut*"'
895 ${KIRK_KRAUSS_TESTS[@]}
900 if [ ! -x "$CURDIR/$BIN_NAME" ]; then
901 BAIL_OUT
"No UST nevents binary detected."
906 diag
"Test UST valid filters"
911 validator
="${UST_FILTERS[$i]}"
913 if [ "$validator" = END
]; then
917 filter
="${UST_FILTERS[$(( i + 1 ))]}"
918 test_valid_filter ust
-u "tp:tptest" "$filter" "validator_$validator"
920 if [ $?
-eq 1 ]; then
930 validator
="${UST_STR_FILTERS[$i]}"
932 if [ "$validator" = END
]; then
936 filter
="${UST_STR_FILTERS[$(( i + 1 ))]}"
937 test_valid_filter ust_str
-u "tp:the_string" "$filter" "validator_$validator"
939 if [ $?
-eq 1 ]; then
949 BIN_NAME
="test_valid_filt" # Current script name truncated by kernel
951 # One to one mapping between filters and validators
952 # Set IFS to newline to facilitate array declaration
992 intfield_gt_and_longfield_gt
993 "intfield > 1 && longfield > 42"
995 intfield_ge_and_longfield_le
996 "intfield >= 42 && longfield <= 42"
998 intfield_lt_or_longfield_gt
999 "intfield < 1 || longfield > 98"
1001 mixed_str_or_int_and_int
1002 "(stringfield == \"test\" || intfield != 10) && intfield > 33"
1005 "intfield < 42.4242424242"
1008 "\"test\" == \"test\""
1011 "stringfield == \"test\""
1014 "stringfield == \"t*\""
1017 "stringfield == \"*\""
1023 "intfield < 0xDEADBEEF"
1032 "stringfield2 == \"\\\*\""
1035 "1.0 || intfield || 1.0"
1065 "\$ctx.procname != \"$BIN_NAME\""
1068 "\$ctx.procname == \"$BIN_NAME\""
1071 "\"$BIN_NAME\" != \$ctx.procname"
1074 "\"$BIN_NAME\" == \$ctx.procname"
1077 "\$ctx.procname != \"$BIN_NAME*\""
1080 "\$ctx.procname == \"$BIN_NAME*\""
1083 "\"$BIN_NAME*\" != \$ctx.procname"
1086 "\"$BIN_NAME*\" == \$ctx.procname"
1089 "\$ctx.procname != \"*\""
1092 "\$ctx.procname == \"*\""
1095 "\"*\" != \$ctx.procname"
1098 "\"*\" == \$ctx.procname"
1104 "a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a"
1107 "\$ctx.vtid.blah == 0"
1110 "asdf.asdfsd.sadf < 4"
1113 "0 == \$ctx.vtid.blah"
1121 stringfield_has_events
1122 'stringfield == "test"'
1124 stringfield_has_events
1125 '"test" == stringfield'
1128 'stringfield != "test"'
1131 '"test" != stringfield'
1133 stringfield_has_events
1134 'stringfield == "*st"'
1136 stringfield_has_events
1137 '"*st" == stringfield'
1140 'stringfield != "*st"'
1143 '"*st" != stringfield'
1145 stringfield_has_events
1146 'stringfield == "te*"'
1148 stringfield_has_events
1149 '"te*" == stringfield'
1152 'stringfield != "te*"'
1155 '"te*" != stringfield'
1157 stringfield_has_events
1158 'stringfield == "te*t"'
1160 stringfield_has_events
1161 '"te*t" == stringfield'
1164 'stringfield != "te*t"'
1167 '"te*t" != stringfield'
1169 stringfield_has_events
1170 'stringfield == "tes*t"'
1172 stringfield_has_events
1173 '"tes*t" == stringfield'
1176 'stringfield != "tes*t"'
1179 '"tes*t" != stringfield'
1181 stringfield_has_events
1182 'stringfield == "*test"'
1184 stringfield_has_events
1185 '"*test" == stringfield'
1188 'stringfield != "*test"'
1191 '"*test" != stringfield'
1193 stringfield_has_events
1194 'stringfield == "test*"'
1196 stringfield_has_events
1197 '"test*" == stringfield'
1200 'stringfield != "test*"'
1203 '"test*" != stringfield'
1205 stringfield_has_events
1206 'stringfield == "*"'
1208 stringfield_has_events
1209 '"*" == stringfield'
1212 'stringfield != "*"'
1215 '"*" != stringfield'
1218 'stringfield == "test*2"'
1221 'stringfield == "2*test"'
1224 'stringfield == "te\*st"'
1227 'stringfield == "te*ts"'
1230 'stringfield == "*\*test"'
1233 'stringfield == "test\*"'
1235 ${KIRK_KRAUSS_TESTS[@]}
1242 if [ "$(id -u)" == "0" ]; then
1248 skip
$isroot "Root access is needed. Skipping all kernel valid filter tests." $NUM_KERNEL_TESTS ||
1250 diag
"Test kernel valid filters"
1257 validator
="${KERNEL_FILTERS[$i]}"
1259 if [ "$validator" = END
]; then
1263 filter
="${KERNEL_FILTERS[$(( i + 1 ))]}"
1264 test_valid_filter kernel
-k "lttng_test_filter_event" "$filter" "validator_$validator"
1266 if [ $?
-eq 1 ]; then