[lttng-dev] [PATCH lttng-tools] Test kernel filtering

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Fri Sep 4 19:00:14 EDT 2015


Requires the new lttng-test.ko lttng-modules test module.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
---
 .../regression/tools/filtering/test_invalid_filter |  48 ++++-
 .../regression/tools/filtering/test_unsupported_op |  52 ++++-
 tests/regression/tools/filtering/test_valid_filter | 232 +++++++++++++++++----
 tests/utils/babelstats.pl                          |  17 +-
 4 files changed, 282 insertions(+), 67 deletions(-)

diff --git a/tests/regression/tools/filtering/test_invalid_filter b/tests/regression/tools/filtering/test_invalid_filter
index 4ba4b8b..bfc817d 100755
--- a/tests/regression/tools/filtering/test_invalid_filter
+++ b/tests/regression/tools/filtering/test_invalid_filter
@@ -24,17 +24,22 @@ SESSION_NAME="filter-invalid"
 EVENT_NAME="bogus"
 ENABLE_EVENT_STDERR="/tmp/invalid-filters-stderr"
 TRACE_PATH=$(mktemp -d)
-NUM_TESTS=146
+NUM_GLOBAL_TESTS=2
+NUM_UST_TESTS=144
+NUM_KERNEL_TESTS=144
+NUM_TESTS=$(($NUM_UST_TESTS+$NUM_KERNEL_TESTS+$NUM_GLOBAL_TESTS))
 
 source $TESTDIR/utils/utils.sh
 
