+#!/bin/bash
+#
+# Copyright (C) - 2015 Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
+# Copyright (C) - 2016 Mathieu Desnoyers <mathieu.desnoyers@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="UST - Blocking mode"
+
+CURDIR=$(dirname $0)/
+TESTDIR=$CURDIR/../../..
+SESSION_NAME="blocking"
+
+TESTAPP_PATH="$TESTDIR/utils/testapp"
+TESTAPP_NAME="gen-ust-events"
+TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME"
+EVENT_NAME="tp:tptest"
+
+NUM_TESTS=45
+
+source $TESTDIR/utils/utils.sh
+
+# MUST set TESTDIR before calling those functions
+# Run app on CPU 0 to ensure we only write in a single ring buffer.
+function run_app()
+{
+ taskset 0x00000001 $TESTAPP_BIN $NUM_EVENT
+ ok $? "Application done"
+}
+
+function test_ust_implicit_no_blocking()
+{
+ NUM_EVENT=500000
+ diag "UST implicit non-blocking mode (default): will hang if fails"
+
+ # Test without the plugin
+ start_lttng_sessiond
+ create_lttng_session_no_output $SESSION_NAME
+ enable_ust_lttng_event_ok $SESSION_NAME "$EVENT_NAME"
+ start_lttng_tracing_ok $SESSION_NAME
+ run_app
+ stop_lttng_tracing_ok $SESSION_NAME
+ destroy_lttng_session_ok $SESSION_NAME
+ stop_lttng_sessiond
+
+ ok 0 "Does not hang"
+}
+
+function test_ust_explicit_no_blocking()
+{
+ NUM_EVENT=500000
+ diag "UST explicit non-blocking mode: will hang if fails"
+
+ # Test without the plugin
+ start_lttng_sessiond
+ create_lttng_session_no_output $SESSION_NAME
+ enable_ust_lttng_event_ok $SESSION_NAME "$EVENT_NAME"
+ start_lttng_tracing_ok $SESSION_NAME
+ LTTNG_UST_BLOCKING_RETRY_TIMEOUT=0 run_app
+ stop_lttng_tracing_ok $SESSION_NAME
+ destroy_lttng_session_ok $SESSION_NAME
+ stop_lttng_sessiond
+
+ ok 0 "Does not hang"
+}
+
+function test_ust_timeout_no_blocking()
+{
+ NUM_EVENT=12500
+ diag "UST 1ms timeout retry mode: will hang if fails"
+
+ start_lttng_sessiond
+ create_lttng_session_no_output $SESSION_NAME
+ enable_ust_lttng_event_ok $SESSION_NAME "$EVENT_NAME"
+ start_lttng_tracing_ok $SESSION_NAME
+ # retry timeout 1ms
+ LTTNG_UST_BLOCKING_RETRY_TIMEOUT=1 run_app
+ stop_lttng_tracing_ok $SESSION_NAME
+ destroy_lttng_session_ok $SESSION_NAME
+ stop_lttng_sessiond
+
+ ok 0 "Does not hang"
+}
+
+function test_ust_snapshot_no_blocking()
+{
+ NUM_EVENT=500000
+ diag "UST blocking mode: don't block in snapshot mode"
+
+ # Test without the plugin
+ start_lttng_sessiond
+ create_lttng_session_ok $SESSION_NAME $TRACE_PATH --snapshot
+ enable_ust_lttng_event_ok $SESSION_NAME "$EVENT_NAME"
+ start_lttng_tracing_ok $SESSION_NAME
+ LTTNG_UST_BLOCKING_RETRY_TIMEOUT=-1 run_app
+ stop_lttng_tracing_ok $SESSION_NAME
+ destroy_lttng_session_ok $SESSION_NAME
+ stop_lttng_sessiond
+
+ ok 0 "Does not hang"
+}
+
+function test_ust_blocking_no_discard()
+{
+ NUM_EVENT=500000
+ diag "UST blocking mode: no event discarded"
+
+ # Test without the plugin
+ start_lttng_sessiond
+ create_lttng_session_ok $SESSION_NAME $TRACE_PATH
+ enable_ust_lttng_event_ok $SESSION_NAME "$EVENT_NAME"
+ start_lttng_tracing_ok $SESSION_NAME
+ # infinite retry timeout
+ LTTNG_UST_BLOCKING_RETRY_TIMEOUT=-1 run_app
+ stop_lttng_tracing_ok $SESSION_NAME
+ destroy_lttng_session_ok $SESSION_NAME
+ stop_lttng_sessiond
+
+ nr_events=$(babeltrace $TRACE_PATH 2>/dev/null | wc -l)
+
+ test $nr_events -eq $NUM_EVENT
+ ok $? "No event lost with UST blocking mode: found $nr_events expect $NUM_EVENT"
+}
+
+plan_tests $NUM_TESTS
+
+print_test_banner "$TEST_DESC"
+
+TESTS=(
+ "test_ust_implicit_no_blocking"
+ "test_ust_explicit_no_blocking"
+ "test_ust_timeout_no_blocking"
+ "test_ust_snapshot_no_blocking"
+ "test_ust_blocking_no_discard"
+)
+
+TEST_COUNT=${#TESTS[@]}
+i=0
+
+while [ "$i" -lt "$TEST_COUNT" ]; do
+
+ TRACE_PATH=$(mktemp -d)
+
+ # Execute test
+ ${TESTS[$i]}
+
+ rm -rf $TRACE_PATH
+
+ let "i++"
+done