Test: Trigger conditions is evaluated on subscription
[lttng-tools.git] / tests / regression / tools / notification / test_notification_multi_app
index a8f0de9f90bd8aefb978dacf6ada953ef5a62c20..d7f6319fd7a06919ac3099e433f5062bf8ff0c72 100755 (executable)
@@ -20,11 +20,6 @@ TEST_DESC="Notification"
 CURDIR=$(dirname $0)/
 TESTDIR=$CURDIR/../../../
 
-# This is needed since the testpoint creates a pipe with the consumerd domain
-# suffixed
-TESTPOINT_BASE_PATH=$(readlink -f "$CURDIR/lttng.t_p_n")
-TESTPOINT_PIPE_PATH=$(mktemp -u "${TESTPOINT_BASE_PATH}.XXXXXX")
-TESTPOIT_ARGS="CONSUMER_PAUSE_PIPE_PATH=${TESTPOINT_PIPE_PATH} LTTNG_TESTPOINT_ENABLE=1"
 TESTPOINT=$(readlink -f ${CURDIR}/.libs/libpause_consumer.so)
 
 TESTAPP_PATH="$TESTDIR/utils/testapp"
@@ -38,14 +33,14 @@ SESSION_NAME="my_session"
 UST_CHANNEL_NAME="my_ust_channel"
 EVENT_NAME="tp:tptest"
 
-NR_NOTIFICATION_EXPECTED=5
-NR_CLIENT_APP=50
 
 TRACE_PATH=$(mktemp -d)
 
 DIR=$(readlink -f $TESTDIR)
 
-NUM_TESTS=46
+PAGE_SIZE=$(getconf PAGE_SIZE)
+
+NUM_TESTS=62
 
 source $TESTDIR/utils/utils.sh
 
@@ -58,6 +53,7 @@ plan_tests $NUM_TESTS
 print_test_banner "$TEST_DESC"
 
 app_pids=()
+
 function start_client {
        local pid=-1
        local output_file=$1
@@ -112,7 +108,7 @@ function print_errors ()
        for file in $CURDIR/${file_pattern}*; do
                # Check for "error" message
                error_message=$(grep "error:" ${file})
-               if [[ "${error_message}" -ne "" ]]; then
+               if [[ "${error_message}x" != "x" ]]; then
                        diag "Errors for application ${file}:"
                        diag "${error_message}"
                fi
@@ -147,12 +143,18 @@ function test_multi_app ()
        local low_output_file_pattern="low_app_output_file_"
        local high_output_file_pattern="high_app_output_file_"
 
+       local testpoint_base_path=$(readlink -f "$CURDIR/lttng.t_p_n_multi_app")
+       local testpoint_pipe_path=$(mktemp -u "${testpoint_base_path}.XXXXXX")
+
+       local nr_notification_expected=5
+       local nr_client_app=50
+
        # Cleanup
        rm ${CURDIR}/${low_output_file_pattern}* 2> /dev/null
        rm ${CURDIR}/${high_output_file_pattern}* 2> /dev/null
 
        # Setup
-       LTTNG_SESSIOND_ENV_VARS="LTTNG_TESTPOINT_ENABLE=1 CONSUMER_PAUSE_PIPE_PATH=${TESTPOINT_PIPE_PATH} LD_PRELOAD=${TESTPOINT}"
+       LTTNG_SESSIOND_ENV_VARS="LTTNG_TESTPOINT_ENABLE=1 CONSUMER_PAUSE_PIPE_PATH=${testpoint_pipe_path} LD_PRELOAD=${TESTPOINT}"
        start_lttng_sessiond
 
        # Start app in infinite loop
@@ -168,27 +170,27 @@ function test_multi_app ()
        rm ${file_sync_after_first_event}
 
        create_lttng_session_ok $SESSION_NAME $TRACE_PATH
-       enable_ust_lttng_channel_ok $SESSION_NAME $UST_CHANNEL_NAME --subbuf-size=4096
+       enable_ust_lttng_channel_ok $SESSION_NAME $UST_CHANNEL_NAME --subbuf-size=$PAGE_SIZE
        enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME $UST_CHANNEL_NAME
 
        # Fetch consumerd testpoint pipe information
        # This is needed since the testpoint create a pipe with the consumer type suffixed
-       for f in "$TESTPOINT_BASE_PATH"*; do
+       for f in "$testpoint_base_path"*; do
                consumerd_pipe+=("$f")
        done
 
-       for (( i = 0; i < $NR_CLIENT_APP; i++ )); do
+       for (( i = 0; i < $nr_client_app; i++ )); do
                low_app_output_file=$CURDIR/${low_output_file_pattern}${i}
                high_app_output_file=$CURDIR/${high_output_file_pattern}${i}
-               start_client $low_app_output_file $SESSION_NAME $UST_CHANNEL_NAME LTTNG_DOMAIN_UST LOW RATIO 0.0 $NR_NOTIFICATION_EXPECTED
-               start_client $high_app_output_file $SESSION_NAME $UST_CHANNEL_NAME LTTNG_DOMAIN_UST HIGH RATIO 0.420 $NR_NOTIFICATION_EXPECTED
+               start_client $low_app_output_file $SESSION_NAME $UST_CHANNEL_NAME LTTNG_DOMAIN_UST LOW RATIO 0.0 $nr_notification_expected
+               start_client $high_app_output_file $SESSION_NAME $UST_CHANNEL_NAME LTTNG_DOMAIN_UST HIGH RATIO 0.420 $nr_notification_expected
        done
 
        wait_for_message "${low_output_file_pattern}" "sync: ready"
        wait_for_message "${high_output_file_pattern}" "sync: ready"
 
        # Test notification reception
-       for (( i = 0; i < $NR_NOTIFICATION_EXPECTED; i++ )); do
+       for (( i = 0; i < $nr_notification_expected; i++ )); do
 
                # Stop consumerd consumption to force high notification
                start_lttng_tracing_ok $SESSION_NAME
@@ -241,9 +243,91 @@ function test_multi_app ()
        stop_lttng_sessiond
 }
 
