mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2025-12-29 18:30:11 +01:00
tests: merge branch 'th/test-run-valgrind'
(cherry picked from commit 5276f6896b)
This commit is contained in:
commit
1e7d952731
3 changed files with 184 additions and 21 deletions
|
|
@ -891,7 +891,7 @@ else
|
|||
fi
|
||||
fi
|
||||
AS_IF([test "$with_valgrind" != "no"],
|
||||
AC_SUBST(VALGRIND_RULES, 'LOG_COMPILER = "$(top_srcdir)/tools/run-test-valgrind.sh" "$(LIBTOOL)" "$(with_valgrind)" '"$with_valgrind_suppressions"),
|
||||
AC_SUBST(VALGRIND_RULES, 'LOG_COMPILER = "$(top_srcdir)/tools/run-test-valgrind.sh" --called-from-make "$(LIBTOOL)" "$(with_valgrind)" '"$with_valgrind_suppressions"),
|
||||
AC_SUBST(VALGRIND_RULES, []))
|
||||
AM_CONDITIONAL(WITH_VALGRIND, test "${with_valgrind}" != "no")
|
||||
|
||||
|
|
|
|||
|
|
@ -80,6 +80,10 @@
|
|||
* - respect g_test_quick(), if the command line contains '-mslow', '-mquick', '-mthorough'.
|
||||
* - use compile time default
|
||||
*
|
||||
* "p=PATH"|"s=PATH": passes the path to g_test_init() as "-p" and "-s", respectively.
|
||||
* Unfortunately, these options conflict with "--tap" which our makefile passes to the
|
||||
* tests, thus it's only useful outside of `make check`.
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
#include <arpa/inet.h>
|
||||
|
|
@ -142,6 +146,7 @@ struct __nmtst_internal
|
|||
gboolean assert_logging;
|
||||
gboolean no_expect_message;
|
||||
gboolean test_quick;
|
||||
gboolean test_tap_log;
|
||||
char *sudo_cmd;
|
||||
char **orig_argv;
|
||||
};
|
||||
|
|
@ -256,6 +261,8 @@ __nmtst_init (int *argc, char ***argv, gboolean assert_logging, const char *log_
|
|||
gboolean test_quick = FALSE;
|
||||
gboolean test_quick_set = FALSE;
|
||||
gboolean test_quick_argv = FALSE;
|
||||
gs_unref_ptrarray GPtrArray *p_tests = NULL;
|
||||
gs_unref_ptrarray GPtrArray *s_tests = NULL;
|
||||
|
||||
if (!out_set_logging)
|
||||
out_set_logging = &_out_set_logging;
|
||||
|
|
@ -275,17 +282,6 @@ __nmtst_init (int *argc, char ***argv, gboolean assert_logging, const char *log_
|
|||
if (argc)
|
||||
__nmtst_internal.orig_argv = g_strdupv (*argv);
|
||||
|
||||
if (argc && !g_test_initialized ()) {
|
||||
/* g_test_init() is a variadic function, so we cannot pass it
|
||||
* (variadic) arguments. If you need to pass additional parameters,
|
||||
* call nmtst_init() with argc==NULL and call g_test_init() yourself. */
|
||||
|
||||
/* g_test_init() sets g_log_set_always_fatal() for G_LOG_LEVEL_WARNING
|
||||
* and G_LOG_LEVEL_CRITICAL. So, beware that the test will fail if you
|
||||
* have any WARN or ERR log messages -- unless you g_test_expect_message(). */
|
||||
g_test_init (argc, argv, NULL);
|
||||
}
|
||||
|
||||
__nmtst_internal.assert_logging = !!assert_logging;
|
||||
|
||||
#if !GLIB_CHECK_VERSION (2, 35, 0)
|
||||
|
|
@ -325,6 +321,14 @@ __nmtst_init (int *argc, char ***argv, gboolean assert_logging, const char *log_
|
|||
sudo_cmd = g_strdup (&debug[strlen ("sudo-cmd=")]);
|
||||
} else if (!g_ascii_strcasecmp (debug, "no-expect-message")) {
|
||||
no_expect_message = TRUE;
|
||||
} else if (!g_ascii_strncasecmp (debug, "p=", strlen ("p="))) {
|
||||
if (!p_tests)
|
||||
p_tests = g_ptr_array_new_with_free_func (g_free);
|
||||
g_ptr_array_add (p_tests, g_strdup (&debug[strlen ("p=")]));
|
||||
} else if (!g_ascii_strncasecmp (debug, "s=", strlen ("s="))) {
|
||||
if (!s_tests)
|
||||
s_tests = g_ptr_array_new_with_free_func (g_free);
|
||||
g_ptr_array_add (s_tests, g_strdup (&debug[strlen ("s=")]));
|
||||
} else if (!g_ascii_strcasecmp (debug, "slow") || !g_ascii_strcasecmp (debug, "thorough")) {
|
||||
test_quick = FALSE;
|
||||
test_quick_set = TRUE;
|
||||
|
|
@ -358,6 +362,90 @@ __nmtst_init (int *argc, char ***argv, gboolean assert_logging, const char *log_
|
|||
|| !strcmp (*(a+1), "slow")
|
||||
|| !strcmp (*(a+1), "thorough"))))
|
||||
test_quick_argv = TRUE;
|
||||
else if (strcmp (*a, "--tap") == 0)
|
||||
__nmtst_internal.test_tap_log = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (!argc || g_test_initialized ()) {
|
||||
if (p_tests || s_tests) {
|
||||
char *msg = g_strdup_printf (">>> nmtst: ignore -p and -s options for test which calls g_test_init() itself");
|
||||
|
||||
g_array_append_val (debug_messages, msg);
|
||||
}
|
||||
} else {
|
||||
/* g_test_init() is a variadic function, so we cannot pass it
|
||||
* (variadic) arguments. If you need to pass additional parameters,
|
||||
* call nmtst_init() with argc==NULL and call g_test_init() yourself. */
|
||||
|
||||
/* g_test_init() sets g_log_set_always_fatal() for G_LOG_LEVEL_WARNING
|
||||
* and G_LOG_LEVEL_CRITICAL. So, beware that the test will fail if you
|
||||
* have any WARN or ERR log messages -- unless you g_test_expect_message(). */
|
||||
GPtrArray *arg_array = g_ptr_array_new ();
|
||||
gs_free char **arg_array_c = NULL;
|
||||
int arg_array_n, j;
|
||||
static char **s_tests_x, **p_tests_x;
|
||||
|
||||
if (*argc) {
|
||||
for (i = 0; i < *argc; i++)
|
||||
g_ptr_array_add (arg_array, (*argv)[i]);
|
||||
} else
|
||||
g_ptr_array_add (arg_array, "./test");
|
||||
|
||||
if (test_quick_set && !test_quick_argv)
|
||||
g_ptr_array_add (arg_array, "-m=quick");
|
||||
|
||||
if (!__nmtst_internal.test_tap_log) {
|
||||
for (i = 0; p_tests && i < p_tests->len; i++) {
|
||||
g_ptr_array_add (arg_array, "-p");
|
||||
g_ptr_array_add (arg_array, p_tests->pdata[i]);
|
||||
}
|
||||
for (i = 0; s_tests && i < s_tests->len; i++) {
|
||||
g_ptr_array_add (arg_array, "-s");
|
||||
g_ptr_array_add (arg_array, s_tests->pdata[i]);
|
||||
}
|
||||
} else if (p_tests || s_tests) {
|
||||
char *msg = g_strdup_printf (">>> nmtst: ignore -p and -s options for tap-tests");
|
||||
|
||||
g_array_append_val (debug_messages, msg);
|
||||
}
|
||||
|
||||
g_ptr_array_add (arg_array, NULL);
|
||||
|
||||
arg_array_n = arg_array->len - 1;
|
||||
arg_array_c = (char **) g_ptr_array_free (arg_array, FALSE);
|
||||
|
||||
g_test_init (&arg_array_n, &arg_array_c, NULL);
|
||||
|
||||
if (*argc > 1) {
|
||||
/* collaps argc/argv by removing the arguments detected
|
||||
* by g_test_init(). */
|
||||
for (i = 1, j = 1; i < *argc; i++) {
|
||||
if ((*argv)[i] == arg_array_c[j])
|
||||
j++;
|
||||
else
|
||||
(*argv)[i] = NULL;
|
||||
}
|
||||
for (i = 1, j = 1; i < *argc; i++) {
|
||||
if ((*argv)[i]) {
|
||||
(*argv)[j++] = (*argv)[i];
|
||||
if (i >= j)
|
||||
(*argv)[i] = NULL;
|
||||
}
|
||||
}
|
||||
*argc = j;
|
||||
}
|
||||
|
||||
/* we must "leak" the test paths because they are not cloned by g_test_init(). */
|
||||
if (!__nmtst_internal.test_tap_log) {
|
||||
if (p_tests) {
|
||||
p_tests_x = (char **) g_ptr_array_free (p_tests, FALSE);
|
||||
p_tests = NULL;
|
||||
}
|
||||
if (s_tests) {
|
||||
s_tests_x = (char **) g_ptr_array_free (s_tests, FALSE);
|
||||
s_tests = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,19 +1,93 @@
|
|||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
|
||||
die() {
|
||||
echo "$@"
|
||||
exit 5
|
||||
}
|
||||
|
||||
SCRIPT_PATH="${SCRIPT_PATH:-$(readlink -f "$(dirname "$0")")}"
|
||||
|
||||
LIBTOOL="$1"; shift
|
||||
VALGRIND="$1"; shift
|
||||
SUPPRESSIONS="$1"; shift
|
||||
VALGRIND_ERROR=37
|
||||
if [ "$1" = "--launch-dbus" ]; then
|
||||
if [ "$1" == "--called-from-make" ]; then
|
||||
shift
|
||||
NMTST_LIBTOOL=($1 --mode=execute); shift
|
||||
NMTST_VALGRIND="$1"; shift
|
||||
SUPPRESSIONS="$1"; shift
|
||||
if [ "$1" = "--launch-dbus" ]; then
|
||||
NMTST_LAUNCH_DBUS=yes
|
||||
shift
|
||||
else
|
||||
NMTST_LAUNCH_DBUS=no
|
||||
fi
|
||||
TEST="$1"; shift
|
||||
else
|
||||
if [ -n "${NMTST_LIBTOOL-:x}" ]; then
|
||||
NMTST_LIBTOOL=(sh "$SCRIPT_PATH/../libtool" --mode=execute)
|
||||
elif [ -n "${NMTST_LIBTOOL-x}" ]; then
|
||||
NMTST_LIBTOOL=()
|
||||
else
|
||||
NMTST_LIBTOOL=($NMTST_LIBTOOL --mode=execute)
|
||||
fi
|
||||
for a in "$@"; do
|
||||
case "$a" in
|
||||
"--launch-dbus")
|
||||
NMTST_LAUNCH_DBUS=yes
|
||||
shift
|
||||
;;
|
||||
"--no-launch-dbus"|"-D")
|
||||
NMTST_LAUNCH_DBUS=no
|
||||
shift
|
||||
;;
|
||||
"--no-libtool")
|
||||
NMTST_LIBTOOL=()
|
||||
shift
|
||||
;;
|
||||
"--")
|
||||
shift
|
||||
break
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
# we support calling the script directly. In this case,
|
||||
# only pass the path to the test to run.
|
||||
TEST="$1"; shift
|
||||
NMTST_VALGRIND="${NMTST_VALGRIND:-valgrind}"
|
||||
if [ "$SUPPRESSIONS" == "" ]; then
|
||||
SUPPRESSIONS="$SCRIPT_PATH/../valgrind.suppressions"
|
||||
fi
|
||||
|
||||
[ -x "$TEST" ] || die "Test \"$TEST\" does not exist"
|
||||
|
||||
TEST_PATH="$(readlink -f "$(dirname "$TEST")")"
|
||||
|
||||
if [ -n "${NMTST_LAUNCH_DBUS-x}" ]; then
|
||||
# autodetect whether to launch D-Bus based on the test path.
|
||||
if [[ $TEST_PATH == */libnm/tests || $TEST_PATH == */libnm-glib/tests ]]; then
|
||||
NMTST_LAUNCH_DBUS=yes
|
||||
else
|
||||
NMTST_LAUNCH_DBUS=no
|
||||
fi
|
||||
fi
|
||||
|
||||
# some tests require you to cd into the base directory.
|
||||
# do that.
|
||||
if [ "$NMTST_VALGRIND_NO_CD" == "" ]; then
|
||||
cd "$TEST_PATH"
|
||||
TEST="./$(basename "$TEST")"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$NMTST_LAUNCH_DBUS" == "yes" ]; then
|
||||
# Spawn DBus
|
||||
eval `dbus-launch --sh-syntax`
|
||||
trap "kill $DBUS_SESSION_BUS_PID" EXIT
|
||||
shift
|
||||
fi
|
||||
TEST="$1"
|
||||
|
||||
if [ "$NMTST_NO_VALGRIND" != "" ]; then
|
||||
"$@"
|
||||
"$TEST" "$@"
|
||||
exit $?
|
||||
fi
|
||||
|
||||
|
|
@ -21,7 +95,7 @@ LOGFILE="valgrind-`echo "$TEST" | tr -cd '[:alpha:]-'`.log"
|
|||
|
||||
export G_SLICE=always-malloc
|
||||
export G_DEBUG=gc-friendly
|
||||
$LIBTOOL --mode=execute "$VALGRIND" \
|
||||
"${NMTST_LIBTOOL[@]}" "$NMTST_VALGRIND" \
|
||||
--quiet \
|
||||
--error-exitcode=$VALGRIND_ERROR \
|
||||
--leak-check=full \
|
||||
|
|
@ -29,6 +103,7 @@ $LIBTOOL --mode=execute "$VALGRIND" \
|
|||
--suppressions="$SUPPRESSIONS" \
|
||||
--num-callers=100 \
|
||||
--log-file="$LOGFILE" \
|
||||
"$TEST" \
|
||||
"$@"
|
||||
RESULT=$?
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue