Implement userspace-probe regression tests
[lttng-tools.git] / tests / regression / kernel / test_userspace_probe
diff --git a/tests/regression/kernel/test_userspace_probe b/tests/regression/kernel/test_userspace_probe
new file mode 100755 (executable)
index 0000000..fb8ce30
--- /dev/null
@@ -0,0 +1,846 @@
+#!/bin/bash
+#
+# Copyright (C) - 2017 Erica Bugden <erica.bugden@efficios.com>
+# Copyright (C) - 2017 Francis Deslauriers <francis.deslauriers@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="Userspace probe - Testing userspace probe on ELF symbol"
+
+CURDIR=$(dirname "$0")/
+TESTDIR=$CURDIR/../..
+TESTAPP_DIR="$TESTDIR/utils/testapp/"
+ELF_TEST_BIN_DIR="$TESTAPP_DIR/userspace-probe-elf-binary/"
+ELF_TEST_BIN_NAME="userspace-probe-elf-binary"
+ELF_TEST_BIN="$ELF_TEST_BIN_DIR/$ELF_TEST_BIN_NAME"
+ELF_CXX_TEST_BIN_DIR="$TESTAPP_DIR/userspace-probe-elf-cxx-binary/"
+ELF_CXX_TEST_BIN_NAME="userspace-probe-elf-cxx-binary"
+ELF_CXX_TEST_BIN="$ELF_CXX_TEST_BIN_DIR/$ELF_CXX_TEST_BIN_NAME"
+SDT_TEST_BIN_DIR="$TESTAPP_DIR/userspace-probe-sdt-binary/.libs/"
+SDT_TEST_BIN_NAME="userspace-probe-sdt-binary"
+SDT_TEST_BIN="$SDT_TEST_BIN_DIR/$SDT_TEST_BIN_NAME"
+ELF_SYMBOL="test_function"
+PROBE_EVENT_NAME=userspace_probe_test_event
+NUM_TESTS=81
+OUTPUT_DEST=/dev/null
+ERROR_OUTPUT_DEST=/dev/null
+
+source "$TESTDIR/utils/utils.sh"
+
+function validate_list()
+{
+       local session_name=$1
+       local event_name=$2
+
+       out=$("$TESTDIR/../src/bin/lttng/$LTTNG_BIN" list "$session_name" | grep "$event_name")
+       if [ -z "$out" ]; then
+               fail "Validate userspace probe listing"
+               diag "$event_name not found when listing $session_name"
+       else
+               pass "Validate userspace probe listing. Found $event_name."
+       fi
+}
+
+function test_userspace_probe_enable_file_noexist ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userspace_probe_enable_file_noexist"
+       ENABLE_EXPR="elf:/etc/file-not-exist:$ELF_SYMBOL"
+
+       diag "Userspace probe enable on non-existant file"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_fail $SESSION_NAME $ENABLE_EXPR $PROBE_EVENT_NAME
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_enable_file_not_elf ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userspace_probe_enable_file_not_elf"
+       ENABLE_EXPR="elf:/etc/passwd:$ELF_SYMBOL"
+
+       diag "Userspace probe enable on a non ELF file"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_fail $SESSION_NAME $ENABLE_EXPR $PROBE_EVENT_NAME
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_enable_elf_missing_symbol_name ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userspace_probe_enable_elf_missing_symbol"
+       ENABLE_EXPR="elf:$ELF_TEST_BIN:"
+
+       diag "Userspace probe enable with unspecified ELF symbol"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_fail $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_enable_elf_nonexistant_symbol ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userspace_probe_enable_elf_nonexistant_symbol"
+       ELF_SYMBOL_NO_EXIST="function_doesnt_exist"
+       ENABLE_EXPR="elf:$ELF_TEST_BIN:$ELF_SYMBOL_NO_EXIST"
+
+       diag "Userspace probe enable with nonexistant ELF symbol"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_fail $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_enable_elf_symbol_not_function ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userspace_probe_enable_elf_symbol_not_function"
+       ELF_SYMBOL_NO_FUNC="not_a_function"
+       ENABLE_EXPR="elf:$ELF_TEST_BIN:$ELF_SYMBOL_NO_FUNC"
+
+       diag "Userspace probe enable with non-function ELF symbol"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_fail $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_enable_implicit_probe_type ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userspace_probe_enable_implicit_probe_type"
+       ENABLE_EXPR="$ELF_TEST_BIN:$ELF_SYMBOL"
+
+       diag "Userspace probe enabled successfully with implicit probe type"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+
+       validate_list  $SESSION_NAME $ELF_SYMBOL
+       validate_list  $SESSION_NAME $ELF_TEST_BIN_NAME
+       validate_list  $SESSION_NAME "ELF"
+       validate_list  $SESSION_NAME "Function"
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_enable_elf_symbol_exists ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userspace_probe_enable_elf_symbol_exists"
+       ENABLE_EXPR="elf:$ELF_TEST_BIN:$ELF_SYMBOL"
+
+       diag "Userspace probe enabled successfully"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+
+       validate_list  $SESSION_NAME $ELF_SYMBOL
+       validate_list  $SESSION_NAME $ELF_TEST_BIN_NAME
+       validate_list  $SESSION_NAME "ELF"
+       validate_list  $SESSION_NAME "Function"
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_enable_in_path ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userspace_probe_enable_in_path"
+       ENABLE_EXPR="elf:$ELF_TEST_BIN_NAME:$ELF_SYMBOL"
+
+       diag "Userspace probe on binary in PATH enabled successfully"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       # Save old PATH and add the test directory to the PATH.
+       OLDPATH="$PATH"
+       export PATH="$PATH:$(realpath $ELF_TEST_BIN_DIR)"
+
+       lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+
+       validate_list  $SESSION_NAME $ELF_SYMBOL
+       validate_list  $SESSION_NAME $ELF_TEST_BIN_NAME
+       validate_list  $SESSION_NAME "ELF"
+       validate_list  $SESSION_NAME "Function"
+
+       # Reset the previously saved PATH.
+       export PATH="$OLDPATH"
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_enable_full_path ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userspace_probe_enable_full_path"
+       ENABLE_EXPR="elf:$(realpath $ELF_TEST_BIN):$ELF_SYMBOL"
+       diag "Userspace probe with full path enabled successfully"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+
+       validate_list  $SESSION_NAME $ELF_SYMBOL
+       validate_list  $SESSION_NAME $ELF_TEST_BIN_NAME
+       validate_list  $SESSION_NAME "ELF"
+       validate_list  $SESSION_NAME "Function"
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_enable_colon_in_path ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userspace_probe_enable_colon_in_path"
+       COLON_FILE_PATH=$(mktemp -d)
+       ELF_BIN_SYMLINK="$COLON_FILE_PATH/colon_:_in_name"
+       ELF_BIN_WITH_COLON_IN_NAME_ESCAPED="$COLON_FILE_PATH/colon_\:_in_name"
+       ENABLE_EXPR="elf:"$ELF_BIN_WITH_COLON_IN_NAME_ESCAPED":$ELF_SYMBOL"
+
+       ln -s $(realpath $ELF_TEST_BIN) $ELF_BIN_SYMLINK
+
+       diag "Userspace probe with binary with colon in name enabled successfully"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+
+       validate_list  $SESSION_NAME $ELF_SYMBOL
+       validate_list  $SESSION_NAME $ELF_TEST_BIN_NAME
+       validate_list  $SESSION_NAME "ELF"
+       validate_list  $SESSION_NAME "Function"
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+       rm -rf "$COLON_FILE_PATH"
+}
+
+function test_userspace_probe_elf ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userprobe_elf"
+       ENABLE_EXPR="elf:$ELF_TEST_BIN:$ELF_SYMBOL"
+
+       diag "Userspace probe on Elf symbol enabled and traced"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+
+       start_lttng_tracing_ok $SESSION_NAME
+       eval "$ELF_TEST_BIN"  > /dev/null
+       stop_lttng_tracing_ok $SESSION_NAME
+
+       validate_trace $PROBE_EVENT_NAME "$TRACE_PATH"
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_elf_cxx_function ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userprobe_elf_cxx_function"
+       # Probing C++ mangled symbols should work the same way as regular Elf
+       # symbols
+       ELF_SYMBOL_CXX="_Z17test_cxx_functionv"
+       ENABLE_EXPR="elf:$ELF_CXX_TEST_BIN:$ELF_SYMBOL_CXX"
+
+       diag "Userspace probe on C++ mangled function enabled and traced"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+
+       start_lttng_tracing_ok $SESSION_NAME
+       eval "$ELF_CXX_TEST_BIN"  > /dev/null
+       stop_lttng_tracing_ok $SESSION_NAME
+
+       validate_trace $PROBE_EVENT_NAME "$TRACE_PATH"
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_elf_cxx_method ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userprobe_elf_cxx_method"
+       # Probing C++ mangled symbols should work the same way as regular Elf
+       # symbols
+       ELF_SYMBOL_CXX="_ZN10test_class11test_methodEv"
+       ENABLE_EXPR="elf:$ELF_CXX_TEST_BIN:$ELF_SYMBOL_CXX"
+
+       diag "Userspace probe on C++ mangled method enabled and traced"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+
+       start_lttng_tracing_ok $SESSION_NAME
+       eval "$ELF_CXX_TEST_BIN"  > /dev/null
+       stop_lttng_tracing_ok $SESSION_NAME
+
+       validate_trace $PROBE_EVENT_NAME "$TRACE_PATH"
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_elf_disable ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userprobe_elf_disable"
+       ENABLE_EXPR="elf:$ELF_TEST_BIN:$ELF_SYMBOL"
+
+       diag "Userspace probe on Elf symbol disabled and traced"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       # Activate and disable event
+       lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+       disable_kernel_lttng_userspace_probe_event_ok $SESSION_NAME $PROBE_EVENT_NAME
+
+       start_lttng_tracing_ok $SESSION_NAME
+       eval "$ELF_TEST_BIN"  > /dev/null
+       stop_lttng_tracing_ok $SESSION_NAME
+
+       # Verify that the trace contains zero event.
+       validate_trace_empty "$TRACE_PATH"
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_elf_list ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userprobe_elf_list"
+       ENABLE_EXPR="elf:$ELF_TEST_BIN:$ELF_SYMBOL"
+
+       diag "Userspace probe ELF enabled and listed"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+
+       validate_list  $SESSION_NAME $PROBE_EVENT_NAME
+       validate_list  $SESSION_NAME $ELF_SYMBOL
+       validate_list  $SESSION_NAME $ELF_TEST_BIN_NAME
+       validate_list  $SESSION_NAME "ELF"
+       validate_list  $SESSION_NAME "Function"
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_save_load_elf()
+{
+       # Test that the load and save works for userspace probes AND that when
+       # a userspace probe is placed on a symlink by the user the save command
+       # saves the path to the link and not to the actual file. This is to
+       # support instrumentation of shared objects that are often accessed
+       # through symlinks and updated.
+       TRACE_PATH=$(mktemp -d)
+       TMP_LINK_DIR=$(mktemp -d)
+       TMP_SAVE_DIR=$(mktemp -d)
+
+       SESSION_NAME="test_userprobe_save_load_elf"
+
+       ELF_BIN_SYMLINK="$TMP_LINK_DIR"/bin_elf_symlink
+
+       ENABLE_EXPR_ELF="elf:$ELF_BIN_SYMLINK:$ELF_SYMBOL"
+       PROBE_EVENT_NAME_ELF="$PROBE_EVENT_NAME"_elf
+
+       # Create symlinks to the target binaries.
+       ln -s $(realpath $ELF_TEST_BIN) $ELF_BIN_SYMLINK
+
+       diag "Userspace probes Elf are saved and loaded"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       # Enable userspace prove events.
+       lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR_ELF" "$PROBE_EVENT_NAME_ELF"
+
+       # Confirm that the events were enabled.
+       validate_list $SESSION_NAME $ELF_TEST_BIN_NAME
+
+       # Save the session to a file.
+       lttng_save $SESSION_NAME "--output-path=$TMP_SAVE_DIR"
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       # Confirm that the userspace probe are save to the xml file.
+       local count=$(cat $TMP_SAVE_DIR/* | grep --count -E "$ELF_BIN_SYMLINK")
+       if [[ $count -eq "1" ]]; then
+               pass "Symlink found in saved session"
+       else
+               fail "Symlink to binary not found in saved session"
+       fi
+
+       # Load the saved session.
+       lttng_load_ok "--input-path=$TMP_SAVE_DIR"
+
+       # Confirm that the userspace probes event are enabled in the newly
+       # loaded session.
+       validate_list $SESSION_NAME $ELF_TEST_BIN_NAME
+
+       # Cleanup temp files and folders.
+       rm -rf "$TRACE_PATH"
+       rm -rf "$TMP_LINK_DIR"
+       rm -rf "$TMP_SAVE_DIR"
+}
+function test_userspace_probe_save_load_sdt()
+{
+       # Test that the load and save works for userspace probes AND that when
+       # a userspace probe is placed on a symlink by the user the save command
+       # saves the path to the link and not to the actual file. This is to
+       # support instrumentation of shared objects that are often accessed
+       # through symlinks and updated.
+       TRACE_PATH=$(mktemp -d)
+       TMP_LINK_DIR=$(mktemp -d)
+       TMP_SAVE_DIR=$(mktemp -d)
+
+       SESSION_NAME="test_userprobe_save_load_sdt"
+       PROVIDER="foobar"
+       PROBE="tp1"
+
+       SDT_BIN_SYMLINK="$TMP_LINK_DIR"/bin_sdt_symlink
+
+       ENABLE_EXPR_SDT="sdt:$SDT_BIN_SYMLINK:$PROVIDER:$PROBE"
+       PROBE_EVENT_NAME_SDT="$PROBE_EVENT_NAME"_sdt
+
+       # Create symlinks to the target binaries.
+       ln -s $(realpath $SDT_TEST_BIN) $SDT_BIN_SYMLINK
+
+       diag "Userspace probes SDT are saved and loaded"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       # Enable userspace prove events.
+       lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR_SDT" "$PROBE_EVENT_NAME_SDT"
+
+       # Confirm that the events were enabled.
+       validate_list $SESSION_NAME $SDT_TEST_BIN_NAME
+
+       # Save the session to a file.
+       lttng_save $SESSION_NAME "--output-path=$TMP_SAVE_DIR"
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       # Confirm that the userspace probe are save to the xml file.
+       local count=$(cat $TMP_SAVE_DIR/* | grep --count -E "$SDT_BIN_SYMLINK")
+       if [[ $count -eq "1" ]]; then
+               pass "Symlink found in saved session"
+       else
+               fail "Symlink to binary not found in saved session"
+       fi
+
+       # Load the saved session.
+       lttng_load_ok "--input-path=$TMP_SAVE_DIR"
+
+       # Confirm that the userspace probes event are enabled in the newly
+       # loaded session.
+       validate_list $SESSION_NAME $SDT_TEST_BIN_NAME
+
+       # Cleanup temp files and folders.
+       rm -rf "$TRACE_PATH"
+       rm -rf "$TMP_LINK_DIR"
+       rm -rf "$TMP_SAVE_DIR"
+}
+
+function test_userspace_probe_sdt ()
+{
+       TRACE_PATH=$(mktemp -d)
+       PROVIDER="foobar"
+       PROBE="tp1"
+       ENABLE_EXPR="sdt:$SDT_TEST_BIN:$PROVIDER:$PROBE"
+
+       diag "Userspace probe on SDT tracepoint enabled and traced"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+
+       start_lttng_tracing_ok $SESSION_NAME
+       eval "$SDT_TEST_BIN"  > /dev/null
+       stop_lttng_tracing_ok $SESSION_NAME
+
+       validate_trace $PROBE_EVENT_NAME "$TRACE_PATH"
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_sdt_list ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userprobe_sdt_list"
+       PROVIDER="foobar"
+       PROBE="tp1"
+       ENABLE_EXPR="sdt:$SDT_TEST_BIN:$PROVIDER:$PROBE"
+
+       diag "Userspace probe SDT enabled and listed"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+
+       validate_list  $SESSION_NAME $PROBE_EVENT_NAME
+       validate_list  $SESSION_NAME $PROVIDER
+       validate_list  $SESSION_NAME $PROBE
+       validate_list  $SESSION_NAME $SDT_TEST_BIN_NAME
+       validate_list  $SESSION_NAME "SDT"
+       validate_list  $SESSION_NAME "Tracepoint"
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_enable_sdt_nonexistant_provider ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userprobe_sdt_nonexistand_provider"
+       PROVIDER="not_provider"
+       PROBE="tp1"
+       ENABLE_EXPR="sdt:$SDT_TEST_BIN:$PROVIDER:$PROBE"
+
+       diag "Userspace probe SDT on tracepoint non existant provider"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_fail $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_enable_sdt_nonexistant_probe ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userprobe_sdt_nonexistant_probe"
+       PROVIDER="foobar"
+       PROBE="not_a_tracepoint"
+       ENABLE_EXPR="sdt:$SDT_TEST_BIN:$PROVIDER:$PROBE"
+
+       diag "Userspace probe SDT on non existant probe"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_fail $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_enable_sdt_with_sema ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userprobe_sdt_with_sema"
+       PROVIDER="foobar"
+       PROBE="tp_with_semaphore"
+       ENABLE_EXPR="sdt:$SDT_TEST_BIN:$PROVIDER:$PROBE"
+
+       diag "Userspace probe SDT on non existant probe"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_fail $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_sdt_one_probe ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userprobe_sdt_one_probe"
+       PROVIDER="foobar"
+       PROBE="tp1"
+       ENABLE_EXPR="sdt:$SDT_TEST_BIN:$PROVIDER:$PROBE"
+
+       diag "Userspace probe SDT on tracepoint with one callsite"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+
+       start_lttng_tracing_ok $SESSION_NAME
+       eval "$SDT_TEST_BIN"  > /dev/null
+       stop_lttng_tracing_ok $SESSION_NAME
+
+       validate_trace $PROBE_EVENT_NAME "$TRACE_PATH"
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_sdt_two_probes ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userprobe_sdt_two_probes"
+       PROVIDER="foobar"
+       PROBE="tp2"
+       ENABLE_EXPR="sdt:$SDT_TEST_BIN:$PROVIDER:$PROBE"
+
+       diag "Userspace probe SDT on tracepoint with two callsites"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+
+       start_lttng_tracing_ok $SESSION_NAME
+       eval "$SDT_TEST_BIN"  > /dev/null
+       stop_lttng_tracing_ok $SESSION_NAME
+
+       validate_trace $PROBE_EVENT_NAME "$TRACE_PATH"
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_sdt_in_shared_object ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userprobe_sdt_shared_object"
+       PROVIDER="foobar"
+       PROBE="tp_in_shared_object"
+       ENABLE_EXPR="sdt:$SDT_TEST_BIN_DIR/libfoo.so:$PROVIDER:$PROBE"
+
+       diag "Userspace probe SDT on tracepoint in shared object"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+
+       start_lttng_tracing_ok $SESSION_NAME
+       eval "$SDT_TEST_BIN"  > /dev/null
+       stop_lttng_tracing_ok $SESSION_NAME
+
+       validate_trace $PROBE_EVENT_NAME "$TRACE_PATH"
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_sdt_in_shared_object_dlopen ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userprobe_sdt_shared_object_dlopen"
+       PROVIDER="foobar"
+       PROBE="tp_in_dlopen"
+       ENABLE_EXPR="sdt:$SDT_TEST_BIN_DIR/libbar.so:$PROVIDER:$PROBE"
+
+       diag "Userspace probe SDT on tracepoint in dlopen()ed shared object"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+
+       start_lttng_tracing_ok $SESSION_NAME
+       eval "$SDT_TEST_BIN"  > /dev/null
+       stop_lttng_tracing_ok $SESSION_NAME
+
+       validate_trace $PROBE_EVENT_NAME "$TRACE_PATH"
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_sdt_in_shared_object_ldpreload ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userprobe_sdt_shared_object_ldpreload"
+       PROVIDER="foobar"
+       PROBE="tp_in_ldpreload"
+       ENABLE_EXPR="sdt:$SDT_TEST_BIN_DIR/libzzz.so:$PROVIDER:$PROBE"
+
+       diag "Userspace probe SDT on tracepoint in an LD_PRELOADed shared object"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+
+       start_lttng_tracing_ok $SESSION_NAME
+       LD_PRELOAD="$SDT_TEST_BIN_DIR/libzzz.so" eval "$SDT_TEST_BIN"  > /dev/null
+       stop_lttng_tracing_ok $SESSION_NAME
+
+       validate_trace $PROBE_EVENT_NAME "$TRACE_PATH"
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+function test_userspace_probe_sdt_with_arg ()
+{
+       TRACE_PATH=$(mktemp -d)
+       SESSION_NAME="test_userprobe_sdt_arg"
+       PROVIDER="foobar"
+       PROBE="tp_with_arg"
+       ENABLE_EXPR="sdt:$SDT_TEST_BIN:$PROVIDER:$PROBE"
+
+       diag "Userspace probe SDT on tracepoint with argument"
+
+       create_lttng_session_ok $SESSION_NAME "$TRACE_PATH"
+
+       lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME
+
+       start_lttng_tracing_ok $SESSION_NAME
+       eval "$SDT_TEST_BIN"  > /dev/null
+       stop_lttng_tracing_ok $SESSION_NAME
+
+       validate_trace $PROBE_EVENT_NAME "$TRACE_PATH"
+
+       destroy_lttng_session_ok $SESSION_NAME
+
+       rm -rf "$TRACE_PATH"
+}
+
+ls "$SDT_TEST_BIN" >/dev/null 2>&1
+if test $? == 0; then
+       NUM_TESTS=$((NUM_TESTS+68))
+       RUN_SDT_TESTS=1
+else
+       RUN_SDT_TESTS=0
+fi
+
+ls "$ELF_CXX_TEST_BIN" >/dev/null 2>&1
+if test $? == 0; then
+       NUM_TESTS=$((NUM_TESTS+12))
+       RUN_ELF_CXX_TESTS=1
+else
+       RUN_ELF_CXX_TESTS=0
+fi
+plan_tests $NUM_TESTS
+print_test_banner "$TEST_DESC"
+
+if [ "$(id -u)" == "0" ]; then
+       isroot=1
+else
+       isroot=0
+fi
+
+skip $isroot "Root access is needed. Skipping all tests." $NUM_TESTS ||
+{
+       start_lttng_sessiond
+
+       # Unsuccessful event enabling
+       test_userspace_probe_enable_file_noexist
+       test_userspace_probe_enable_file_not_elf
+
+       test_userspace_probe_enable_elf_missing_symbol_name
+       test_userspace_probe_enable_elf_nonexistant_symbol
+       test_userspace_probe_enable_elf_symbol_not_function
+
+       # Successful userspace probe elf enabling
+       test_userspace_probe_enable_implicit_probe_type
+       test_userspace_probe_enable_in_path
+       test_userspace_probe_enable_full_path
+       test_userspace_probe_enable_elf_symbol_exists
+       test_userspace_probe_enable_colon_in_path
+
+       # Successful tracing userspace probe elf
+       test_userspace_probe_elf
+
+       # Disable userspace-probe elf
+       test_userspace_probe_elf_disable
+
+       # Successful listing of userspace probe elf
+       test_userspace_probe_elf_list
+
+       # Successful save and load of userspace probe elf
+       test_userspace_probe_save_load_elf
+
+       if test $RUN_ELF_CXX_TESTS == 1; then
+               # Successful tracing of userspace probe elf on C++ symbol
+               test_userspace_probe_elf_cxx_function
+               test_userspace_probe_elf_cxx_method
+       fi
+
+       if test $RUN_SDT_TESTS == 1; then
+               # Unsuccessful event enabling
+               test_userspace_probe_enable_sdt_nonexistant_provider
+               test_userspace_probe_enable_sdt_nonexistant_probe
+               test_userspace_probe_enable_sdt_with_sema
+
+               # Successful userspace probe sdt enabling
+               test_userspace_probe_sdt_one_probe
+               test_userspace_probe_sdt_two_probes
+               test_userspace_probe_sdt_with_arg
+               test_userspace_probe_sdt_in_shared_object
+               test_userspace_probe_sdt_in_shared_object_dlopen
+               test_userspace_probe_sdt_in_shared_object_ldpreload
+
+               # Successful tracing of userspace probe sdt
+               test_userspace_probe_sdt
+
+               # Successful listing of userspace probe sdt
+               test_userspace_probe_sdt_list
+
+               # Successful save and load of userspace probe sdt
+               test_userspace_probe_save_load_sdt
+       fi
+
+       stop_lttng_sessiond
+}
This page took 0.030275 seconds and 4 git commands to generate.