From 49bc02747babed6d94119b2222c5072a9716d4af Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Wed, 20 Mar 2013 10:36:26 +0000 Subject: [PATCH] Add infrastructure to run tests under GTestDBus For now, all library TestCase subclasses except the one for key-files override this back to "do nothing" and rely on being run under with-session-bus.sh, because I haven't checked whether they survive having the D-Bus session bus disconnected from under them. Bug: https://bugzilla.gnome.org/show_bug.cgi?id=690830 Reviewed-by: Philip Withnall [added comments about the undesirable dbus-1 dependency -smcv] Signed-off-by: Simon McVittie --- configure.ac | 3 +- tests/lib/Makefile.am | 3 ++ tests/lib/eds/test-case.vala | 6 ++++ tests/lib/libsocialweb/test-case.vala | 6 ++++ tests/lib/telepathy/test-case.vala | 6 ++++ tests/lib/test-case-helper.c | 13 ++++++++ tests/lib/test-case.vala | 57 +++++++++++++++++++++++++++++++++++ tests/lib/tracker/test-case.vala | 6 ++++ 8 files changed, 99 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 803671a..8f5166c 100644 --- a/configure.ac +++ b/configure.ac @@ -189,7 +189,8 @@ PKG_CHECK_MODULES([GLIB], gobject-2.0 >= $GLIB_REQUIRED]) PKG_CHECK_MODULES([GMODULE], [gmodule-no-export-2.0]) PKG_CHECK_MODULES([GIO], [gio-2.0 >= $GLIB_REQUIRED]) -PKG_CHECK_MODULES([DBUS_GLIB], [dbus-glib-1]) +# FIXME: get rid of this when our dependencies stop using dbus-1 (GNOME#696177) +PKG_CHECK_MODULES([DBUS_GLIB], [dbus-glib-1 dbus-1]) PKG_CHECK_MODULES([GEE], [gee-0.8 >= $GEE_REQUIRED]) diff --git a/tests/lib/Makefile.am b/tests/lib/Makefile.am index 2b0b314..7d1b6d9 100644 --- a/tests/lib/Makefile.am +++ b/tests/lib/Makefile.am @@ -41,6 +41,7 @@ libfolks_test_la_CFLAGS = \ $(GLIB_CFLAGS) \ $(GIO_CFLAGS) \ $(GEE_CFLAGS) \ + $(DBUS_GLIB_CFLAGS) \ $(NULL) libfolks_test_la_CPPFLAGS = \ @@ -55,6 +56,7 @@ libfolks_test_la_LIBADD = \ $(GLIB_LIBS) \ $(GIO_LIBS) \ $(GEE_LIBS) \ + $(DBUS_GLIB_LIBS) \ $(NULL) libfolks_test_la_VALAFLAGS = \ @@ -65,6 +67,7 @@ libfolks_test_la_VALAFLAGS = \ --pkg gobject-2.0 \ --pkg gio-2.0 \ --pkg gee-0.8 \ + --pkg dbus-glib-1 \ --pkg folks \ --library folks-test \ -H folks-test.h \ diff --git a/tests/lib/eds/test-case.vala b/tests/lib/eds/test-case.vala index 8465589..6b8446b 100644 --- a/tests/lib/eds/test-case.vala +++ b/tests/lib/eds/test-case.vala @@ -57,6 +57,12 @@ public class EdsTest.TestCase : Folks.TestCase true); } + public override void private_bus_up () + { + /* Don't do anything. We're currently relying on + * being wrapped in with-session-bus-eds.sh. */ + } + public override void set_up () { base.set_up (); diff --git a/tests/lib/libsocialweb/test-case.vala b/tests/lib/libsocialweb/test-case.vala index 3ad094e..2d83bb1 100644 --- a/tests/lib/libsocialweb/test-case.vala +++ b/tests/lib/libsocialweb/test-case.vala @@ -55,6 +55,12 @@ public class LibsocialwebTest.TestCase : Folks.TestCase Environment.set_variable ("FOLKS_PRIMARY_STORE", "", true); } + public override void private_bus_up () + { + /* Don't do anything. We're currently relying on + * being wrapped in with-session-bus.sh. */ + } + /** * Set up the libsocialweb test backend and wait for it to become ready. */ diff --git a/tests/lib/telepathy/test-case.vala b/tests/lib/telepathy/test-case.vala index db1048d..f2b9f10 100644 --- a/tests/lib/telepathy/test-case.vala +++ b/tests/lib/telepathy/test-case.vala @@ -116,6 +116,12 @@ public class TpfTest.TestCase : Folks.TestCase this.create_tp_backend (); } + public override void private_bus_up () + { + /* Don't do anything. We're currently relying on + * being wrapped in with-session-bus.sh. */ + } + /** * Virtual method to create the keyfile backend. Currently called by * the constructor (once per process), but might move into set_up() later. diff --git a/tests/lib/test-case-helper.c b/tests/lib/test-case-helper.c index 2b0c6d5..47bf8f4 100644 --- a/tests/lib/test-case-helper.c +++ b/tests/lib/test-case-helper.c @@ -24,6 +24,7 @@ #include #include +#include typedef struct { gpointer self; @@ -89,3 +90,15 @@ folks_test_case_add_test_helper (FolksTestCase *self, folks_test_case_weak_method_test, folks_test_case_weak_method_teardown); } + +void +_folks_test_case_dbus_1_set_no_exit_on_disconnect (void) +{ + DBusConnection *conn = dbus_bus_get (DBUS_BUS_SESSION, NULL); + + if (conn != NULL) + { + dbus_connection_set_exit_on_disconnect (conn, FALSE); + dbus_connection_unref (conn); + } +} diff --git a/tests/lib/test-case.vala b/tests/lib/test-case.vala index 76eecee..f6f9a4e 100644 --- a/tests/lib/test-case.vala +++ b/tests/lib/test-case.vala @@ -42,10 +42,57 @@ public abstract class Folks.TestCase : Object LogAdaptor.set_up (); this._suite = new GLib.TestSuite (name); + this.private_bus_up (); + /* By default, no backend is allowed. Subclasses must override. */ Environment.set_variable ("FOLKS_BACKENDS_ALLOWED", "", true); } + /** + * A private D-Bus session, normally created by private_bus_up() + * from the constructor. + * + * This is per-process, not per-test, because the session bus's + * address is frequently treated as process-global (for instance, + * libdbus will cache a single session bus connection indefinitely). + */ + public GLib.TestDBus? test_dbus = null; + + /** + * If true, libraries involved in this test use dbus-1 (or dbus-glib-1) + * so we need to turn off its exit-on-disconnect feature. + * + * FIXME: when our dependencies stop needing this, this whole feature + * can be removed (GNOME#696177). + */ + public virtual bool uses_dbus_1 + { + get + { + return false; + } + } + + /** + * Start the temporary D-Bus session. + * + * This is per-process, not per-test, for the reasons mentioned for + * //test_dbus//. + */ + public virtual void private_bus_up () + { + this.test_dbus = new GLib.TestDBus (GLib.TestDBusFlags.NONE); + var test_dbus = (!) this.test_dbus; + + test_dbus.up (); + + /* Tell subprocesses that we're running in a private D-Bus + * session, so certain operations that would otherwise be dangerous + * are OK. */ + Environment.set_variable ("FOLKS_TESTS_SANDBOXED_DBUS", "no-services", + true); + } + public void register () { TestSuite.get_root ().add_suite (this._suite); @@ -81,6 +128,8 @@ public abstract class Folks.TestCase : Object { } + internal extern static void _dbus_1_set_no_exit_on_disconnect (); + /** * Clean up after all tests. If you have more than one test case, this * will be called once, the last time only. It should undo the @@ -94,6 +143,14 @@ public abstract class Folks.TestCase : Object */ public virtual void final_tear_down () { + if (this.uses_dbus_1) + TestCase._dbus_1_set_no_exit_on_disconnect (); + + if (this.test_dbus != null) + { + ((!) this.test_dbus).down (); + this.test_dbus = null; + } } ~TestCase () diff --git a/tests/lib/tracker/test-case.vala b/tests/lib/tracker/test-case.vala index d49edf6..b4dfa5c 100644 --- a/tests/lib/tracker/test-case.vala +++ b/tests/lib/tracker/test-case.vala @@ -63,6 +63,12 @@ public class TrackerTest.TestCase : Folks.TestCase this.tracker_backend = new TrackerTest.Backend (); } + public override void private_bus_up () + { + /* Don't do anything. We're currently relying on + * being wrapped in with-session-bus-tracker.sh. */ + } + public override void tear_down () { if (this.tracker_backend != null) -- 2.7.4