X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=tests%2Fregression%2Ftools%2Fcrash%2Ftest_crash;fp=tests%2Fregression%2Ftools%2Fcrash%2Ftest_crash;h=ff5d0e3261d83c149ee3d1573ba4e5fe9c879849;hp=0000000000000000000000000000000000000000;hb=4c80129b997f0fde87c1355ebf2c44fda8fdb13c;hpb=811a4037bee26a445b338ba524d979c0c27ca03a diff --git a/tests/regression/tools/crash/test_crash b/tests/regression/tools/crash/test_crash new file mode 100755 index 000000000..ff5d0e326 --- /dev/null +++ b/tests/regression/tools/crash/test_crash @@ -0,0 +1,400 @@ +#!/bin/bash +# +# Copyright (C) - 2015 Jonathan Rajotte +# +# 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="LTTng-crash & shm testing" + +CURDIR=$(dirname $0)/ +TESTDIR=$CURDIR/../../../ +CRASH_BIN="lttng-crash" + +# Test app for ust event +TESTAPP_PATH="$TESTDIR/utils/testapp" +TESTAPP_NAME="gen-ust-events" +TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME" +NR_USEC_WAIT=0 +NR_ITER=-1 + +# Temp file output +OUTPUT_DIR=$(mktemp -d) + +NUM_TESTS=70 + +source $TESTDIR/utils/utils.sh + +# Global declaration for simplification +LTTNG_CRASH=$TESTDIR/../src/bin/lttng-crash/$CRASH_BIN + +# MUST set TESTDIR before calling those functions +plan_tests $NUM_TESTS + +print_test_banner "$TEST_DESC" + +function start_test_app() +{ + local tmp_file=$(mktemp -u) + + # Start application with a temporary file. + $TESTAPP_BIN $NR_ITER $NR_USEC_WAIT $tmp_file & + ret=$? + APPS_PID="${APPS_PID} ${!}" + ok $ret "Start application to trace" + + # Wait for the application file to appear indicating that at least one + # tracepoint has been fired. + while [ ! -f "$tmp_file" ]; do + sleep 0.5 + done + diag "Removing test app temporary file $tmp_file" + rm -rf $tmp_file +} + +function stop_test_apps() +{ + diag "Stopping $TESTAPP_NAME" + for p in ${APPS_PID}; do + diag "Stopping $p" + kill ${p} 2>/dev/null + wait ${p} 2>/dev/null + diag "Stopped $p" + done + APPS_PID= +} + +function stop_test_app() +{ + local pid="$1" + for p in ${pid}; do + diag "Stopping $p" + kill ${p} 2>/dev/null + wait ${p} 2>/dev/null + done +} + +function verify_path_dont_exists() +{ + local path=$1 + local timeout_try_limit=100 + local timeout_try_count=0 + local timeout_flag=0 + + while find $path -mindepth 1 -maxdepth 1 &>/dev/null ; do + if [[ $timeout_try_count -gt $timeout_try_limit ]]; then + timeout_flag=1 + break + fi + timeout_try_count=$((timeout_try_count+1)) + sleep 0.1 + done + return $timeout_flag +} + +function test_shm_path_per_pid() +{ + diag "Shm: ust per-pid test" + local session_name=shm_path_per_pid + local channel_name=channel_per_pid + local shm_path=$(mktemp -d) + + # Build up + start_lttng_sessiond + create_lttng_session_ok $session_name $OUTPUT_DIR "--shm-path $shm_path" + enable_ust_lttng_channel_ok $session_name $channel_name "--buffers-pid" + + diag "Shm: clean state" + file_count=$(find $shm_path -mindepth 1 -maxdepth 1 | wc -l) + test $file_count -eq "0" + ok $? "No file created on set-up" + + # Look for per-pid folder structure + # Start first test app + diag "Shm: check folder creation and structure" + + start_test_app + first_app_pid=$APPS_PID + shm_session_path=$(find $shm_path -mindepth 1 -maxdepth 1) + + file_count=$(echo "$shm_session_path"| wc -l) + test $file_count -eq "1" + ok $? "Path $shm_session_path created on application creation" + + first_pid_path=$(find $shm_session_path/ust/pid -mindepth 1 -maxdepth 1) + ok $? "Pid path exists: $first_pid_path" + + file_count=$(find $shm_session_path/ust/pid -mindepth 1 -maxdepth 1 | wc -l) + test $file_count -eq "1" + ok $? "Expect 1 pid registration folder got $file_count" + + # Check for buffer and metadata presence in ust/pid/appfolder + file_count=$(find $first_pid_path/ -mindepth 1 -maxdepth 1 | wc -l) + test $file_count -ne "0" + ok $? "Expect > 0 buffer and metadata files got $file_count" + + # Start second application pid + diag "Shm: check basic creation of second ust application" + + start_test_app + second_pid_path=$(find $shm_session_path/ust/pid -mindepth 1 -maxdepth 1) + ok $? "Pid path exist found $second_pid_path" + + file_count=$(find $shm_session_path/ust/pid -mindepth 1 -maxdepth 1 | wc -l) + test $file_count -eq "2" + ok $? "Expect 2 pid registration folder got $file_count" + + # Stop first test application and check for cleanup + stop_test_app "$first_app_pid" + verify_path_dont_exists "$first_pid_path" + ok $? "First pid cleanup" + + # Stop all applications and check for full cleanup + stop_test_apps + verify_path_dont_exists "$shm_session_path" + ok $? "Full cleanup" + + # Tear down + destroy_lttng_session_ok $session_name + stop_lttng_sessiond + rm -rf $shm_path +} + +function test_shm_path_per_uid() +{ + diag "Shm: ust per-uid test" + local session_name=shm_path_per_uid + local channel_name=channel_per_uid + local shm_path=$(mktemp -d) + + # Build up + start_lttng_sessiond + create_lttng_session_ok $session_name $OUTPUT_DIR "--shm-path $shm_path" + enable_ust_lttng_channel_ok $session_name $channel_name "--buffers-uid" + + diag "Shm: test clean state" + file_count=$(find $shm_path -mindepth 1 -maxdepth 1 | wc -l) + test $file_count -eq "0" + ok $? "No files created on set-up" + + # Look for per-pid folder structure + # Start first test app + diag "Shm: check folder creation and structure" + + start_test_app + shm_session_path=$(find $shm_path -mindepth 1 -maxdepth 1) + file_count=$(echo "$shm_session_path"| wc -l) + test $file_count -eq "1" + ok $? "Path $shm_session_path created on application creation" + + uid_path=$(find $shm_session_path/ust/uid -mindepth 1 -maxdepth 1) + ok $? "uid path exist found $uid_path" + + file_count=$(find $shm_session_path/ust/uid -mindepth 1 -maxdepth 1 | wc -l) + test $file_count -eq "1" + ok $? "Expect 1 uid registration folder got $file_count" + + # Stop all applications and check for uid presence + stop_test_apps + file_count=$(find $shm_session_path/ust/uid -mindepth 1 -maxdepth 1 | wc -l) + test $file_count -eq "1" + ok $? "Expect 1 uid registration folder got $file_count" + + # Test full cleanup + destroy_lttng_session_ok $session_name + verify_path_dont_exists "$shm_session_path" + ok $? "Full cleanup" + + stop_lttng_sessiond + rm -rf $shm_path +} + +function test_lttng_crash() +{ + diag "Lttng-crash: basic recuperation" + local session_name=crash_test + local channel_name=channel_crash + local shm_path=$(mktemp -d) + local event_name="tp:tptest" + + # Create a session in snapshot mode to deactivate any use of consumerd + start_lttng_sessiond + create_lttng_session_ok $session_name $OUTPUT_DIR "--shm-path $shm_path --snapshot" + enable_ust_lttng_channel_ok $session_name $channel_name "--buffers-uid" + enable_ust_lttng_event_ok $session_name $event_name $channel_name + start_lttng_tracing_ok $session_name + + # Generate 10 events + $TESTAPP_BIN 10 0 + stop_lttng_tracing + + crash_recup_count=$($LTTNG_CRASH $shm_path | wc -l) + test $crash_recup_count -eq "10" + ok $? "Expect 10 recup event from buffers got $crash_recup_count" + + # Tear down + destroy_lttng_session_ok $session_name + stop_lttng_sessiond + rm -rf $shm_path +} + +function test_lttng_crash_extraction() +{ + diag "Lttng-crash: extraction to path" + local session_name=crash_test + local channel_name=channel_crash + local shm_path=$(mktemp -d) + local extraction_dir_path=$(mktemp -d) + local extraction_path=$extraction_dir_path/extract + local event_name="tp:tptest" + + # Create a session in snapshot mode to deactivate any use of consumerd + start_lttng_sessiond + create_lttng_session_ok $session_name $OUTPUT_DIR "--shm-path $shm_path --snapshot" + enable_ust_lttng_channel_ok $session_name $channel_name "--buffers-uid" + enable_ust_lttng_event_ok $session_name $event_name $channel_name + + start_lttng_tracing_ok $session_name + # Generate 10 events + $TESTAPP_BIN 10 0 + stop_lttng_tracing + + $LTTNG_CRASH -x $extraction_path $shm_path + ok $? "Extraction of crashed buffers to path" + + # Test extracted trace + trace_match_only $event_name 10 $extraction_path + + # Tear down + destroy_lttng_session_ok $session_name + stop_lttng_sessiond + rm -rf $shm_path + rm -rf $extraction_dir_path +} + +function test_shm_path_per_pid_sigint() +{ + diag "Shm: ust per-pid test sigint" + local session_name=shm_path_per_pid + local channel_name=channel_per_pid + local shm_path=$(mktemp -d) + local num_files=0 + + # Build up + start_lttng_sessiond + create_lttng_session_ok $session_name $OUTPUT_DIR "--shm-path $shm_path" + enable_ust_lttng_channel_ok $session_name $channel_name "--buffers-pid" + + start_test_app + start_test_app + shm_session_path=$(find $shm_path -mindepth 1 -maxdepth 1) + + # Stop sessiond with sigint + stop_lttng_sessiond SIGINT + + # Looking for a full cleanup + verify_path_dont_exists "$shm_session_path" + ok $? "Full cleanup on sigint" + + # Tear down + stop_test_apps + rm -rf $shm_path +} + +function test_shm_path_per_uid_sigint() +{ + diag "Shm: ust per-uid test sigint" + local session_name=shm_path_per_uid_sigint + local channel_name=channel_per_uid_sigint + local shm_path=$(mktemp -d) + local ret=0 + + # Build up + start_lttng_sessiond + create_lttng_session_ok $session_name $OUTPUT_DIR "--shm-path $shm_path" + enable_ust_lttng_channel_ok $session_name $channel_name "--buffers-uid" + + start_test_app + start_test_app + shm_session_path=$(find $shm_path -mindepth 1 -maxdepth 1) + + # Test full cleanup on SIGINT + stop_lttng_sessiond SIGINT + + # Looking for a full cleanup + verify_path_dont_exists "$shm_session_path" + ok $? "Full cleanup on sigint" + + # Tear down + stop_test_apps + rm -rf $shm_path +} + +function test_lttng_crash_extraction_sigkill() +{ + diag "Lttng-crash: extraction with sigkill" + local session_name=crash_test + local channel_name=channel_crash + local shm_path=$(mktemp -d) + local extraction_dir_path=$(mktemp -d) + local extraction_path=$extraction_dir_path/extract + local event_name="tp:tptest" + local ret=0 + + start_lttng_sessiond + create_lttng_session_ok $session_name $OUTPUT_DIR "--shm-path $shm_path" + enable_ust_lttng_channel_ok $session_name $channel_name "--buffers-uid" + enable_ust_lttng_event_ok $session_name $event_name $channel_name + start_lttng_tracing_ok $session_name + + # Generate 10 events + $TESTAPP_BIN 10 0 + + # Kill the consumers then sessiond with sigkill + stop_lttng_consumerd SIGKILL + stop_lttng_sessiond SIGKILL + + $LTTNG_CRASH -x $extraction_path $shm_path + ret=$? + ok $ret "Extraction of crashed buffers to path $extraction_path" + + # Test extracted trace + trace_match_only $event_name 10 $extraction_path + + # Tear down + stop_test_apps + rm -rf $shm_path + rm -rf $extraction_dir_path +} + +TESTS=( + test_shm_path_per_uid + test_shm_path_per_pid + test_lttng_crash + test_lttng_crash_extraction + test_shm_path_per_pid_sigint + test_shm_path_per_uid_sigint + test_lttng_crash_extraction_sigkill +) + + +for fct_test in ${TESTS[@]}; +do + ${fct_test} + if [ $? -ne 0 ]; then + break; + fi +done +rm -rf $OUTPUT_DIR + +OUTPUT_DEST=/dev/null 2>&1