[lttng-dev] [PATCH lttng-tools] Test kernel filtering
Jérémie Galarneau
jeremie.galarneau at efficios.com
Sun Sep 6 13:44:11 EDT 2015
Merged and added to the "root_regression" test list.
Thanks!
Jérémie
On Fri, Sep 4, 2015 at 7:00 PM, Mathieu Desnoyers
<mathieu.desnoyers at efficios.com> wrote:
> 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
>
--
Jérémie Galarneau
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list