+function test_on_register_evaluation ()
+{
+       local app_pids=()
+       local high_output_file_pattern="high_app_output_file_on_register_evaluation"
+
+       local testpoint_base_path=$(readlink -f "$CURDIR/lttng.t_p_n_register_evaluation")
+       local testpoint_pipe_path=$(mktemp -u "${testpoint_base_path}.XXXXXX")
+
+       # Cleanup
+       rm ${CURDIR}/${high_output_file_pattern}* 2> /dev/null
+
+       # Setup
+       LTTNG_SESSIOND_ENV_VARS="LTTNG_TESTPOINT_ENABLE=1 CONSUMER_PAUSE_PIPE_PATH=${testpoint_pipe_path} LD_PRELOAD=${TESTPOINT}"
+       start_lttng_sessiond
+
+       # Start app in infinite loop
+       $TESTAPP_BIN $NR_ITER $NR_USEC_WAIT $file_sync_after_first_event &
+       app_pid=$!
+       # Pin to CPU zero to force specific sub buffer usage
+       taskset -p -c 0 $app_pid > /dev/null 2>&1
+
+       # Wait for sync with app
+       while [ ! -f "${file_sync_after_first_event}" ]; do
+               sleep 0.5
+       done
+       rm ${file_sync_after_first_event}
+
+       create_lttng_session_ok $SESSION_NAME $TRACE_PATH
+       enable_ust_lttng_channel_ok $SESSION_NAME $UST_CHANNEL_NAME --subbuf-size=$PAGE_SIZE
+       enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME $UST_CHANNEL_NAME
+
+       # Fetch consumerd testpoint pipe information
+       # This is needed since the testpoint create a pipe with the consumer type suffixed
+       for f in "$testpoint_base_path"*; do
+               consumerd_pipe+=("$f")
+       done
+
+       high_app_output_file=${high_output_file_pattern}.first_receiver
+       high_app_output_path=$CURDIR/${high_app_output_file}
+       start_client $high_app_output_path $SESSION_NAME $UST_CHANNEL_NAME LTTNG_DOMAIN_UST HIGH RATIO 0.420 1
+
+       wait_for_message "${high_app_output_file}" "sync: ready"
+
+       # Stop consumerd consumption to force high notification
+       start_lttng_tracing_ok $SESSION_NAME
+
+       for pipe in "${consumerd_pipe[@]}"; do
+               stop_consumerd "${pipe}"
+       done
+
+       wait_for_message "${high_app_output_file}" "notification: high 0"
+
+       # Start a second receiver, the receiver should receive a high
+       # notification on subscription
+       high_app_output_file=${high_output_file_pattern}.second_receiver
+       high_app_output_path=$CURDIR/${high_app_output_file}
+       start_client $high_app_output_path $SESSION_NAME $UST_CHANNEL_NAME LTTNG_DOMAIN_UST HIGH RATIO 0.420 1
+       wait_for_message "${high_app_output_file}" "sync: ready"
+       wait_for_message "${high_app_output_file}" "notification: high 0"
+
+       # Resume consumerd
+       for pipe in "${consumerd_pipe[@]}"; do
+               resume_consumerd "${pipe}"
+       done
+
+       wait_for_message "${high_output_file_pattern}" "exit: 0"
+       ret=$?
+       ok $ret "Application for high notification terminated normally"
+       if [[ $ret -eq "0" ]]; then
+               rm ${CURDIR}/${high_output_file_pattern}* 2> /dev/null
+       else
+               # Keep the file
+               print_errors "${high_output_file_pattern}"
+       fi
+
+       stop_lttng_sessiond
+
+       kill -9 $app_pid
+       wait $app_pid 2> /dev/null
+}
+
 
 TESTS=(
        test_multi_app
+       test_on_register_evaluation
 )
 
 for fct_test in ${TESTS[@]};
This page took 0.026698 seconds and 5 git commands to generate.