From 6b5133f20604535057af49574f4f506c8d94846c Mon Sep 17 00:00:00 2001 From: Christian Babeux Date: Thu, 13 Dec 2012 18:39:13 -0500 Subject: [PATCH] Tests: Add health check testpoint fail test This test trigger a failure in a specified thread by using the testpoint mechanism. The testpoints behavior is implemented in health_fail.c. The testpoint code simply return 1 (non-zero values are considered as errors for testpoints) to trigger the specific thread error handling mechanism. This test ensure that we can detect health failure for each thread error handling paths. Signed-off-by: Christian Babeux Signed-off-by: David Goulet --- tests/tools/health/Makefile.am | 6 +- tests/tools/health/health_fail.c | 69 ++++++++++++++++++++++ tests/tools/health/health_tp_fail | 98 +++++++++++++++++++++++++++++++ tests/tools/health/runall | 2 +- 4 files changed, 173 insertions(+), 2 deletions(-) create mode 100644 tests/tools/health/health_fail.c create mode 100755 tests/tools/health/health_tp_fail diff --git a/tests/tools/health/Makefile.am b/tests/tools/health/Makefile.am index f1a5d915d..6f80ead34 100644 --- a/tests/tools/health/Makefile.am +++ b/tests/tools/health/Makefile.am @@ -25,8 +25,12 @@ libhealthexit_la_LDFLAGS= $(FORCE_SHARED_LIB_OPTIONS) libhealthstall_la_SOURCES=health_stall.c libhealthstall_la_LDFLAGS= $(FORCE_SHARED_LIB_OPTIONS) +# Health thread fail ld_preloaded test lib +libhealthtpfail_la_SOURCES=health_fail.c +libhealthtpfail_la_LDFLAGS= $(FORCE_SHARED_LIB_OPTIONS) + noinst_PROGRAMS = health_check -noinst_LTLIBRARIES = libhealthexit.la libhealthstall.la +noinst_LTLIBRARIES = libhealthexit.la libhealthstall.la libhealthtpfail.la health_check_SOURCES = health_check.c $(UTILS) health_check_LDADD = $(top_builddir)/src/lib/lttng-ctl/liblttng-ctl.la \ diff --git a/tests/tools/health/health_fail.c b/tests/tools/health/health_fail.c new file mode 100644 index 000000000..622782548 --- /dev/null +++ b/tests/tools/health/health_fail.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2012 - Christian Babeux + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License, version 2 only, as + * published by the Free Software Foundation. + * + * This program 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 General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include +#include + +/* + * Check if the specified environment variable is set. + * Return 1 if set, otherwise 0. + */ +int check_env_var(const char *env) +{ + if (env) { + char *env_val = getenv(env); + if (env_val && (strncmp(env_val, "1", 1) == 0)) { + return 1; + } + } + + return 0; +} + +int __testpoint_thread_manage_clients(void) +{ + const char *var = "LTTNG_THREAD_MANAGE_CLIENTS_TP_FAIL"; + + if (check_env_var(var)) { + return 1; + } + + return 0; +} + +int __testpoint_thread_manage_apps(void) +{ + const char *var = "LTTNG_THREAD_MANAGE_APPS_TP_FAIL"; + + if (check_env_var(var)) { + return 1; + } + + return 0; +} + +int __testpoint_thread_manage_kernel(void) +{ + const char *var = "LTTNG_THREAD_MANAGE_KERNEL_TP_FAIL"; + + if (check_env_var(var)) { + return 1; + } + + return 0; +} diff --git a/tests/tools/health/health_tp_fail b/tests/tools/health/health_tp_fail new file mode 100755 index 000000000..5b68e62be --- /dev/null +++ b/tests/tools/health/health_tp_fail @@ -0,0 +1,98 @@ +#!/bin/bash +# +# Copyright (C) - 2012 Christian Babeux +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License, version 2 only, as +# published by the Free Software Foundation. +# +# This program 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 General Public License for +# more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +TEST_DESC="Health check - Testpoint failure" + +CURDIR=$(dirname $0)/ +TESTDIR=$CURDIR/../.. +LTTNG_BIN="lttng" +SESSION_NAME="health_tp_fail" +EVENT_NAME="bogus" +HEALTH_CHECK_BIN="health_check" +SESSIOND_PRELOAD=".libs/libhealthtpfail.so" + +source $TESTDIR/utils.sh + +print_test_banner "$TEST_DESC" + +if [ ! -f "$CURDIR/$SESSIOND_PRELOAD" ]; then + echo -e "libhealthtpfail.so not available for this test. Skipping." + exit 0 +fi + +function test_tp_fail +{ + test_tp_fail_name="$1" + test_tp_fail_code="$2" + + echo "" + echo -e "=== Testing health failure with ${test_tp_fail_name}" + + # Activate testpoints + export LTTNG_TESTPOINT_ENABLE=1 + + # Activate specific testpoint failure + export ${test_tp_fail_name}_TP_FAIL=1 + + # Spawn sessiond with preload healthexit lib + export LD_PRELOAD="$CURDIR/$SESSIOND_PRELOAD" + start_lttng_sessiond + + # Cleanup some env. var. + unset LD_PRELOAD + unset ${test_tp_fail_name}_TP_FAIL + + echo -n "Validating thread ${test_tp_fail_name} failure... " + + # Check health status, exit code should indicate failure + $CURDIR/$HEALTH_CHECK_BIN &> /dev/null + + health_check_exit_code=$? + + if [ $health_check_exit_code -eq $test_tp_fail_code ]; then + print_ok + stop_lttng_sessiond + else + print_fail + echo -e "Health returned: $health_check_exit_code\n" + + stop_lttng_sessiond + return 1 + fi +} + +THREAD=("LTTNG_THREAD_MANAGE_CLIENTS" + "LTTNG_THREAD_MANAGE_APPS" + "LTTNG_THREAD_MANAGE_KERNEL") + +# Exit code value to indicate specific thread failure +EXIT_CODE=(1 2 8) + +THREAD_COUNT=${#THREAD[@]} +i=0 +while [ "$i" -lt "$THREAD_COUNT" ]; do + test_tp_fail "${THREAD[$i]}" "${EXIT_CODE[$i]}" + + if [ $? -eq 1 ]; then + exit 1 + fi + + let "i++" +done + +# Special case manage consumer, need to spawn consumer via commands. +#"LTTNG_THREAD_MANAGE_CONSUMER" diff --git a/tests/tools/health/runall b/tests/tools/health/runall index 65a8ad159..d1c8b3446 100755 --- a/tests/tools/health/runall +++ b/tests/tools/health/runall @@ -2,7 +2,7 @@ DIR=$(dirname $0) -tests=( $DIR/health_thread_exit $DIR/health_thread_stall ) +tests=( $DIR/health_thread_exit $DIR/health_thread_stall $DIR/health_tp_fail) exit_code=0 function start_tests () -- 2.34.1