From 5836cdc2ccafa85a1813d5740133e8b652cfa7e3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Mon, 25 Mar 2013 20:28:35 -0400 Subject: [PATCH] Tests: Add "libc-wrapper" ust regression test MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Based on the "test-libustinstr-malloc" test formerly part of lttng-ust. Signed-off-by: Jérémie Galarneau Signed-off-by: David Goulet --- .gitignore | 1 + configure.ac | 1 + tests/fast_regression | 1 + tests/long_regression | 1 + tests/regression/ust/Makefile.am | 2 +- tests/regression/ust/libc-wrapper/Makefile.am | 8 ++ tests/regression/ust/libc-wrapper/README | 22 +++++ tests/regression/ust/libc-wrapper/prog.c | 48 ++++++++++ .../ust/libc-wrapper/test_libc-wrapper | 35 +++++++ .../ust/libc-wrapper/test_libc-wrapper.py | 92 +++++++++++++++++++ 10 files changed, 210 insertions(+), 1 deletion(-) create mode 100644 tests/regression/ust/libc-wrapper/Makefile.am create mode 100644 tests/regression/ust/libc-wrapper/README create mode 100644 tests/regression/ust/libc-wrapper/prog.c create mode 100755 tests/regression/ust/libc-wrapper/test_libc-wrapper create mode 100644 tests/regression/ust/libc-wrapper/test_libc-wrapper.py diff --git a/.gitignore b/.gitignore index 533973aa1..8e2e63d1c 100644 --- a/.gitignore +++ b/.gitignore @@ -71,5 +71,6 @@ tests/regression/ust/daemon/daemon tests/regression/ust/exit-fast/exit-fast tests/regression/ust/fork/fork tests/regression/ust/fork/fork2 +tests/regression/ust/libc-wrapper/prog benchmark/ diff --git a/configure.ac b/configure.ac index d7ca25371..e2c2a4ffd 100644 --- a/configure.ac +++ b/configure.ac @@ -336,6 +336,7 @@ AC_CONFIG_FILES([ tests/regression/ust/daemon/Makefile tests/regression/ust/exit-fast/Makefile tests/regression/ust/fork/Makefile + tests/regression/ust/libc-wrapper/Makefile tests/unit/Makefile tests/utils/Makefile tests/utils/tap/Makefile diff --git a/tests/fast_regression b/tests/fast_regression index cc561fb55..175bb036d 100644 --- a/tests/fast_regression +++ b/tests/fast_regression @@ -16,3 +16,4 @@ regression/ust/linking/test_linking regression/ust/daemon/test_daemon regression/ust/exit-fast/test_exit-fast regression/ust/fork/test_fork +regression/ust/libc-wrapper/test_libc-wrapper diff --git a/tests/long_regression b/tests/long_regression index 810b661db..8b1cbfc24 100644 --- a/tests/long_regression +++ b/tests/long_regression @@ -18,3 +18,4 @@ regression/ust/linking/test_linking regression/ust/daemon/test_daemon regression/ust/exit-fast/test_exit-fast regression/ust/fork/test_fork +regression/ust/libc-wrapper/test_libc-wrapper diff --git a/tests/regression/ust/Makefile.am b/tests/regression/ust/Makefile.am index 23613bdeb..e6225440b 100644 --- a/tests/regression/ust/Makefile.am +++ b/tests/regression/ust/Makefile.am @@ -1,6 +1,6 @@ if HAVE_LIBLTTNG_UST_CTL SUBDIRS = nprocesses high-throughput low-throughput before-after multi-session \ - overlap buffers-uid linking daemon exit-fast fork + overlap buffers-uid linking daemon exit-fast fork libc-wrapper EXTRA_DIST = test_event_basic test_event_wildcard diff --git a/tests/regression/ust/libc-wrapper/Makefile.am b/tests/regression/ust/libc-wrapper/Makefile.am new file mode 100644 index 000000000..af12d31ed --- /dev/null +++ b/tests/regression/ust/libc-wrapper/Makefile.am @@ -0,0 +1,8 @@ +AM_CPPFLAGS = -I$(srcdir) + +noinst_PROGRAMS = prog +prog_SOURCES = prog.c +prog_LDADD = -llttng-ust -llttng-ust-libc-wrapper + +noinst_SCRIPTS = test_libc-wrapper test_libc-wrapper.py +EXTRA_DIST = test_libc-wrapper test_libc-wrapper.py diff --git a/tests/regression/ust/libc-wrapper/README b/tests/regression/ust/libc-wrapper/README new file mode 100644 index 000000000..adcd42560 --- /dev/null +++ b/tests/regression/ust/libc-wrapper/README @@ -0,0 +1,22 @@ +libc-wrapper malloc/free tracing test +------------------------------------- + +This test checks if tracing works correctly when applications are linked against +the UST libc wrapper which provides tracepoints in the malloc and free libc +functions. + +DESCRIPTION +----------- + +The test application performs a series of calls to malloc()/free() and the +resulting trace is checked for the presence of ust-libc:malloc and ust-libc:free +events. + +DEPENDENCIES +------------ + +To run this test, you will need: + + - lttng-tools (with python bindings) + - babeltrace + - python 3.0 or better diff --git a/tests/regression/ust/libc-wrapper/prog.c b/tests/regression/ust/libc-wrapper/prog.c new file mode 100644 index 000000000..3068257f8 --- /dev/null +++ b/tests/regression/ust/libc-wrapper/prog.c @@ -0,0 +1,48 @@ +/* Copyright (C) 2009 Pierre-Marc Fournier + * + * 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; either + * version 2.1 of the License, or (at your option) any later version. + * + * 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 + */ + +/* This program is used to test malloc instrumentation with libustinstr-malloc. + */ + +#include +#include + +#define N_ITER 1000 + +int main() +{ + int i; + const char teststr[] = "Hello World! 1234567890abc"; + void *ptrs[N_ITER]; + + for (i = 0; i < N_ITER; i++) { + ptrs[i] = malloc(i+1000); + + memcpy(ptrs[i], teststr, sizeof(teststr)); + + if (i % 2 == 0) { + free(ptrs[i]); + } + } + + for (i = 0; i < N_ITER; i++) { + if (i % 2 == 1) + free(ptrs[i]); + } + + return 0; +} diff --git a/tests/regression/ust/libc-wrapper/test_libc-wrapper b/tests/regression/ust/libc-wrapper/test_libc-wrapper new file mode 100755 index 000000000..8c6b12826 --- /dev/null +++ b/tests/regression/ust/libc-wrapper/test_libc-wrapper @@ -0,0 +1,35 @@ +#!/bin/sh +# +# Copyright (C) - 2013 Jérémie Galarneau +# +# 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. + +# Check for a running sessiond +`pidof lt-lttng-sessiond` +STOP_SESSIOND=$? + +CURDIR=$(dirname $0) +TESTDIR=${CURDIR}/../../.. + +# Try to launch a sessiond before invoking the python test script +if [ $STOP_SESSIOND -ne 0 ]; then + DIR=$(readlink -f ${TESTDIR}) + ${DIR}/../src/bin/lttng-sessiond/lttng-sessiond --daemonize --quiet --consumerd32-path="$DIR/../src/bin/lttng-consumerd/lttng-consumerd" --consumerd64-path="$DIR/../src/bin/lttng-consumerd/lttng-consumerd" +fi + +python3 ${CURDIR}/test_libc-wrapper.py + +if [ $STOP_SESSIOND -ne 0 ]; then + kill `pidof lt-lttng-sessiond` +fi diff --git a/tests/regression/ust/libc-wrapper/test_libc-wrapper.py b/tests/regression/ust/libc-wrapper/test_libc-wrapper.py new file mode 100644 index 000000000..d45b71add --- /dev/null +++ b/tests/regression/ust/libc-wrapper/test_libc-wrapper.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +# +# Copyright (C) - 2013 Jérémie Galarneau +# +# 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. + +import os +import subprocess +import re +import shutil +import sys + +test_path = os.path.dirname(os.path.abspath(__file__)) + "/" +test_utils_path = test_path +for i in range(4): + test_utils_path = os.path.dirname(test_utils_path) +test_utils_path = test_utils_path + "/utils" +sys.path.append(test_utils_path) +from test_utils import * + + +NR_TESTS = 4 +current_test = 1 +print("1..{0}".format(NR_TESTS)) + +# Check if a sessiond is running... bail out if none found. +if session_daemon_alive() == 0: + bail("No sessiond running. Please make sure you are running this test with the \"run\" shell script and verify that the lttng tools are properly installed.") + +session_info = create_session() +enable_ust_tracepoint_event(session_info, "ust_libc*") +start_session(session_info) + +malloc_process = subprocess.Popen(test_path + "prog", stdout=subprocess.PIPE, stderr=subprocess.PIPE) +if sys.version_info >= (3, 3): + try: + malloc_process.wait(5) + except TimeoutExpired: + malloc_process.kill() + bail("Failed to run libustinstr-malloc test application.", session_info) +else: + malloc_process.wait() + +print_test_result(malloc_process.returncode == 0, current_test, "Test application exited normally") +current_test += 1 + +stop_session(session_info) + +# Check for malloc events in the resulting trace +try: + babeltrace_process = subprocess.Popen(["babeltrace", session_info.trace_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE) +except FileNotFoundError: + bail("Could not open babeltrace. Please make sure it is installed.", session_info) + +malloc_event_found = False +free_event_found = False + +for event_line in babeltrace_process.stdout: + # Let babeltrace finish to get the return code + if malloc_event_found and free_event_found: + continue + + event_line = event_line.decode('utf-8').replace("\n", "") + if re.search(r".*ust_libc:malloc.*", event_line) is not None: + malloc_event_found = True + + if re.search(r".*ust_libc:free.*", event_line) is not None: + free_event_found = True + +babeltrace_process.wait() + +print_test_result(babeltrace_process.returncode == 0, current_test, "Resulting trace is readable") +current_test += 1 + +print_test_result(free_event_found, current_test, "ust_libc:malloc event found in resulting trace") +current_test += 1 + +print_test_result(free_event_found, current_test, "ust_libc:free event found in resulting trace") +current_test += 1 + +shutil.rmtree(session_info.tmp_directory) -- 2.34.1