+### KERNEL TESTS
+
+BIN_NAME="test_valid_filt" # Current script name truncated by kernel
+
+# One to one mapping between filters and validators
+# Set IFS to newline to facilitate array declaration
+OLDIFS="$IFS"
+IFS=$'\n'
+KERNEL_FILTERS=(
+ intfield
+ "intfield"
+
+ intfield_gt
+ "intfield > 1"
+
+ intfield_ge
+ "intfield >= 1"
+
+ intfield_lt
+ "intfield < 2"
+
+ intfield_le
+ "intfield <= 2"
+
+ intfield_eq
+ "intfield == 1"
+
+ intfield_ne
+ "intfield != 99"
+
+ intfield_not
+ "!intfield"
+
+ intfield
+ "-intfield"
+
+ intfield
+ "--intfield"
+
+ intfield
+ "+intfield"
+
+ intfield
+ "++intfield"
+
+ intfield_gt_and_longfield_gt
+ "intfield > 1 && longfield > 42"
+
+ intfield_ge_and_longfield_le
+ "intfield >= 42 && longfield <= 42"
+
+ intfield_lt_or_longfield_gt
+ "intfield < 1 || longfield > 98"
+
+ mixed_str_or_int_and_int
+ "(stringfield == \"test\" || intfield != 10) && intfield > 33"
+
+ has_no_event
+ "intfield < 42.4242424242"
+
+ true_statement
+ "\"test\" == \"test\""
+
+ true_statement
+ "stringfield == \"test\""
+
+ true_statement
+ "stringfield == \"t*\""
+
+ true_statement
+ "stringfield == \"*\""
+
+ intfield
+ $issue_356_filter
+
+ true_statement
+ "1&1"
+
+ true_statement
+ "0|1"
+
+ true_statement
+ "0^1"
+
+ true_statement
+ "seqfield4[1]==2"
+
+ true_statement
+ "arrfield1[1]==2"
+
+ true_statement
+ "arrfield1[1]==2"
+
+ true_statement
+ "arrfield3[1]==2"
+
+ true_statement
+ "seqfield3[1]==2"
+
+ true_statement
+ "1 | (1 | (1 | 1))"
+
+ true_statement
+ "1 >= (1 >= (1 >= 1))"
+
+ true_statement
+ "(0x101 & 0x100) == 0x100"
+
+ true_statement
+ "(0x101 | 0x10100) == 0x10101"
+
+ true_statement
+ "(0xF00F0F ^ 0xFF0F00) == 0x0F000F"
+
+ true_statement
+ "(1 << 1) == 2"
+
+ true_statement
+ "(4 >> 1) == 2"
+
+ true_statement
+ "(1 << 8) == 256"
+
+ true_statement
+ "(262144 >> 16) == 4"
+
+ true_statement
+ "(~0 & 0xffff) == 0xffff"
+
+ true_statement
+ "(~0 & 0xffffffff) == 0xffffffff"
+
+ true_statement
+ "(~0 & 0xffffffffffffffff) == 0xffffffffffffffff"
+
+ true_statement
+ "-1==~0"
+
+ true_statement # unsigned bitwise ops
+ "~0>>4==0x0fffffffffffffff"
+
+ has_no_event
+ "1<<-1"
+
+ has_no_event
+ "1<<10000"
+
+ true_statement # comparator is signed, shift is unsigned
+ "(1<<63) < 0"
+
+ true_statement
+ "(1<<2!=4)==0" # operator priority: shift before equality
+
+ true_statement
+ "1&3==1" # operator priority: masks before equality
+
+ true_statement
+ "(3|1==3)==1" # operator priority: masks before equality
+
+ true_statement
+ "(2^1==3)==1" # operator priority: masks before equality
+
+ true_statement
+ "(1 << 32) == 4294967296"
+
+ true_statement
+ "(1 << 63) == 9223372036854775808"
+
+ true_statement
+ "(arrfield1[2] & 1) == 1"
+
+ true_statement
+ "(arrfield1[2] | 0x111000) == 0x111003"
+
+ true_statement
+ "(arrfield1[0] | arrfield1[1] | arrfield1[2]) == 0x3"
+
+ true_statement
+ "(seqfield4[2] & 1) == 1"
+
+ true_statement
+ "(seqfield4[2] | 0x111000) == 0x111003"
+
+ true_statement
+ "intfield < 0xDEADBEEF"
+
+ intfield_lt
+ "intfield < 0x2"
+
+ intfield_lt
+ "intfield < 02"
+
+ true_statement
+ "stringfield2 == \"\\\*\""
+
+ has_no_event
+ "1.0 || intfield || 1.0"
+
+ intfield_gt
+ "1 < intfield"
+
+ has_no_event
+ "\$ctx.vtid == 0"
+
+ has_events
+ "\$ctx.vtid != 0"
+
+ has_no_event
+ "0 == \$ctx.vtid"
+
+ has_events
+ "0 != \$ctx.vtid"
+
+ has_no_event
+ "\$ctx.vpid == 0"
+
+ has_events
+ "\$ctx.vpid != 0"
+
+ has_no_event
+ "0 == \$ctx.vpid"
+
+ has_events
+ "0 != \$ctx.vpid"
+
+ has_no_event
+ "\$ctx.procname != \"$BIN_NAME\""
+
+ has_events
+ "\$ctx.procname == \"$BIN_NAME\""
+
+ has_no_event
+ "\"$BIN_NAME\" != \$ctx.procname"
+
+ has_events
+ "\"$BIN_NAME\" == \$ctx.procname"
+
+ has_no_event
+ "\$ctx.procname != \"$BIN_NAME*\""
+
+ has_events
+ "\$ctx.procname == \"$BIN_NAME*\""
+
+ has_no_event
+ "\"$BIN_NAME*\" != \$ctx.procname"
+
+ has_events
+ "\"$BIN_NAME*\" == \$ctx.procname"
+
+ has_no_event
+ "\$ctx.procname != \"*\""
+
+ has_events
+ "\$ctx.procname == \"*\""
+
+ has_no_event
+ "\"*\" != \$ctx.procname"
+
+ has_events
+ "\"*\" == \$ctx.procname"
+
+ has_no_event
+ "!a.f.d"
+
+ has_no_event
+ "a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a"
+
+ has_no_event
+ "\$ctx.vtid.blah == 0"
+
+ has_no_event
+ "asdf.asdfsd.sadf < 4"
+
+ has_no_event
+ "0 == \$ctx.vtid.blah"
+
+ stringfield_has_events
+ 'stringfield == "test"'
+
+ stringfield_has_events
+ '"test" == stringfield'
+
+ has_no_event
+ 'stringfield != "test"'
+
+ has_no_event
+ '"test" != stringfield'
+
+ stringfield_has_events
+ 'stringfield == "*st"'
+
+ stringfield_has_events
+ '"*st" == stringfield'
+
+ has_no_event
+ 'stringfield != "*st"'
+
+ has_no_event
+ '"*st" != stringfield'
+
+ stringfield_has_events
+ 'stringfield == "te*"'
+
+ stringfield_has_events
+ '"te*" == stringfield'
+
+ has_no_event
+ 'stringfield != "te*"'
+
+ has_no_event
+ '"te*" != stringfield'
+
+ stringfield_has_events
+ 'stringfield == "te*t"'
+
+ stringfield_has_events
+ '"te*t" == stringfield'
+
+ has_no_event
+ 'stringfield != "te*t"'
+
+ has_no_event
+ '"te*t" != stringfield'
+
+ stringfield_has_events
+ 'stringfield == "tes*t"'
+
+ stringfield_has_events
+ '"tes*t" == stringfield'
+
+ has_no_event
+ 'stringfield != "tes*t"'
+
+ has_no_event
+ '"tes*t" != stringfield'
+
+ stringfield_has_events
+ 'stringfield == "*test"'
+
+ stringfield_has_events
+ '"*test" == stringfield'
+
+ has_no_event
+ 'stringfield != "*test"'
+
+ has_no_event
+ '"*test" != stringfield'
+
+ stringfield_has_events
+ 'stringfield == "test*"'
+
+ stringfield_has_events
+ '"test*" == stringfield'
+
+ has_no_event
+ 'stringfield != "test*"'
+
+ has_no_event
+ '"test*" != stringfield'
+
+ stringfield_has_events
+ 'stringfield == "*"'
+
+ stringfield_has_events
+ '"*" == stringfield'
+
+ has_no_event
+ 'stringfield != "*"'
+
+ has_no_event
+ '"*" != stringfield'
+
+ has_no_event
+ 'stringfield == "test*2"'
+
+ has_no_event
+ 'stringfield == "2*test"'
+
+ has_no_event
+ 'stringfield == "te\*st"'
+
+ has_no_event
+ 'stringfield == "te*ts"'
+
+ has_no_event
+ 'stringfield == "*\*test"'
+
+ has_no_event
+ 'stringfield == "test\*"'
+
+ ${KIRK_KRAUSS_TESTS[@]}
+
+ END
+)
+
+IFS=$OLDIFS
+
+if [ "$(id -u)" == "0" ]; then
+ isroot=1
+else
+ isroot=0
+fi
+
+skip $isroot "Root access is needed. Skipping all kernel valid filter tests." $NUM_KERNEL_TESTS ||
+{
+ diag "Test kernel valid filters"
+
+ KERNEL_CHECK=1
+ modprobe lttng-test
+
+ i=0
+ while true; do
+ validator="${KERNEL_FILTERS[$i]}"
+
+ if [ "$validator" = END ]; then
+ break
+ fi
+
+ filter="${KERNEL_FILTERS[$(( i + 1 ))]}"
+ test_valid_filter kernel -k "lttng_test_filter_event" "$filter" "validator_$validator"
+
+ if [ $? -eq 1 ]; then
+ stop_lttng_sessiond
+ exit 1
+ fi
+
+ i=$(( i + 2 ))
+ done
+
+ rmmod lttng-test
+}
+