Tests: Add health check testpoint fail test
authorChristian Babeux <christian.babeux@efficios.com>
Thu, 13 Dec 2012 23:39:13 +0000 (18:39 -0500)
committerDavid Goulet <dgoulet@efficios.com>
Fri, 14 Dec 2012 01:12:21 +0000 (20:12 -0500)
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 <christian.babeux@efficios.com>
Signed-off-by: David Goulet <dgoulet@efficios.com>
tests/tools/health/Makefile.am
tests/tools/health/health_fail.c [new file with mode: 0644]
tests/tools/health/health_tp_fail [new file with mode: 0755]
tests/tools/health/runall

index f1a5d915d9350c8506a8a58800ab07dff00bbc28..6f80ead340e6599f859be3cc0cd5d116e6414bf8 100644 (file)
@@ -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 (file)
index 0000000..6227825
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2012 - Christian Babeux <christian.babeux@efficios.com>
+ *
+ * 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 <stdlib.h>
+#include <string.h>
+#include <pthread.h>
+
+/*
+ * 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 (executable)
index 0000000..5b68e62
--- /dev/null
@@ -0,0 +1,98 @@
+#!/bin/bash
+#
+# Copyright (C) - 2012 Christian Babeux <christian.babeux@efficios.com>
+#
+# 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"
index 65a8ad159bd105719e43b765c372949e0a11e1d5..d1c8b34468b11a2d87d15a76d02839802622cdb7 100755 (executable)
@@ -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 ()
This page took 0.039228 seconds and 4 git commands to generate.