Commit 3d557ff7 authored by Simon McVittie's avatar Simon McVittie

tests: In slower tests, make the timeout per-test-case

Some test-cases in the dbus-daemon and relay tests spam the bus with
thousands of messages, which can take 25 seconds on slower CPUs like
MIPS. Similarly, the refs test spams millions of refcount operations,
which it appears might take more than a minute on PA-RISC (HPPA).

To get an idea of how close we are to having a problem on other
architectures, log a message and start a timer when we reset the
timeout in setup(), and log the elapsed time when we reach teardown().

Bug: https://bugs.freedesktop.org/show_bug.cgi?id=103009Signed-off-by: Simon McVittie's avatarSimon McVittie <smcv@collabora.com>
Reviewed-by: Philip Withnall's avatarPhilip Withnall <withnall@endlessm.com>
parent 5aca0fc1
......@@ -158,6 +158,9 @@ setup (Fixture *f,
{
const Config *config = context;
/* Some tests are fairly slow, so make the test timeout per-test */
test_timeout_reset ();
f->ctx = test_main_context_get ();
f->ge = NULL;
dbus_error_init (&f->e);
......
......@@ -201,6 +201,9 @@ setup (Fixture *f,
if (!dbus_threads_init_default ())
g_error ("OOM");
/* This can be fairly slow, so make the test timeout per-test */
test_timeout_reset ();
f->n_threads = N_THREADS;
f->n_refs = N_REFS;
......
......@@ -122,6 +122,8 @@ static void
setup (Fixture *f,
gconstpointer data G_GNUC_UNUSED)
{
test_timeout_reset ();
f->ctx = test_main_context_get ();
dbus_error_init (&f->e);
g_queue_init (&f->messages);
......
......@@ -485,18 +485,20 @@ wrap_abort (int signal)
}
#endif
void
test_init (int *argcp, char ***argvp)
static void
set_timeout (void)
{
g_test_init (argcp, argvp, NULL);
g_test_bug_base ("https://bugs.freedesktop.org/show_bug.cgi?id=");
static guint timeout = 0;
/* Prevent tests from hanging forever. This is intended to be long enough
* that any reasonable regression test on any reasonable hardware would
* have finished. */
#define TIMEOUT 60
g_timeout_add_seconds (TIMEOUT, time_out, NULL);
if (timeout != 0)
g_source_remove (timeout);
timeout = g_timeout_add_seconds (TIMEOUT, time_out, NULL);
#ifdef G_OS_UNIX
/* The GLib main loop might not be running (we don't use it in every
* test). Die with SIGALRM shortly after if necessary. */
......@@ -513,6 +515,35 @@ test_init (int *argcp, char ***argvp)
#endif
}
void
test_init (int *argcp, char ***argvp)
{
g_test_init (argcp, argvp, NULL);
g_test_bug_base ("https://bugs.freedesktop.org/show_bug.cgi?id=");
set_timeout ();
}
static void
report_and_destroy (gpointer p)
{
GTimer *timer = p;
g_test_message ("Time since timeout reset %p: %.3f seconds",
timer, g_timer_elapsed (timer, NULL));
g_timer_destroy (timer);
}
void
test_timeout_reset (void)
{
GTimer *timer = g_timer_new ();
g_test_message ("Resetting test timeout (reference: %p)", timer);
set_timeout ();
g_test_queue_destroy (report_and_destroy, timer);
}
void
test_progress (char symbol)
{
......
......@@ -89,4 +89,6 @@ void test_rmdir_must_exist (const gchar *path);
void test_rmdir_if_exists (const gchar *path);
void test_mkdir (const gchar *path, gint mode);
void test_timeout_reset (void);
#endif
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment