Test: lttng-crash and ust shm path
[lttng-tools.git] / tests / regression / tools / crash / test_crash
diff --git a/tests/regression/tools/crash/test_crash b/tests/regression/tools/crash/test_crash
new file mode 100755 (executable)
index 0000000..ff5d0e3
--- /dev/null
@@ -0,0 +1,400 @@
+#!/bin/bash
+#
+# Copyright (C) - 2015 Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
+#
+# 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
This page took 0.026408 seconds and 4 git commands to generate.