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"
686 "arrfield1[2] & 1 == 1"
689 "arrfield1[2] | 0x111000 == 0x111003"
692 "(arrfield1[0] | arrfield1[1] | arrfield1[2]) == 0x3"
695 "seqfield4[2] & 1 == 1"
698 "seqfield4[2] | 0x111000 == 0x111003"
701 "intfield < 0xDEADBEEF"
710 "stringfield2 == \"\\\*\""
713 "1.0 || intfield || 1.0"
743 "\$ctx.procname != \"$BIN_NAME\""
746 "\$ctx.procname == \"$BIN_NAME\""
749 "\"$BIN_NAME\" != \$ctx.procname"
752 "\"$BIN_NAME\" == \$ctx.procname"
755 "\$ctx.procname != \"$BIN_NAME*\""
758 "\$ctx.procname == \"$BIN_NAME*\""
761 "\"$BIN_NAME*\" != \$ctx.procname"
764 "\"$BIN_NAME*\" == \$ctx.procname"
767 "\$ctx.procname != \"*\""
770 "\$ctx.procname == \"*\""
773 "\"*\" != \$ctx.procname"
776 "\"*\" == \$ctx.procname"
782 "a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a"
785 "\$ctx.vtid.blah == 0"
788 "asdf.asdfsd.sadf < 4"
791 "0 == \$ctx.vtid.blah"
798 'str == "hypothecary"'
801 '"hypothecary" == str'
804 'str != "hypothecary"'
807 '"hypothecary" != str'
894 'str == "*po***siz*"'
897 '"*po***siz*" == str'
900 'str != "*po***siz*"'
903 '"*po***siz*" != str'
906 'str == "*po*\**siz*"'
909 '"*po*\**siz*" == str'
936 '"salut*" == "salut vous"'
939 '"salut*" == "salut vous*"'
942 '"salut vous*" == "salut*"'
944 ${KIRK_KRAUSS_TESTS[@]}
949 if [ ! -x "$CURDIR/$BIN_NAME" ]; then
950 BAIL_OUT
"No UST nevents binary detected."
955 diag
"Test UST valid filters"
960 validator
="${UST_FILTERS[$i]}"
962 if [ "$validator" = END
]; then
966 filter
="${UST_FILTERS[$(( i + 1 ))]}"
967 test_valid_filter ust
-u "tp:tptest" "$filter" "validator_$validator"
969 if [ $?
-eq 1 ]; then
979 validator
="${UST_STR_FILTERS[$i]}"
981 if [ "$validator" = END
]; then
985 filter
="${UST_STR_FILTERS[$(( i + 1 ))]}"
986 test_valid_filter ust_str
-u "tp:the_string" "$filter" "validator_$validator"
988 if [ $?
-eq 1 ]; then
998 BIN_NAME
="test_valid_filt" # Current script name truncated by kernel
1000 # One to one mapping between filters and validators
1001 # Set IFS to newline to facilitate array declaration
1041 intfield_gt_and_longfield_gt
1042 "intfield > 1 && longfield > 42"
1044 intfield_ge_and_longfield_le
1045 "intfield >= 42 && longfield <= 42"
1047 intfield_lt_or_longfield_gt
1048 "intfield < 1 || longfield > 98"
1050 mixed_str_or_int_and_int
1051 "(stringfield == \"test\" || intfield != 10) && intfield > 33"
1054 "intfield < 42.4242424242"
1057 "\"test\" == \"test\""
1060 "stringfield == \"test\""
1063 "stringfield == \"t*\""
1066 "stringfield == \"*\""
1099 "1 >= (1 >= (1 >= 1))"
1102 "0x101 & 0x100 == 0x100"
1105 "0x101 | 0x10100 == 0x10101"
1108 "0xF00F0F ^ 0xFF0F00 == 0x0F000F"
1111 "arrfield1[2] & 1 == 1"
1114 "arrfield1[2] | 0x111000 == 0x111003"
1117 "(arrfield1[0] | arrfield1[1] | arrfield1[2]) == 0x3"
1120 "seqfield4[2] & 1 == 1"
1123 "seqfield4[2] | 0x111000 == 0x111003"
1126 "intfield < 0xDEADBEEF"
1135 "stringfield2 == \"\\\*\""
1138 "1.0 || intfield || 1.0"
1168 "\$ctx.procname != \"$BIN_NAME\""
1171 "\$ctx.procname == \"$BIN_NAME\""
1174 "\"$BIN_NAME\" != \$ctx.procname"
1177 "\"$BIN_NAME\" == \$ctx.procname"
1180 "\$ctx.procname != \"$BIN_NAME*\""
1183 "\$ctx.procname == \"$BIN_NAME*\""
1186 "\"$BIN_NAME*\" != \$ctx.procname"
1189 "\"$BIN_NAME*\" == \$ctx.procname"
1192 "\$ctx.procname != \"*\""
1195 "\$ctx.procname == \"*\""
1198 "\"*\" != \$ctx.procname"
1201 "\"*\" == \$ctx.procname"
1207 "a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a"
1210 "\$ctx.vtid.blah == 0"
1213 "asdf.asdfsd.sadf < 4"
1216 "0 == \$ctx.vtid.blah"
1218 stringfield_has_events
1219 'stringfield == "test"'
1221 stringfield_has_events
1222 '"test" == stringfield'
1225 'stringfield != "test"'
1228 '"test" != stringfield'
1230 stringfield_has_events
1231 'stringfield == "*st"'
1233 stringfield_has_events
1234 '"*st" == stringfield'
1237 'stringfield != "*st"'
1240 '"*st" != stringfield'
1242 stringfield_has_events
1243 'stringfield == "te*"'
1245 stringfield_has_events
1246 '"te*" == stringfield'
1249 'stringfield != "te*"'
1252 '"te*" != stringfield'
1254 stringfield_has_events
1255 'stringfield == "te*t"'
1257 stringfield_has_events
1258 '"te*t" == stringfield'
1261 'stringfield != "te*t"'
1264 '"te*t" != stringfield'
1266 stringfield_has_events
1267 'stringfield == "tes*t"'
1269 stringfield_has_events
1270 '"tes*t" == stringfield'
1273 'stringfield != "tes*t"'
1276 '"tes*t" != stringfield'
1278 stringfield_has_events
1279 'stringfield == "*test"'
1281 stringfield_has_events
1282 '"*test" == stringfield'
1285 'stringfield != "*test"'
1288 '"*test" != stringfield'
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 == "*"'
1305 stringfield_has_events
1306 '"*" == stringfield'
1309 'stringfield != "*"'
1312 '"*" != stringfield'
1315 'stringfield == "test*2"'
1318 'stringfield == "2*test"'
1321 'stringfield == "te\*st"'
1324 'stringfield == "te*ts"'
1327 'stringfield == "*\*test"'
1330 'stringfield == "test\*"'
1332 ${KIRK_KRAUSS_TESTS[@]}
1339 if [ "$(id -u)" == "0" ]; then
1345 skip
$isroot "Root access is needed. Skipping all kernel valid filter tests." $NUM_KERNEL_TESTS ||
1347 diag
"Test kernel valid filters"
1354 validator
="${KERNEL_FILTERS[$i]}"
1356 if [ "$validator" = END
]; then
1360 filter
="${KERNEL_FILTERS[$(( i + 1 ))]}"
1361 test_valid_filter kernel
-k "lttng_test_filter_event" "$filter" "validator_$validator"
1363 if [ $?
-eq 1 ]; then