-function enable_ust_lttng_event_filter
+function enable_lttng_event_filter
 {
-	sess_name="$1"
-	event_name="$2"
-	filter="$3"
+	domain="$1"
+	sess_name="$2"
+	event_name="$3"
+	filter="$4"
 
-	$TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-event $event_name -s $sess_name -u --filter "$filter" 2> $ENABLE_EVENT_STDERR 1> /dev/null
+	$TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-event $event_name -s $sess_name \
+		$domain --filter "$filter" 2> $ENABLE_EVENT_STDERR 1> /dev/null
 
 	# Enable must fail
 	if [ $? -eq 0 ]; then
@@ -48,7 +53,8 @@ function enable_ust_lttng_event_filter
 
 function test_invalid_filter
 {
-	test_invalid_filter="$1"
+	domain="$1"
+	test_invalid_filter="$2"
 
 	diag "Test filter expression with invalid filter"
 	diag "Filter: $test_invalid_filter"
@@ -57,7 +63,7 @@ function test_invalid_filter
 	create_lttng_session_ok $SESSION_NAME $TRACE_PATH
 
 	# Apply filter
-	enable_ust_lttng_event_filter $SESSION_NAME $EVENT_NAME "$test_invalid_filter"
+	enable_lttng_event_filter $domain $SESSION_NAME $EVENT_NAME "$test_invalid_filter"
 
 	# Destroy session
 	destroy_lttng_session_ok $SESSION_NAME
@@ -65,6 +71,8 @@ function test_invalid_filter
 
 function test_bytecode_limit
 {
+	domain="$1"
+
 	# Current bytecode limitation is 65536 bytes long.
 	# Generate a huge bytecode with some perl-fu
 	BYTECODE_LIMIT=`perl -e 'print "intfield" . " && 1" x5460'`
@@ -75,7 +83,7 @@ function test_bytecode_limit
 	create_lttng_session_ok $SESSION_NAME $TRACE_PATH
 
 	# Apply filter
-	enable_ust_lttng_event_filter $SESSION_NAME $EVENT_NAME "$BYTECODE_LIMIT"
+	enable_lttng_event_filter $domain $SESSION_NAME $EVENT_NAME "$BYTECODE_LIMIT"
 
 	# Destroy session
 	destroy_lttng_session_ok $SESSION_NAME
@@ -148,12 +156,30 @@ INVALID_FILTERS=(
 		)
 
 start_lttng_sessiond
+diag "Test UST filters"
 for FILTER in ${INVALID_FILTERS[@]};
 do
-	test_invalid_filter "$FILTER"
+	test_invalid_filter -u "$FILTER"
 done
 
-test_bytecode_limit
+test_bytecode_limit -u
+
+if [ "$(id -u)" == "0" ]; then
+	isroot=1
+else
+	isroot=0
+fi
+
+skip $isroot "Root access is needed. Skipping all kernel invalid filter tests." $NUM_KERNEL_TESTS ||
+{
+	diag "Test kernel filters"
+	for FILTER in ${INVALID_FILTERS[@]};
+	do
+		test_invalid_filter -k "$FILTER"
+	done
+
+	test_bytecode_limit -k
+}
 
 unset IFS
 stop_lttng_sessiond
diff --git a/tests/regression/tools/filtering/test_unsupported_op b/tests/regression/tools/filtering/test_unsupported_op
index 0c8ceb7..985f14e 100755
--- a/tests/regression/tools/filtering/test_unsupported_op
+++ b/tests/regression/tools/filtering/test_unsupported_op
@@ -24,17 +24,22 @@ SESSION_NAME="filter-unsupported-ops"
 EVENT_NAME="bogus"
 ENABLE_EVENT_STDERR="/tmp/unsupported-ops-enable"
 TRACE_PATH=$(mktemp -d)
-NUM_TESTS=46
+NUM_GLOBAL_TESTS=2
+NUM_UST_TESTS=44
+NUM_KERNEL_TESTS=44
+NUM_TESTS=$(($NUM_UST_TESTS+$NUM_KERNEL_TESTS+$NUM_GLOBAL_TESTS))
+
 source $TESTDIR/utils/utils.sh
 
-function enable_ust_lttng_event_filter_unsupported
+function enable_lttng_event_filter_unsupported
 {
-	sess_name=$1
-	event_name=$2
-	filter=$3
+	domain="$1"
+	sess_name="$2"
+	event_name="$3"
+	filter="$4"
 
 	enable_cmd="$TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-event"
-	$enable_cmd $event_name -s $sess_name -u --filter "$filter" 2> $ENABLE_EVENT_STDERR 1> /dev/null
+	$enable_cmd $event_name -s $sess_name $domain --filter "$filter" 2> $ENABLE_EVENT_STDERR 1> /dev/null
 
 	# Enable must fail
 	if [ $? -eq 0 ]; then
@@ -48,8 +53,9 @@ function enable_ust_lttng_event_filter_unsupported
 
 function test_unsupported_op
 {
-	test_op_str=$1
-	test_op_tkn=$2
+	domain="$1"
+	test_op_str="$2"
+	test_op_tkn="$3"
 
 	diag "Test filter expression with unsupported operator $test_op_str ($test_op_tkn)"
 
@@ -64,7 +70,7 @@ function test_unsupported_op
 	fi
 
 	# Apply filter
-	enable_ust_lttng_event_filter_unsupported $SESSION_NAME $EVENT_NAME "$TEST_FILTER"
+	enable_lttng_event_filter_unsupported $domain $SESSION_NAME $EVENT_NAME "$TEST_FILTER"
 
 	# Test stderr for unsupported operator
 
@@ -93,12 +99,14 @@ OP_STR=("MUL" "DIV" "MOD" "PLUS" "MINUS" "LSHIFT" "RSHIFT"
 OP_TKN=("*" "/" "%" "+" "-" "<<" ">>" "&" "|" "^" "~")
 
 OP_COUNT=${#OP_STR[@]}
-i=0
 
 start_lttng_sessiond
 
+diag "Test UST unsupported filter operations"
+
+i=0
 while [ "$i" -lt "$OP_COUNT" ]; do
-	test_unsupported_op "${OP_STR[$i]}" "${OP_TKN[$i]}"
+	test_unsupported_op -u "${OP_STR[$i]}" "${OP_TKN[$i]}"
 
 	if [ $? -eq 1 ]; then
 		exit 1
@@ -107,6 +115,28 @@ while [ "$i" -lt "$OP_COUNT" ]; do
 	let "i++"
 done
 
+if [ "$(id -u)" == "0" ]; then
+	isroot=1
+else
+	isroot=0
+fi
+
+skip $isroot "Root access is needed. Skipping all kernel unsupported filter operations tests." $NUM_KERNEL_TESTS ||
+{
+	diag "Test kernel unsupported filter operations"
+
+	i=0
+	while [ "$i" -lt "$OP_COUNT" ]; do
+		test_unsupported_op -k "${OP_STR[$i]}" "${OP_TKN[$i]}"
+
+		if [ $? -eq 1 ]; then
+			exit 1
+		fi
+
+		let "i++"
+	done
+}
+
 stop_lttng_sessiond
 
 # Cleanup
diff --git a/tests/regression/tools/filtering/test_valid_filter b/tests/regression/tools/filtering/test_valid_filter
index df4eb47..28347a4 100755
--- a/tests/regression/tools/filtering/test_valid_filter
+++ b/tests/regression/tools/filtering/test_valid_filter
@@ -20,41 +20,51 @@ TEST_DESC="Filtering - Valid filters"
 CURDIR=$(dirname $0)/
 TESTDIR=$CURDIR/../../..
 LTTNG_BIN="lttng"
-BIN_NAME="gen-ust-events"
 STATS_BIN="$TESTDIR/utils/babelstats.pl"
 SESSION_NAME="valid_filter"
-EVENT_NAME="tp:tptest"
 NR_ITER=100
-NUM_TESTS=290
+NUM_GLOBAL_TESTS=2
+NUM_UST_TESTS=288
+NUM_KERNEL_TESTS=288
+NUM_TESTS=$(($NUM_UST_TESTS+$NUM_KERNEL_TESTS+$NUM_GLOBAL_TESTS))
 
 source $TESTDIR/utils/utils.sh
 
-if [ ! -x "$CURDIR/$BIN_NAME" ]; then
-	BAIL_OUT "No UST nevents binary detected."
-fi
-
-function enable_ust_lttng_event_filter()
+function enable_lttng_event_filter()
 {
-	sess_name="$1"
-	event_name="$2"
-	filter="$3"
+	domain="$1"
+	sess_name="$2"
+	event_name="$3"
+	filter="$4"
 
-	$TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-event $event_name -s $sess_name -u --filter "$filter" 2>&1 >/dev/null
+	$TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-event $event_name \
+			-s $sess_name $domain --filter "$filter" 2>&1 >/dev/null
+	$TESTDIR/../src/bin/lttng/$LTTNG_BIN add-context \
+			-s $sess_name $domain -t procname 2>&1 >/dev/null
 
 	ok $? "Enable lttng event with filtering"
 }
 
-function run_apps
+function run_ust
 {
 	./$CURDIR/$BIN_NAME $NR_ITER >/dev/null 2>&1
 }
 
+function run_kernel
+{
+	# Trigger the event for 100 iterations
+	echo -n "100" > /proc/lttng-test-filter-event
+}
+
 function test_valid_filter
 {
-	filter="$1"
-	validator="$2"
+	domain_name="$1"
+	domain="$2"
+	event_name="$3"
+	filter="$4"
+	validator="$5"
 
-	diag "Test valid filter: $1"
+	diag "Test valid $domain_name filter: $filter"
 
 	trace_path=$(mktemp -d)
 
@@ -62,17 +72,17 @@ function test_valid_filter
 	create_lttng_session_ok $SESSION_NAME $trace_path
 
 	# Enable filter
-	enable_ust_lttng_event_filter $SESSION_NAME $EVENT_NAME $filter
+	enable_lttng_event_filter $domain $SESSION_NAME $event_name $filter
 
 	# Trace apps
 	start_lttng_tracing_ok $SESSION_NAME
-	run_apps
+	run_$domain_name
 	stop_lttng_tracing_ok $SESSION_NAME
 
 	# Destroy session
 	destroy_lttng_session_ok $SESSION_NAME
 
-	stats=`babeltrace $trace_path | $STATS_BIN --tracepoint $EVENT_NAME`
+	stats=`babeltrace $trace_path | $STATS_BIN --tracepoint $event_name`
 
 	rm -rf $trace_path
 
@@ -115,11 +125,13 @@ function validator_intfield
 	validate_min_max "$stats" "netintfieldhex" "0x1" "0x63"
 	status=$(($status|$?))
 
-	validate_min_max "$stats" "floatfield" "2222" "2222"
-	status=$(($status|$?))
+	if [ $KERNEL_CHECK -eq 0 ]; then
+		validate_min_max "$stats" "floatfield" "2222" "2222"
+		status=$(($status|$?))
 
-	validate_min_max "$stats" "doublefield" "2" "2"
-	status=$(($status|$?))
+		validate_min_max "$stats" "doublefield" "2" "2"
+		status=$(($status|$?))
+	fi
 
 	return $status
 }
@@ -311,11 +323,13 @@ function validator_true_statement
 	validate_min_max "$stats" "netintfieldhex" "0x0" "0x63"
 	status=$(($status|$?))
 
-	validate_min_max "$stats" "floatfield" "2222" "2222"
-	status=$(($status|$?))
+	if [ $KERNEL_CHECK -eq 0 ]; then
+		validate_min_max "$stats" "floatfield" "2222" "2222"
+		status=$(($status|$?))
 
-	validate_min_max "$stats" "doublefield" "2" "2"
-	status=$(($status|$?))
+		validate_min_max "$stats" "doublefield" "2" "2"
+		status=$(($status|$?))
+	fi
 
 	validate_min_max "$stats" "stringfield" "\"test\"" "\"test\""
 	status=$(($status|$?))
@@ -338,9 +352,15 @@ issue_356_filter+="intfield > 4 && intfield > 5 && "
 issue_356_filter+="intfield > 6 && intfield > 7 && "
 issue_356_filter+="intfield > 8 || intfield > 0"
 
+start_lttng_sessiond
+
+### UST TESTS
+
+BIN_NAME="gen-ust-events"
+
 # One to one mapping between filters and validators
 
-FILTERS=("intfield"                                                     #1
+UST_FILTERS=("intfield"                                                 #1
 	 "intfield > 1"                                                 #2
 	 "intfield >= 1"                                                #3
 	 "intfield < 2"                                                 #4
@@ -390,7 +410,13 @@ FILTERS=("intfield"                                                     #1
 	 "\"*\" == \$ctx.procname"                                      #48
 )
 
-VALIDATOR=("validator_intfield"                     #1
+UST_FILTER_COUNT=${#UST_FILTERS[@]}
+
+if [ ! -x "$CURDIR/$BIN_NAME" ]; then
+	BAIL_OUT "No UST nevents binary detected."
+fi
+
+UST_VALIDATOR=("validator_intfield"                 #1
 	   "validator_intfield_gt"                  #2
 	   "validator_intfield_ge"                  #3
 	   "validator_intfield_lt"                  #4
@@ -440,14 +466,13 @@ VALIDATOR=("validator_intfield"                     #1
 	   "validator_has_events"                   #48
 )
 
-FILTER_COUNT=${#FILTERS[@]}
-i=0
-
-start_lttng_sessiond
+diag "Test UST valid filters"
 
-while [ "$i" -lt "$FILTER_COUNT" ]; do
+KERNEL_CHECK=0
+i=0
+while [ "$i" -lt "$UST_FILTER_COUNT" ]; do
 
-	test_valid_filter "${FILTERS[$i]}" "${VALIDATOR[$i]}"
+	test_valid_filter ust -u "tp:tptest" "${UST_FILTERS[$i]}" "${UST_VALIDATOR[$i]}"
 
 	if [ $? -eq 1 ]; then
 		stop_lttng_sessiond
@@ -457,4 +482,141 @@ while [ "$i" -lt "$FILTER_COUNT" ]; do
 	let "i++"
 done
 
+
+### KERNEL TESTS
+
+BIN_NAME="test_valid_filt"	# Current script name truncated by kernel
+
+# One to one mapping between filters and validators
+
+KERNEL_FILTERS=("intfield"                                              #1
+	 "intfield > 1"                                                 #2
+	 "intfield >= 1"                                                #3
+	 "intfield < 2"                                                 #4
+	 "intfield <= 2"                                                #5
+	 "intfield == 1"                                                #6
+	 "intfield != 99"                                               #7
+	 "!intfield"                                                    #8
+	 "-intfield"                                                    #9
+	 "--intfield"                                                   #10
+	 "+intfield"                                                    #11
+	 "++intfield"                                                   #12
+	 "intfield > 1 && longfield > 42"                               #13
+	 "intfield >= 42 && longfield <= 42"                            #14
+	 "intfield < 1 || longfield > 98"                               #15
+	 "(stringfield == \"test\" || intfield != 10) && intfield > 33" #16
+	 "intfield < 42.4242424242"                                     #17
+	 "\"test\" == \"test\""                                         #18 #Issue #342
+	 "stringfield == \"test\""                                      #19
+	 "stringfield == \"t*\""                                        #20
+	 "stringfield == \"*\""                                         #21
+	 $issue_356_filter                                              #22 #Issue #356
+	 "intfield < 0xDEADBEEF"                                        #23
+	 "intfield < 0x2"                                               #24
+	 "intfield < 02"                                                #25
+	 "stringfield2 == \"\\\*\""                                     #26
+	 "1.0 || intfield || 1.0"                                       #27
+	 "1 < intfield"                                                 #28
+	 "\$ctx.vtid == 0"                                              #29
+	 "\$ctx.vtid != 0"                                              #30
+	 "0 == \$ctx.vtid"                                              #31
+	 "0 != \$ctx.vtid"                                              #32
+	 "\$ctx.vpid == 0"                                              #33
+	 "\$ctx.vpid != 0"                                              #34
+	 "0 == \$ctx.vpid"                                              #35
+	 "0 != \$ctx.vpid"                                              #36
+	 "\$ctx.procname != \"$BIN_NAME\""                              #37
+	 "\$ctx.procname == \"$BIN_NAME\""                              #38
+	 "\"$BIN_NAME\" != \$ctx.procname"                              #39
+	 "\"$BIN_NAME\" == \$ctx.procname"                              #40
+	 "\$ctx.procname != \"$BIN_NAME*\""                             #41
+	 "\$ctx.procname == \"$BIN_NAME*\""                             #42
+	 "\"$BIN_NAME*\" != \$ctx.procname"                             #43
+	 "\"$BIN_NAME*\" == \$ctx.procname"                             #44
+	 "\$ctx.procname != \"*\""                                      #45
+	 "\$ctx.procname == \"*\""                                      #46
+	 "\"*\" != \$ctx.procname"                                      #47
+	 "\"*\" == \$ctx.procname"                                      #48
+)
+
+KERNEL_FILTER_COUNT=${#KERNEL_FILTERS[@]}
+
+KERNEL_VALIDATOR=("validator_intfield"              #1
+	   "validator_intfield_gt"                  #2
+	   "validator_intfield_ge"                  #3
+	   "validator_intfield_lt"                  #4
+	   "validator_intfield_le"                  #5
+	   "validator_intfield_eq"                  #6
+	   "validator_intfield_ne"                  #7
+	   "validator_intfield_not"                 #8
+	   "validator_intfield"                     #9
+	   "validator_intfield"                     #10
+	   "validator_intfield"                     #11
+	   "validator_intfield"                     #12
+	   "validator_intfield_gt_and_longfield_gt" #13
+	   "validator_intfield_ge_and_longfield_le" #14
+	   "validator_intfield_lt_or_longfield_gt"  #15
+	   "validator_mixed_str_or_int_and_int"     #16
+	   "validator_has_no_event"                 #17 #Unsupported by kernel
+	   "validator_true_statement"               #18
+	   "validator_true_statement"               #19
+	   "validator_true_statement"               #20
+	   "validator_true_statement"               #21
+	   "validator_intfield"                     #22
+	   "validator_true_statement"               #23
+	   "validator_intfield_lt"                  #24
+	   "validator_intfield_lt"                  #25
+	   "validator_true_statement"               #26
+	   "validator_has_no_event"                 #27 #Unsupported by kernel
+	   "validator_intfield_gt"                  #28
+	   "validator_has_no_event"                 #29
+	   "validator_has_events"                   #30
+	   "validator_has_no_event"                 #31
+	   "validator_has_events"                   #32
+	   "validator_has_no_event"                 #33
+	   "validator_has_events"                   #34
+	   "validator_has_no_event"                 #35
+	   "validator_has_events"                   #36
+	   "validator_has_no_event"                 #36
+	   "validator_has_events"                   #37
+	   "validator_has_no_event"                 #38
+	   "validator_has_events"                   #39
+	   "validator_has_no_event"                 #41
+	   "validator_has_events"                   #42
+	   "validator_has_no_event"                 #43
+	   "validator_has_events"                   #44
+	   "validator_has_no_event"                 #45
+	   "validator_has_events"                   #46
+	   "validator_has_no_event"                 #47
+	   "validator_has_events"                   #48
+)
+
+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 [ "$i" -lt "$KERNEL_FILTER_COUNT" ]; do
+
+		test_valid_filter kernel -k "lttng_test_filter_event" \
+				"${KERNEL_FILTERS[$i]}" "${KERNEL_VALIDATOR[$i]}"
+
+		if [ $? -eq 1 ]; then
+			stop_lttng_sessiond
+			exit 1
+		fi
+
+		let "i++"
+	done
+	rmmod lttng-test
+}
+
 stop_lttng_sessiond
diff --git a/tests/utils/babelstats.pl b/tests/utils/babelstats.pl
index 53c85d4..37a9b06 100755
--- a/tests/utils/babelstats.pl
+++ b/tests/utils/babelstats.pl
@@ -92,9 +92,8 @@ sub merge_fields
 	my %merged;
 
 	foreach my $event (@{$events_ref}) {
-		my $tp_provider = $event->{'tp_provider'};
-		my $tp_name     = $event->{'tp_name'};
-		my $tracepoint  = "$tp_provider:$tp_name";
+		my $tp_event     = $event->{'tp_event'};
+		my $tracepoint  = "${tp_event}";
 
 		foreach my $key (keys %{$event->{'fields'}}) {
 			my $val = $event->{'fields'}->{$key};
@@ -148,13 +147,12 @@ while (<>)
 	my $pname       = '.*';
 	my $pinfo       = '.*';
 	my $pid         = '\d+';
-	my $tp_provider = '.*';
-	my $tp_name     = '.*';
+	my $tp_event    = '.*';
 	my $cpu_info    = '{\scpu_id\s=\s(\d+)\s\}';
 	my $fields      = '{(.*)}';
 
 	# Parse babeltrace text output format
-	if (/$timestamp\s$elapsed\s($pinfo)\s($tp_provider):($tp_name):\s$cpu_info,\s$fields/) {
+	if (/$timestamp\s$elapsed\s($pinfo)\s($tp_event):\s$cpu_info,\s$fields/) {
 		my %event_hash;
 		$event_hash{'timestamp'}   = $1;
 		$event_hash{'elapsed'}     = $2;
@@ -165,10 +163,9 @@ while (<>)
 #		$event_hash{'pname'}       = defined($split_pinfo[1]) ? $split_pinfo[1] : undef;
 #		$event_hash{'pid'}         = defined($split_pinfo[2]) ? $split_pinfo[2] : undef;
 
-		$event_hash{'tp_provider'} = $4;
-		$event_hash{'tp_name'}     = $5;
-		$event_hash{'cpu_id'}      = $6;
-		$event_hash{'fields'}      = parse_fields($7);
+		$event_hash{'tp_event'}    = $4;
+		$event_hash{'cpu_id'}      = $5;
+		$event_hash{'fields'}      = parse_fields($6);
 
 		push @events, \%event_hash;
 	}
-- 
2.1.4




More information about the lttng-dev mailing list