X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=tests%2Fregression%2Ftools%2Fclear%2Ftest_kernel;fp=tests%2Fregression%2Ftools%2Fclear%2Ftest_kernel;h=01232863fb2b9fdc25a4aff150c54a6e010679a4;hp=0000000000000000000000000000000000000000;hb=c28fcefd993b7539716bb5cd9557a08a217ec463;hpb=56d48389d883f56a0ac017885dc6ad25dab5bc91 diff --git a/tests/regression/tools/clear/test_kernel b/tests/regression/tools/clear/test_kernel new file mode 100755 index 000000000..01232863f --- /dev/null +++ b/tests/regression/tools/clear/test_kernel @@ -0,0 +1,641 @@ +#!/bin/bash +# +# Copyright (C) - 2019 Jonathan Rajotte-Julien +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +TEST_DESC="Clear - Kernel tracing" + +CURDIR=$(dirname $0)/ +TESTDIR=$CURDIR/../../.. +EVENT_NAME="lttng_test_filter_event" + +PAGE_SIZE=$(getconf PAGE_SIZE) +TRACE_PATH=$(mktemp -d) + +NUM_TESTS=837 + +source $TESTDIR/utils/utils.sh + +function signal_cleanup () +{ + stop_lttng_sessiond + modprobe -r lttng-test + full_cleanup +} + +function clean_path () +{ + local trace_path=$1 + set -u + rm -rf $trace_path/* + set +u +} + +function cond_start_tracing () +{ + local session_name=$1 + local tracing_active=$2 + + if [[ $tracing_active -ne 1 ]]; then + start_lttng_tracing_ok $session_name + fi +} + +function cond_stop_tracing () +{ + local session_name=$1 + local tracing_active=$2 + + if [[ $tracing_active -ne 1 ]]; then + stop_lttng_tracing_ok $session_name + fi +} + +function do_clear_session () +{ + local session_name=$1 + local tracing_active=$2 + local clear_twice=$3 + local rotate_before=$4 + local rotate_after=$5 + + cond_stop_tracing $session_name $tracing_active + if [[ $rotate_before -eq 1 ]]; then + rotate_session_ok $SESSION_NAME + fi + lttng_clear_session_ok $SESSION_NAME + if [[ $clear_twice -eq 1 ]]; then + lttng_clear_session_ok $SESSION_NAME + fi + if [[ $rotate_after -eq 1 ]]; then + if [[ $tracing_active -eq 1 ]]; then + rotate_session_ok $SESSION_NAME + else + # Expect failure + rotate_session_fail $SESSION_NAME + fi + fi + cond_start_tracing $session_name $tracing_active +} + +function test_kernel_streaming () +{ + local tracing_active=$1 + local clear_twice=$2 + local rotate_before=$3 + local rotate_after=$4 + local local_path="${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*" + + diag "Test kernel streaming clear" + diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice, rotate_before=$rotate_before, rotate_after=$rotate_after" + create_lttng_session_uri $SESSION_NAME net://localhost + lttng_enable_kernel_event $SESSION_NAME $EVENT_NAME + start_lttng_tracing_ok $SESSION_NAME + # Generate 10 events that will sit in the buffers. + echo -n "10" > /proc/lttng-test-filter-event + + do_clear_session $SESSION_NAME $tracing_active $clear_twice $rotate_before $rotate_after + + stop_lttng_tracing_ok $SESSION_NAME + + if [[ $rotate_before -eq 1 ]]; then + validate_trace_count $EVENT_NAME $local_path 10 + else + validate_trace_empty $local_path + fi + + destroy_lttng_session_ok $SESSION_NAME +} + +function test_kernel_streaming_rotate_clear () +{ + local tracing_active=$1 + local clear_twice=$2 + local rotate_before=$3 + local rotate_after=$4 + local local_path="${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*" + + diag "Test kernel streaming rotate-clear" + diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice, rotate_before=$rotate_before, rotate_after=$rotate_after" + create_lttng_session_uri $SESSION_NAME net://localhost + lttng_enable_kernel_event $SESSION_NAME $EVENT_NAME + start_lttng_tracing_ok $SESSION_NAME + echo -n "1" > /proc/lttng-test-filter-event + rotate_session_ok $SESSION_NAME + echo -n "2" > /proc/lttng-test-filter-event + do_clear_session $SESSION_NAME $tracing_active $clear_twice $rotate_before $rotate_after + echo -n "3" > /proc/lttng-test-filter-event + + stop_lttng_tracing_ok $SESSION_NAME + + if [[ $rotate_before -eq 1 ]]; then + local expect_count=6 + else + local expect_count=4 + fi + validate_trace_count $EVENT_NAME $local_path $expect_count + + destroy_lttng_session_ok $SESSION_NAME +} + +function test_kernel_streaming_clear_rotate() +{ + local tracing_active=$1 + local clear_twice=$2 + local rotate_before=$3 + local rotate_after=$4 + local local_path="${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*" + + diag "Test kernel streaming clear-rotate" + diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice, rotate_before=$rotate_before, rotate_after=$rotate_after" + create_lttng_session_uri $SESSION_NAME net://localhost + lttng_enable_kernel_event $SESSION_NAME $EVENT_NAME + start_lttng_tracing_ok $SESSION_NAME + echo -n "1" > /proc/lttng-test-filter-event + do_clear_session $SESSION_NAME $tracing_active $clear_twice $rotate_before $rotate_after + echo -n "2" > /proc/lttng-test-filter-event + rotate_session_ok $SESSION_NAME + echo -n "3" > /proc/lttng-test-filter-event + + stop_lttng_tracing_ok $SESSION_NAME + + if [[ $rotate_before -eq 1 ]]; then + local expect_count=6 + else + local expect_count=5 + fi + validate_trace_count $EVENT_NAME $local_path $expect_count + + destroy_lttng_session_ok $SESSION_NAME +} + +function test_kernel_streaming_live () +{ + local tracing_active=$1 + local clear_twice=$2 + local local_path="${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*" + + diag "Test kernel streaming live clear" + diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice" + create_lttng_session_uri $SESSION_NAME net://localhost "--live" + lttng_enable_kernel_event $SESSION_NAME $EVENT_NAME + start_lttng_tracing_ok $SESSION_NAME + # Generate 10 events that will sit in the buffers. + echo -n "10" > /proc/lttng-test-filter-event + do_clear_session $SESSION_NAME $tracing_active $clear_twice 0 0 + stop_lttng_tracing_ok $SESSION_NAME + + validate_trace_empty $local_path + + destroy_lttng_session_ok $SESSION_NAME +} + +#no clear +function test_kernel_basic_streaming_live_viewer () +{ + local tracing_active=$1 + local clear_twice=$2 + # 3, 4 unused + local local_path="${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*" + local remote_trace_path="${HOSTNAME}/${SESSION_NAME}" + local channel_name="chan" + local bt_output_path=$(mktemp -u) + local file_sync_before_exit=$(mktemp -u) + + diag "Test kernel basic streaming live with viewer" + diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice" + create_lttng_session_uri $SESSION_NAME net://localhost "--live" + enable_kernel_lttng_channel_ok $SESSION_NAME $channel_name + enable_kernel_lttng_event_ok $SESSION_NAME $EVENT_NAME $channel_name + start_lttng_tracing_ok $SESSION_NAME + + wait_live_trace_ready net://localhost + + # Connect a live viewer + $BABELTRACE_BIN -i lttng-live net://localhost/host/$remote_trace_path > $bt_output_path & + local viewer_pid=$! + + wait_live_viewer_connect net://localhost + + echo -n "10" > /proc/lttng-test-filter-event + + diag "Wait until viewer sees all 10 expected events" + local evcount=0 + while [ $evcount -ne 10 ]; do + evcount=$(cat $bt_output_path | wc -l) + sleep 0.5 + done + pass "Live viewer read $evcount events, expect 10" + + destroy_lttng_session_ok $SESSION_NAME + touch $file_sync_before_exit + diag "Wait for viewer to exit" + wait $viewer_pid + ok $? "Babeltrace succeeds" + pass "Wait for viewer to exit" + + rm -f $bt_output_path + rm -f $file_sync_before_exit +} + +function test_kernel_streaming_live_viewer () +{ + local tracing_active=$1 + local clear_twice=$2 + # 3, 4 unused + local local_path="${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*" + local remote_trace_path="${HOSTNAME}/${SESSION_NAME}" + local channel_name="chan" + local bt_output_path=$(mktemp -d)/bt-output.txt + + diag "Test kernel streaming live clear with viewer" + diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice" + create_lttng_session_uri $SESSION_NAME net://localhost "--live" + enable_kernel_lttng_channel_ok $SESSION_NAME $channel_name + enable_kernel_lttng_event_ok $SESSION_NAME $EVENT_NAME $channel_name + start_lttng_tracing_ok $SESSION_NAME + + wait_live_trace_ready net://localhost + + # Connect a live viewer + $BABELTRACE_BIN -i lttng-live net://localhost/host/$remote_trace_path > $bt_output_path & + local viewer_pid=$! + + wait_live_viewer_connect net://localhost + + echo -n "10" > /proc/lttng-test-filter-event + do_clear_session $SESSION_NAME $tracing_active $clear_twice 0 0 + stop_lttng_tracing_ok $SESSION_NAME + + destroy_lttng_session_ok $SESSION_NAME + diag "Wait for viewer to exit" + wait $viewer_pid + ok $? "Babeltrace succeeds" + pass "Wait for viewer to exit" + + clean_path $bt_output_path +} + +function test_kernel_local () +{ + local tracing_active=$1 + local clear_twice=$2 + local rotate_before=$3 + local rotate_after=$4 + + diag "Test kernel local" + diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice, rotate_before=$rotate_before, rotate_after=$rotate_after" + create_lttng_session_ok $SESSION_NAME $TRACE_PATH + lttng_enable_kernel_event $SESSION_NAME $EVENT_NAME + start_lttng_tracing_ok $SESSION_NAME + # Generate 10 events that will sit in the buffers. + echo -n "10" > /proc/lttng-test-filter-event + do_clear_session $SESSION_NAME $tracing_active $clear_twice $rotate_before $rotate_after + stop_lttng_tracing_ok $SESSION_NAME + + if [[ $rotate_before -eq 1 ]]; then + validate_trace_count $EVENT_NAME $TRACE_PATH 10 + else + validate_trace_empty $TRACE_PATH + fi + + destroy_lttng_session_ok $SESSION_NAME +} + +function test_kernel_local_rotate_clear () +{ + local tracing_active=$1 + local clear_twice=$2 + local rotate_before=$3 + local rotate_after=$4 + + diag "Test kernel local rotate-clear" + diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice, rotate_before=$rotate_before, rotate_after=$rotate_after" + create_lttng_session_ok $SESSION_NAME $TRACE_PATH + lttng_enable_kernel_event $SESSION_NAME $EVENT_NAME + start_lttng_tracing_ok $SESSION_NAME + echo -n "1" > /proc/lttng-test-filter-event + rotate_session_ok $SESSION_NAME + echo -n "2" > /proc/lttng-test-filter-event + do_clear_session $SESSION_NAME $tracing_active $clear_twice $rotate_before $rotate_after + echo -n "3" > /proc/lttng-test-filter-event + stop_lttng_tracing_ok $SESSION_NAME + + if [[ $rotate_before -eq 1 ]]; then + local expect_count=6 + else + local expect_count=4 + fi + validate_trace_count $EVENT_NAME $TRACE_PATH $expect_count + + destroy_lttng_session_ok $SESSION_NAME +} + +function test_kernel_local_clear_rotate() +{ + local tracing_active=$1 + local clear_twice=$2 + local rotate_before=$3 + local rotate_after=$4 + + diag "Test kernel local clear-rotate" + diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice, rotate_before=$rotate_before, rotate_after=$rotate_after" + create_lttng_session_ok $SESSION_NAME $TRACE_PATH + lttng_enable_kernel_event $SESSION_NAME $EVENT_NAME + start_lttng_tracing_ok $SESSION_NAME + echo -n "1" > /proc/lttng-test-filter-event + do_clear_session $SESSION_NAME $tracing_active $clear_twice $rotate_before $rotate_after + echo -n "2" > /proc/lttng-test-filter-event + rotate_session_ok $SESSION_NAME + echo -n "3" > /proc/lttng-test-filter-event + stop_lttng_tracing_ok $SESSION_NAME + + if [[ $rotate_before -eq 1 ]]; then + local expect_count=6 + else + local expect_count=5 + fi + validate_trace_count $EVENT_NAME $TRACE_PATH $expect_count + + destroy_lttng_session_ok $SESSION_NAME +} + +function do_kernel_snapshot () +{ + local session_name=$1 + local trace_path=$2 + local tracing_active=$3 + local clear_twice=$4 + local rotate_before=$5 + local rotate_after=$6 + + lttng_enable_kernel_event $session_name $EVENT_NAME + start_lttng_tracing_ok $session_name + + # Generate 10 events that will sit in the buffers. + echo -n "10" > /proc/lttng-test-filter-event + + # Take a first snapshot and validate that the events are present. + lttng_snapshot_record $session_name + stop_lttng_tracing_ok $session_name + validate_trace_count $EVENT_NAME $trace_path 10 + + # Clean the output path + clean_path $trace_path + start_lttng_tracing_ok $session_name + + do_clear_session $SESSION_NAME $tracing_active $clear_twice 0 0 + + # Make sure the subsequent snapshot is empty and valid. + lttng_snapshot_record $session_name + stop_lttng_tracing_ok $session_name + validate_trace_empty $trace_path + + # Clean the output path + clean_path $trace_path + start_lttng_tracing_ok $session_name + + # Make sure that everything still works, generate events and take a + # snapshot. + echo -n "10" > /proc/lttng-test-filter-event + lttng_snapshot_record $session_name + stop_lttng_tracing_ok $session_name + validate_trace_count $EVENT_NAME $trace_path 10 +} + +function test_kernel_streaming_snapshot () +{ + local tracing_active=$1 + local clear_twice=$2 + + diag "Test kernel streaming snapshot clear" + diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice" + + create_lttng_session_uri $SESSION_NAME net://localhost "--snapshot" + do_kernel_snapshot $SESSION_NAME $TRACE_PATH $tracing_active $clear_twice + destroy_lttng_session_ok $SESSION_NAME +} + +function test_kernel_local_snapshot () +{ + local tracing_active=$1 + local clear_twice=$2 + + diag "Test kernel local snapshot clear" + diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice" + + create_lttng_session_ok $SESSION_NAME $TRACE_PATH "--snapshot" + do_kernel_snapshot $SESSION_NAME $TRACE_PATH $tracing_active $clear_twice + destroy_lttng_session_ok $SESSION_NAME +} + +function test_kernel_streaming_tracefile_rotation () +{ + local tracing_active=$1 + local clear_twice=$2 + local rotate_before=$3 + local rotate_after=$4 + local channel_name="rotchan" + local local_path="${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*" + + diag "Test kernel streaming clear with tracefile rotation" + diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice, rotate_before=$rotate_before, rotate_after=$rotate_after" + create_lttng_session_uri $SESSION_NAME net://localhost + enable_kernel_lttng_channel_ok $SESSION_NAME $channel_name --subbuf-size=$PAGE_SIZE \ + --tracefile-size=$PAGE_SIZE --tracefile-count=2 + enable_kernel_lttng_event_ok $SESSION_NAME $EVENT_NAME $channel_name + start_lttng_tracing_ok $SESSION_NAME + echo -n "10" > /proc/lttng-test-filter-event + do_clear_session $SESSION_NAME $tracing_active $clear_twice $rotate_before $rotate_after + stop_lttng_tracing_ok $SESSION_NAME + + if [[ $rotate_before -eq 1 ]]; then + validate_trace_count $EVENT_NAME $local_path 10 + else + validate_trace_empty $local_path + fi + + start_lttng_tracing_ok $SESSION_NAME + echo -n "20" > /proc/lttng-test-filter-event + stop_lttng_tracing_ok + + if [[ $rotate_before -eq 1 ]]; then + validate_trace_count $EVENT_NAME $local_path 30 + else + validate_trace_count $EVENT_NAME $local_path 20 + fi + + destroy_lttng_session_ok $SESSION_NAME +} + +# With 1 byte per event (as strict minimum), generating 200000 events +# guarantees filling up 2 files of 64k in size, which is the maximum +# page size known on Linux +function test_kernel_streaming_tracefile_rotation_overwrite_files () +{ + local tracing_active=$1 + local clear_twice=$2 + local rotate_before=$3 + local rotate_after=$4 + local channel_name="rotchan" + local local_path="${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*" + + diag "Test kernel streaming clear with tracefile rotation, overwrite files" + diag "Parameters: tracing_active=$tracing_active, clear_twice=$clear_twice, rotate_before=$rotate_before, rotate_after=$rotate_after" + create_lttng_session_uri $SESSION_NAME net://localhost + enable_kernel_lttng_channel_ok $SESSION_NAME $channel_name --subbuf-size=$PAGE_SIZE \ + --tracefile-size=$PAGE_SIZE --tracefile-count=2 + enable_kernel_lttng_event_ok $SESSION_NAME $EVENT_NAME $channel_name + start_lttng_tracing_ok $SESSION_NAME + taskset -c 0 echo -n "200000" > /proc/lttng-test-filter-event + do_clear_session $SESSION_NAME $tracing_active $clear_twice $rotate_before $rotate_after + stop_lttng_tracing_ok $SESSION_NAME + + if [[ $rotate_before -eq 1 ]]; then + validate_trace_count_range_incl_min_excl_max $EVENT_NAME $local_path 1 200000 + else + validate_trace_empty $local_path + fi + + start_lttng_tracing_ok $SESSION_NAME + taskset -c 0 echo -n "400000" > /proc/lttng-test-filter-event + stop_lttng_tracing_ok + + if [[ $rotate_before -eq 1 ]]; then + validate_trace_count_range_incl_min_excl_max $EVENT_NAME $local_path 1 600000 + else + validate_trace_count_range_incl_min_excl_max $EVENT_NAME $local_path 1 200000 + fi + + destroy_lttng_session_ok $SESSION_NAME +} + +function test_kernel_disallow_clear () +{ + diag "Test kernel disallow clear on relay daemon" + SESSION_NAME=$(randstring 16 0) + + LTTNG_RELAYD_DISALLOW_CLEAR=1 start_lttng_relayd "-o $TRACE_PATH" + + start_lttng_sessiond + + create_lttng_session_uri $SESSION_NAME net://localhost + enable_kernel_lttng_event_ok $SESSION_NAME $EVENT_NAME + start_lttng_tracing_ok $SESSION_NAME + lttng_clear_session_fail $SESSION_NAME + destroy_lttng_session_ok $SESSION_NAME + + stop_lttng_sessiond + stop_lttng_relayd + clean_path $TRACE_PATH +} + +plan_tests $NUM_TESTS + +print_test_banner "$TEST_DESC" + +if [ "$(id -u)" == "0" ]; then + isroot=1 +else + isroot=0 +fi + +streaming_tests=(test_kernel_streaming + test_kernel_streaming_rotate_clear + test_kernel_streaming_clear_rotate + test_kernel_streaming_tracefile_rotation + test_kernel_streaming_tracefile_rotation_overwrite_files +) + +live_tests=(test_kernel_streaming_live + test_kernel_basic_streaming_live_viewer + test_kernel_streaming_live_viewer +) + +local_tests=(test_kernel_local + test_kernel_local_rotate_clear + test_kernel_local_clear_rotate +) + +snapshot_tests=(test_kernel_streaming_snapshot + test_kernel_local_snapshot +) + +skip $isroot "Root access is needed. Skipping all kernel streaming tests." $NUM_TESTS || +{ + trap signal_cleanup SIGTERM SIGINT + + validate_lttng_modules_present + + start_lttng_relayd "-o $TRACE_PATH" + start_lttng_sessiond + modprobe lttng-test + + # Clear with tracing active, clear once + for fct_test in ${streaming_tests[@]} ${live_tests[@]} ${local_tests[@]} ${snapshot_tests[@]}; + do + SESSION_NAME=$(randstring 16 0) + ${fct_test} 1 0 0 0 + clean_path $TRACE_PATH + done + + # Clear with tracing active, clear twice + for fct_test in ${streaming_tests[@]} ${live_tests[@]} ${local_tests[@]} ${snapshot_tests[@]}; + do + SESSION_NAME=$(randstring 16 0) + ${fct_test} 1 1 0 0 + clean_path $TRACE_PATH + done + + # Clear with tracing inactive, clear once + for fct_test in ${streaming_tests[@]} ${live_tests[@]} ${local_tests[@]} ${snapshot_tests[@]}; + do + SESSION_NAME=$(randstring 16 0) + ${fct_test} 0 0 0 0 + clean_path $TRACE_PATH + done + + # Clear with tracing inactive, clear twice + for fct_test in ${streaming_tests[@]} ${live_tests[@]} ${local_tests[@]} ${snapshot_tests[@]}; + do + SESSION_NAME=$(randstring 16 0) + ${fct_test} 0 1 0 0 + clean_path $TRACE_PATH + done + + # Clear with tracing inactive, rotate-clear once + for fct_test in ${streaming_tests[@]} ${local_tests[@]}; + do + SESSION_NAME=$(randstring 16 0) + ${fct_test} 0 0 1 0 + clean_path $TRACE_PATH + done + + # Clear with tracing inactive, clear once-rotate(fail) + for fct_test in ${streaming_tests[@]} ${local_tests[@]}; + do + SESSION_NAME=$(randstring 16 0) + ${fct_test} 0 0 0 1 + clean_path $TRACE_PATH + done + + rmmod lttng-test + stop_lttng_sessiond + stop_lttng_relayd + + test_kernel_disallow_clear +} + +clean_path $TRACE_PATH