Optional test for the metadata regeneration
authorJulien Desfossez <jdesfossez@efficios.com>
Fri, 18 Sep 2015 19:31:37 +0000 (15:31 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Tue, 15 Mar 2016 19:50:24 +0000 (15:50 -0400)
This test changes the date of the current system before and after the
metadata regeneration command to make sure the behaviour is as expected.
It is not run by default and requires the
LTTNG_ENABLE_DESTRUCTIVE_TESTS environment variable to be set to
"will-break-my-system".

Signed-off-by: Julien Desfossez <jdesfossez@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
configure.ac
tests/Makefile.am
tests/destructive/Makefile.am [new file with mode: 0644]
tests/destructive/metadata-regeneration [new file with mode: 0755]
tests/root_destructive_tests [new file with mode: 0644]
tests/utils/utils.sh

index 425f536dc2062d79c39a62584c78f68f7cb28ced..4e5e4f22248780057a1b777652b66ad86722374c 100644 (file)
@@ -807,6 +807,7 @@ AC_CONFIG_FILES([
        src/bin/lttng/Makefile
        src/bin/lttng-crash/Makefile
        tests/Makefile
+       tests/destructive/Makefile
        tests/regression/Makefile
        tests/regression/kernel/Makefile
        tests/regression/tools/Makefile
index 31a958ec354d246417a7d41094ac2bec028294ca..017163f51d24573a46ab7b12a19ed090fd825b2e 100644 (file)
@@ -1,8 +1,8 @@
 SUBDIRS =
-DIST_SUBDIRS = utils regression unit stress
+DIST_SUBDIRS = utils regression unit stress destructive
 
 if BUILD_TESTS
-SUBDIRS += utils regression unit stress
+SUBDIRS += utils regression unit stress destructive
 endif
 
 installcheck-am:
@@ -37,8 +37,8 @@ else
        @echo "========================================="
 endif
 
-dist_noinst_SCRIPTS = run.sh unit_tests fast_regression long_regression root_regression with_bindings_regression
-EXTRA_DIST = run.sh unit_tests fast_regression long_regression root_regression with_bindings_regression README
+dist_noinst_SCRIPTS = run.sh unit_tests fast_regression long_regression root_regression with_bindings_regression root_destructive_tests
+EXTRA_DIST = run.sh unit_tests fast_regression long_regression root_regression with_bindings_regression README root_destructive_tests
 
 all-local:
        @if [ x"$(srcdir)" != x"$(builddir)" ]; then \
diff --git a/tests/destructive/Makefile.am b/tests/destructive/Makefile.am
new file mode 100644 (file)
index 0000000..6bf70b4
--- /dev/null
@@ -0,0 +1,16 @@
+noinst_SCRIPTS = metadata-regeneration
+EXTRA_DIST = metadata-regeneration
+
+all-local:
+       @if [ x"$(srcdir)" != x"$(builddir)" ]; then \
+               for script in $(EXTRA_DIST); do \
+                       cp -f $(srcdir)/$$script $(builddir); \
+               done; \
+       fi
+
+clean-local:
+       @if [ x"$(srcdir)" != x"$(builddir)" ]; then \
+               for script in $(EXTRA_DIST); do \
+                       rm -f $(builddir)/$$script; \
+               done; \
+       fi
diff --git a/tests/destructive/metadata-regeneration b/tests/destructive/metadata-regeneration
new file mode 100755 (executable)
index 0000000..32469b5
--- /dev/null
@@ -0,0 +1,228 @@
+#!/bin/bash
+#
+# Copyright (C) - 2015 Julien Desfossez <jdesfossez@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.
+
+# WARNING: this test changes the date of the system (and does not set it back).
+# This test sets the date of the current machine to $DATE1, creates a trace
+# makes sure the trace is really at that date, then restarts the trace, changes
+# the date to $DATE2, regenerates the metadata and validates that the trace is
+# actually at $DATE2.
+
+TEST_DESC="Metadata regeneration after date change"
+
+CURDIR=$(dirname $0)/
+TESTDIR=$CURDIR/..
+NUM_TESTS=44
+SESSION_NAME="regen"
+KERNEL_EVENT_NAME="lttng_test_filter_event"
+TRACE_PATH=$(mktemp -d)
+
+TESTAPP_PATH="$TESTDIR/utils/testapp"
+TESTAPP_NAME="gen-ust-events"
+TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME"
+NR_ITER=1
+NR_USEC_WAIT=0
+UST_EVENT_NAME="tp:tptest"
+
+DATE1="1970-02-02"
+DATE2="1980-02-02"
+HOUR="05:30"
+
+source $TESTDIR/utils/utils.sh
+
+# MUST set TESTDIR before calling those functions
+plan_tests $NUM_TESTS
+
+print_test_banner "$TEST_DESC"
+
+function lttng_create_session_uri
+{
+       # Create session with default path
+       $TESTDIR/../src/bin/lttng/$LTTNG_BIN create $SESSION_NAME -U net://localhost >/dev/null 2>&1
+       ok $? "Create session with default path"
+}
+
+function validate_trace_date
+{
+       local test_date=$1
+       local trace_path=$2
+
+       which $BABELTRACE_BIN >/dev/null
+       if [ $? -ne 0 ]; then
+           skip 0 "Babeltrace binary not found. Skipping trace validation"
+       fi
+
+       res=$($BABELTRACE_BIN --clock-date $trace_path 2>/dev/null | head -1 | grep $test_date)
+       if [ $? -eq 0 ]; then
+               pass "Validate trace at date $test_date"
+               ret=0
+       else
+               fail "The trace is not at the expected date"
+               ret=-1
+       fi
+
+       return $ret
+}
+
+function test_kernel_local ()
+{
+       diag "Test kernel local with metadata regeneration"
+       date "+%Y-%m-%d %H:%M" -s "$DATE1 $HOUR" >/dev/null
+       create_lttng_session_ok $SESSION_NAME $TRACE_PATH
+       lttng_enable_kernel_event $SESSION_NAME $KERNEL_EVENT_NAME
+       start_lttng_tracing_ok $SESSION_NAME
+       echo -n "100" > /proc/lttng-test-filter-event
+       stop_lttng_tracing_ok $SESSION_NAME
+       validate_trace_date $DATE1 $TRACE_PATH
+       start_lttng_tracing_ok $SESSION_NAME
+       date "+%Y-%m-%d %H:%M" -s "$DATE2 $HOUR" >/dev/null
+       metadata_regenerate_ok $SESSION_NAME
+       stop_lttng_tracing_ok $SESSION_NAME
+       validate_trace_date $DATE2 $TRACE_PATH
+       if [ $? -eq 0 ]; then
+               # Only delete if successful
+               rm -rf $TRACE_PATH
+       fi
+       destroy_lttng_session_ok $SESSION_NAME
+}
+
+function test_kernel_streaming ()
+{
+       diag "Test kernel streaming with metadata regeneration"
+       date "+%Y-%m-%d %H:%M" -s "$DATE1 $HOUR" >/dev/null
+       lttng_create_session_uri
+       lttng_enable_kernel_event $SESSION_NAME $KERNEL_EVENT_NAME
+       start_lttng_tracing_ok $SESSION_NAME
+       echo -n "100" > /proc/lttng-test-filter-event
+       stop_lttng_tracing_ok $SESSION_NAME
+       validate_trace_date $DATE1 $TRACE_PATH/$HOSTNAME/$SESSION_NAME*
+       start_lttng_tracing_ok $SESSION_NAME
+       date "+%Y-%m-%d %H:%M" -s "$DATE2 $HOUR" >/dev/null
+       metadata_regenerate_ok $SESSION_NAME
+       stop_lttng_tracing_ok $SESSION_NAME
+       # Validate test
+       validate_trace_date $DATE2 $TRACE_PATH/$HOSTNAME/$SESSION_NAME*
+       if [ $? -eq 0 ]; then
+               # Only delete if successful
+               rm -rf $TRACE_PATH
+       else
+               break
+       fi
+       destroy_lttng_session_ok $SESSION_NAME
+}
+
+function test_ust_local ()
+{
+       local file_sync_after_first=$(mktemp -u)
+       local file_sync_before_last=$(mktemp -u)
+
+       diag "Test UST local with metadata regeneration"
+       date "+%Y-%m-%d %H:%M" -s "$DATE1 $HOUR" >/dev/null
+       create_lttng_session_ok $SESSION_NAME $TRACE_PATH
+       enable_ust_lttng_event_ok $SESSION_NAME $UST_EVENT_NAME
+
+       $TESTAPP_BIN $NR_ITER $NR_USEC_WAIT ${file_sync_after_first} ${file_sync_before_last} /dev/null 2>&1 &
+
+       start_lttng_tracing_ok $SESSION_NAME
+
+       touch ${file_sync_before_last}
+       # Wait for the applications started in background
+       wait
+
+       stop_lttng_tracing_ok $SESSION_NAME
+       validate_trace_date $DATE1 $TRACE_PATH
+
+       start_lttng_tracing_ok $SESSION_NAME
+       date "+%Y-%m-%d %H:%M" -s "$DATE2 $HOUR" >/dev/null
+       metadata_regenerate_ok $SESSION_NAME
+
+       stop_lttng_tracing_ok $SESSION_NAME
+       destroy_lttng_session_ok $SESSION_NAME
+       validate_trace_date $DATE2 $TRACE_PATH
+       if [ $? -eq 0 ]; then
+               # Only delete if successful
+               rm -rf $TRACE_PATH
+       fi
+       rm -f ${file_sync_after_first}
+       rm -f ${file_sync_before_last}
+}
+
+function test_ust_streaming ()
+{
+       local file_sync_after_first=$(mktemp -u)
+       local file_sync_before_last=$(mktemp -u)
+
+       diag "Test UST streaming with metadata regeneration"
+       date "+%Y-%m-%d %H:%M" -s "$DATE1 $HOUR" >/dev/null
+       lttng_create_session_uri
+       enable_ust_lttng_event_ok $SESSION_NAME $UST_EVENT_NAME
+
+       $TESTAPP_BIN $NR_ITER $NR_USEC_WAIT ${file_sync_after_first} ${file_sync_before_last} /dev/null 2>&1 &
+
+       start_lttng_tracing_ok $SESSION_NAME
+
+       touch ${file_sync_before_last}
+
+       # Wait for the applications started in background
+       wait
+       stop_lttng_tracing_ok $SESSION_NAME
+       validate_trace_date $DATE1 $TRACE_PATH/$HOSTNAME/$SESSION_NAME*
+
+       start_lttng_tracing_ok $SESSION_NAME
+       date "+%Y-%m-%d %H:%M" -s "$DATE2 $HOUR" >/dev/null
+
+       metadata_regenerate_ok $SESSION_NAME
+
+       stop_lttng_tracing_ok $SESSION_NAME
+       destroy_lttng_session_ok $SESSION_NAME
+       # Validate test
+       validate_trace_date $DATE2 $TRACE_PATH/$HOSTNAME/$SESSION_NAME*
+       if [ $? -eq 0 ]; then
+               # Only delete if successful
+               rm -rf $TRACE_PATH
+       fi
+       rm -f ${file_sync_after_first}
+       rm -f ${file_sync_before_last}
+}
+
+if [ "$(id -u)" == "0" ]; then
+       isroot=1
+else
+       isroot=0
+fi
+
+if ! destructive_tests_enabled ; then
+       echo 'You need to set the LTTNG_ENABLE_DESTRUCTIVE_TESTS to "will-break-my-system" as argument to run this test'
+       echo 'Moreover, please make sure that ntp is not running while executing this test'
+       exit 0
+fi
+
+skip $isroot "Root access is needed. Skipping all tests." $NUM_TESTS ||
+{
+       start_lttng_relayd "-o $TRACE_PATH"
+       start_lttng_sessiond
+
+       modprobe lttng-test
+       test_kernel_local
+       test_kernel_streaming
+       rmmod lttng-test
+
+       test_ust_local
+       test_ust_streaming
+
+       stop_lttng_sessiond
+       stop_lttng_relayd
+}
diff --git a/tests/root_destructive_tests b/tests/root_destructive_tests
new file mode 100644 (file)
index 0000000..73a7bb8
--- /dev/null
@@ -0,0 +1 @@
+destructive/metadata-regeneration
index 854bae5d2bac49f81fba140e4903e39c3deee1c8..52c2f6badb9d50d46c1116d4c5b20be689dc97e4 100644 (file)
@@ -1334,3 +1334,12 @@ function metadata_regenerate_fail ()
 {
        metadata_regenerate 1 "$@"
 }
+
+function destructive_tests_enabled ()
+{
+       if [ ${LTTNG_ENABLE_DESTRUCTIVE_TESTS} = "will-break-my-system" ]; then
+               return 0
+       else
+               return 1
+       fi
+}
This page took 0.031944 seconds and 4 git commands to generate.