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 == \"*\""
647 "intfield < 0xDEADBEEF"
656 "stringfield2 == \"\\\*\""
659 "1.0 || intfield || 1.0"
689 "\$ctx.procname != \"$BIN_NAME\""
692 "\$ctx.procname == \"$BIN_NAME\""
695 "\"$BIN_NAME\" != \$ctx.procname"
698 "\"$BIN_NAME\" == \$ctx.procname"
701 "\$ctx.procname != \"$BIN_NAME*\""
704 "\$ctx.procname == \"$BIN_NAME*\""
707 "\"$BIN_NAME*\" != \$ctx.procname"
710 "\"$BIN_NAME*\" == \$ctx.procname"
713 "\$ctx.procname != \"*\""
716 "\$ctx.procname == \"*\""
719 "\"*\" != \$ctx.procname"
722 "\"*\" == \$ctx.procname"
728 "a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a"
731 "\$ctx.vtid.blah == 0"
734 "asdf.asdfsd.sadf < 4"
737 "0 == \$ctx.vtid.blah"
750 'str == "hypothecary"'
753 '"hypothecary" == str'
756 'str != "hypothecary"'
759 '"hypothecary" != str'
846 'str == "*po***siz*"'
849 '"*po***siz*" == str'
852 'str != "*po***siz*"'
855 '"*po***siz*" != str'
858 'str == "*po*\**siz*"'
861 '"*po*\**siz*" == str'
888 '"salut*" == "salut vous"'
891 '"salut*" == "salut vous*"'
894 '"salut vous*" == "salut*"'
896 ${KIRK_KRAUSS_TESTS[@]}
901 if [ ! -x "$CURDIR/$BIN_NAME" ]; then
902 BAIL_OUT
"No UST nevents binary detected."
907 diag
"Test UST valid filters"
912 validator
="${UST_FILTERS[$i]}"
914 if [ "$validator" = END
]; then
918 filter
="${UST_FILTERS[$(( i + 1 ))]}"
919 test_valid_filter ust
-u "tp:tptest" "$filter" "validator_$validator"
921 if [ $?
-eq 1 ]; then
931 validator
="${UST_STR_FILTERS[$i]}"
933 if [ "$validator" = END
]; then
937 filter
="${UST_STR_FILTERS[$(( i + 1 ))]}"
938 test_valid_filter ust_str
-u "tp:the_string" "$filter" "validator_$validator"
940 if [ $?
-eq 1 ]; then
950 BIN_NAME
="test_valid_filt" # Current script name truncated by kernel
952 # One to one mapping between filters and validators
953 # Set IFS to newline to facilitate array declaration
993 intfield_gt_and_longfield_gt
994 "intfield > 1 && longfield > 42"
996 intfield_ge_and_longfield_le
997 "intfield >= 42 && longfield <= 42"
999 intfield_lt_or_longfield_gt
1000 "intfield < 1 || longfield > 98"
1002 mixed_str_or_int_and_int
1003 "(stringfield == \"test\" || intfield != 10) && intfield > 33"
1006 "intfield < 42.4242424242"
1009 "\"test\" == \"test\""
1012 "stringfield == \"test\""
1015 "stringfield == \"t*\""
1018 "stringfield == \"*\""
1024 "intfield < 0xDEADBEEF"
1033 "stringfield2 == \"\\\*\""
1036 "1.0 || intfield || 1.0"
1066 "\$ctx.procname != \"$BIN_NAME\""
1069 "\$ctx.procname == \"$BIN_NAME\""
1072 "\"$BIN_NAME\" != \$ctx.procname"
1075 "\"$BIN_NAME\" == \$ctx.procname"
1078 "\$ctx.procname != \"$BIN_NAME*\""
1081 "\$ctx.procname == \"$BIN_NAME*\""
1084 "\"$BIN_NAME*\" != \$ctx.procname"
1087 "\"$BIN_NAME*\" == \$ctx.procname"
1090 "\$ctx.procname != \"*\""
1093 "\$ctx.procname == \"*\""
1096 "\"*\" != \$ctx.procname"
1099 "\"*\" == \$ctx.procname"
1105 "a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a"
1108 "\$ctx.vtid.blah == 0"
1111 "asdf.asdfsd.sadf < 4"
1114 "0 == \$ctx.vtid.blah"
1122 stringfield_has_events
1123 'stringfield == "test"'
1125 stringfield_has_events
1126 '"test" == stringfield'
1129 'stringfield != "test"'
1132 '"test" != stringfield'
1134 stringfield_has_events
1135 'stringfield == "*st"'
1137 stringfield_has_events
1138 '"*st" == stringfield'
1141 'stringfield != "*st"'
1144 '"*st" != stringfield'
1146 stringfield_has_events
1147 'stringfield == "te*"'
1149 stringfield_has_events
1150 '"te*" == stringfield'
1153 'stringfield != "te*"'
1156 '"te*" != stringfield'
1158 stringfield_has_events
1159 'stringfield == "te*t"'
1161 stringfield_has_events
1162 '"te*t" == stringfield'
1165 'stringfield != "te*t"'
1168 '"te*t" != stringfield'
1170 stringfield_has_events
1171 'stringfield == "tes*t"'
1173 stringfield_has_events
1174 '"tes*t" == stringfield'
1177 'stringfield != "tes*t"'
1180 '"tes*t" != stringfield'
1182 stringfield_has_events
1183 'stringfield == "*test"'
1185 stringfield_has_events
1186 '"*test" == stringfield'
1189 'stringfield != "*test"'
1192 '"*test" != stringfield'
1194 stringfield_has_events
1195 'stringfield == "test*"'
1197 stringfield_has_events
1198 '"test*" == stringfield'
1201 'stringfield != "test*"'
1204 '"test*" != stringfield'
1206 stringfield_has_events
1207 'stringfield == "*"'
1209 stringfield_has_events
1210 '"*" == stringfield'
1213 'stringfield != "*"'
1216 '"*" != stringfield'
1219 'stringfield == "test*2"'
1222 'stringfield == "2*test"'
1225 'stringfield == "te\*st"'
1228 'stringfield == "te*ts"'
1231 'stringfield == "*\*test"'
1234 'stringfield == "test\*"'
1236 ${KIRK_KRAUSS_TESTS[@]}
1243 if [ "$(id -u)" == "0" ]; then
1249 skip
$isroot "Root access is needed. Skipping all kernel valid filter tests." $NUM_KERNEL_TESTS ||
1251 diag
"Test kernel valid filters"
1258 validator
="${KERNEL_FILTERS[$i]}"
1260 if [ "$validator" = END
]; then
1264 filter
="${KERNEL_FILTERS[$(( i + 1 ))]}"
1265 test_valid_filter kernel
-k "lttng_test_filter_event" "$filter" "validator_$validator"
1267 if [ $?
-eq 1 ]; then