[folks] Add infrastructure to run tests under GTestDBus
- From: Simon McVittie <smcv src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [folks] Add infrastructure to run tests under GTestDBus
- Date: Wed, 20 Mar 2013 11:52:39 +0000 (UTC)
commit 49bc02747babed6d94119b2222c5072a9716d4af
Author: Simon McVittie <simon mcvittie collabora co uk>
Date: Wed Mar 20 10:36:26 2013 +0000
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 <philip tecnocode co uk>
[added comments about the undesirable dbus-1 dependency -smcv]
Signed-off-by: Simon McVittie <simon mcvittie collabora co uk>
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 deletions(-)
---
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 <glib.h>
#include <glib-object.h>
+#include <dbus/dbus.h>
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)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]