cleanup
[platform/upstream/glib.git] / gio / gtestdbus.c
index 53b958d..4af270b 100644 (file)
@@ -338,13 +338,13 @@ _g_test_watcher_remove_pid (GPid pid)
  * code tree.
  *
  * The first thing you will need is a separate service description file for the
- * D-Bus daemon. Typically a <filename>services</filename> subdirectory of
- * your <filename>tests</filename> directory is a good place to put this file.
+ * D-Bus daemon. Typically a `services` subdirectory of your `tests` directory
+ * is a good place to put this file.
  *
  * The service file should list your service along with an absolute path to the
  * uninstalled service executable in your source tree. Using autotools we would
- * achieve this by adding a file such as <filename>my-server.service.in</filename>
- * in the services directory and have it processed by configure.
+ * achieve this by adding a file such as `my-server.service.in` in the services
+ * directory and have it processed by configure.
  * |[
  *     [D-BUS Service]
  *     Name=org.gtk.GDBus.Examples.ObjectManager
@@ -360,13 +360,10 @@ _g_test_watcher_remove_pid (GPid pid)
  *     Once you have a service definition file which is local to your source tree,
  * you can proceed to set up a GTest fixture using the #GTestDBus scaffolding.
  *
- * Here is an example of a test fixture for D-Bus services:
- * <programlisting>
- * <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" parse="text" href="../../../../gio/tests/gdbus-test-fixture.c">
- * <xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback>
- * </xi:include>
- * </programlisting>
- * 
+ * An example of a test fixture for D-Bus services can be found
+ * here:
+ * [gdbus-test-fixture.c](https://git.gnome.org/browse/glib/tree/gio/tests/gdbus-test-fixture.c)
+ *
  * Note that these examples only deal with isolating the D-Bus aspect of your
  * service. To successfully run isolated unit tests on your service you may need
  * some additional modifications to your test case fixture. For example; if your
@@ -375,12 +372,14 @@ _g_test_watcher_remove_pid (GPid pid)
  * and schema files are not yet installed, or worse; there is an older version of the
  * schema file sitting in the install location).
  *
- * Most of the time we can work around these obstacles using the environment. Since the
- * environment is inherited by the D-Bus daemon created by #GTestDBus and then in turn
- * inherited by any services the D-Bus daemon activates, using the setup routine for your
- * fixture is a practical place to help sandbox your runtime environment. For the rather
- * typical GSettings case we can work around this by setting <envar>GSETTINGS_SCHEMA_DIR</envar> to the
- * in tree directory holding your schemas in the above fixture_setup() routine.
+ * Most of the time we can work around these obstacles using the
+ * environment. Since the environment is inherited by the D-Bus daemon
+ * created by #GTestDBus and then in turn inherited by any services the
+ * D-Bus daemon activates, using the setup routine for your fixture is
+ * a practical place to help sandbox your runtime environment. For the
+ * rather typical GSettings case we can work around this by setting
+ * `GSETTINGS_SCHEMA_DIR` to the in tree directory holding your schemas
+ * in the above fixture_setup() routine.
  *
  * The GSettings schemas need to be locally pre-compiled for this to work. This can be achieved
  * by compiling the schemas locally as a step before running test cases, an autotools setup might
@@ -419,6 +418,7 @@ struct _GTestDBusPrivate
   GTestDBusFlags flags;
   GPtrArray *service_dirs;
   GPid bus_pid;
+  gint bus_stdout_fd;
   gchar *bus_address;
   gboolean up;
 };
@@ -567,13 +567,12 @@ write_config_file (GTestDBus *self)
       "  </policy>\n"
       "</busconfig>\n");
 
+  close (fd);
   g_file_set_contents (path, contents->str, contents->len, &error);
   g_assert_no_error (error);
 
   g_string_free (contents, TRUE);
 
-  close (fd);
-
   return path;
 }
 
@@ -583,8 +582,8 @@ start_daemon (GTestDBus *self)
   const gchar *argv[] = {"dbus-daemon", "--print-address", "--config-file=foo", NULL};
   gchar *config_path;
   gchar *config_arg;
-  gint stdout_fd;
   GIOChannel *channel;
+  gint stdout_fd2;
   gsize termpos;
   GError *error = NULL;
 
@@ -609,15 +608,21 @@ start_daemon (GTestDBus *self)
                             NULL,
                             &self->priv->bus_pid,
                             NULL,
-                            &stdout_fd,
+                            &self->priv->bus_stdout_fd,
                             NULL,
                             &error);
   g_assert_no_error (error);
 
   _g_test_watcher_add_pid (self->priv->bus_pid);
 
-  /* Read bus address from daemon' stdout */
-  channel = g_io_channel_unix_new (stdout_fd);
+  /* Read bus address from daemon' stdout. We have to be careful to avoid
+   * closing the FD, as it is passed to any D-Bus service activated processes,
+   * and if we close it, they will get a SIGPIPE and die when they try to write
+   * to their stdout. */
+  stdout_fd2 = dup (self->priv->bus_stdout_fd);
+  g_assert_cmpint (stdout_fd2, >=, 0);
+  channel = g_io_channel_unix_new (stdout_fd2);
+
   g_io_channel_read_line (channel, &self->priv->bus_address, NULL,
       &termpos, &error);
   g_assert_no_error (error);
@@ -661,6 +666,8 @@ stop_daemon (GTestDBus *self)
   _g_test_watcher_remove_pid (self->priv->bus_pid);
   g_spawn_close_pid (self->priv->bus_pid);
   self->priv->bus_pid = 0;
+  close (self->priv->bus_stdout_fd);
+  self->priv->bus_stdout_fd = -1;
 
   g_free (self->priv->bus_address);
   self->priv->bus_address = NULL;