gsubprocess: test environment a bit more
[platform/upstream/glib.git] / gio / tests / gdbus-test-codegen.c
index 3aaefbe..62c17e0 100644 (file)
@@ -13,9 +13,7 @@
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General
- * Public License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
  *
  * Author: David Zeuthen <davidz@redhat.com>
  */
@@ -93,7 +91,7 @@ on_handle_hello_world (FooiGenBar             *object,
                        gpointer                user_data)
 {
   gchar *response;
-  response = g_strdup_printf ("Word! You said `%s'. I'm Skeleton, btw!", greeting);
+  response = g_strdup_printf ("Word! You said '%s'. I'm Skeleton, btw!", greeting);
   foo_igen_bar_complete_hello_world (object, invocation, response);
   g_free (response);
   return TRUE;
@@ -120,7 +118,7 @@ on_handle_test_primitive_types (FooiGenBar            *object,
   gchar *s1;
   gchar *s2;
   gchar *s3;
-  s1 = g_strdup_printf ("Word! You said `%s'. Rock'n'roll!", val_string);
+  s1 = g_strdup_printf ("Word! You said '%s'. Rock'n'roll!", val_string);
   s2 = g_strdup_printf ("/modified%s", val_objpath);
   s3 = g_strdup_printf ("assgit%s", val_signature);
   foo_igen_bar_complete_test_primitive_types (object,
@@ -420,6 +418,16 @@ static FooiGenMethodThreads *exported_thread_object_1 = NULL;
 static FooiGenMethodThreads *exported_thread_object_2 = NULL;
 
 static void
+unexport_objects (void)
+{
+  g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_bar_object));
+  g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_bat_object));
+  g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_authorize_object));
+  g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_thread_object_1));
+  g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_thread_object_2));
+}
+
+static void
 on_bus_acquired (GDBusConnection *connection,
                  const gchar     *name,
                  gpointer         user_data)
@@ -532,6 +540,8 @@ on_bus_acquired (GDBusConnection *connection,
   exported_thread_object_1 = foo_igen_method_threads_skeleton_new ();
   g_dbus_interface_skeleton_set_flags (G_DBUS_INTERFACE_SKELETON (exported_thread_object_1),
                                        G_DBUS_INTERFACE_SKELETON_FLAGS_HANDLE_METHOD_INVOCATIONS_IN_THREAD);
+
+  g_assert (!g_dbus_interface_skeleton_has_connection (G_DBUS_INTERFACE_SKELETON (exported_thread_object_1), connection));
   g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (exported_thread_object_1),
                                     connection,
                                     "/method_threads_1",
@@ -541,6 +551,7 @@ on_bus_acquired (GDBusConnection *connection,
                     "handle-get-self",
                     G_CALLBACK (on_handle_get_self),
                     NULL);
+  g_assert_cmpint (g_dbus_interface_skeleton_get_flags (G_DBUS_INTERFACE_SKELETON (exported_thread_object_1)), ==, G_DBUS_INTERFACE_SKELETON_FLAGS_HANDLE_METHOD_INVOCATIONS_IN_THREAD);
 
   exported_thread_object_2 = foo_igen_method_threads_skeleton_new ();
   g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (exported_thread_object_2),
@@ -553,6 +564,8 @@ on_bus_acquired (GDBusConnection *connection,
                     G_CALLBACK (on_handle_get_self),
                     NULL);
 
+  g_assert_cmpint (g_dbus_interface_skeleton_get_flags (G_DBUS_INTERFACE_SKELETON (exported_thread_object_2)), ==, G_DBUS_INTERFACE_SKELETON_FLAGS_NONE);
+
   method_handler_thread = g_thread_self ();
 }
 
@@ -567,9 +580,7 @@ on_name_acquired (GDBusConnection *connection,
 
   g_thread_new ("check-proxies",
                 check_proxies_in_thread,
-                loop,
-                TRUE,
-                NULL);
+                loop);
 }
 
 static void
@@ -686,6 +697,10 @@ static void
 check_bar_proxy (FooiGenBar *proxy,
                  GMainLoop  *thread_loop)
 {
+  const gchar *array_of_strings[3] = {"one", "two", NULL};
+  const gchar *array_of_strings_2[3] = {"one2", "two2", NULL};
+  const gchar *array_of_objpaths[3] = {"/one", "/one/two", NULL};
+  const gchar *array_of_bytestrings[3] = {"one\xff", "two\xff", NULL};
   guchar ret_val_byte;
   gboolean ret_val_boolean;
   gint16 ret_val_int16;
@@ -731,6 +746,9 @@ check_bar_proxy (FooiGenBar *proxy,
   gchar *val_finally_normal_name;
   GVariant *v;
   gchar *s;
+  const gchar *const *read_as;
+  const gchar *const *read_as2;
+  const gchar *const *read_as3;
 
   data = g_new0 (ClientData, 1);
   data->thread_loop = thread_loop;
@@ -825,10 +843,6 @@ check_bar_proxy (FooiGenBar *proxy,
   /* Try setting properties that requires memory management. This
    * is to exercise the paths that frees the references.
    */
-  const gchar *array_of_strings[3] = {"one", "two", NULL};
-  const gchar *array_of_strings_2[3] = {"one2", "two2", NULL};
-  const gchar *array_of_objpaths[3] = {"/one", "/one/two", NULL};
-  const gchar *array_of_bytestrings[3] = {"one\xff", "two\xff", NULL};
 
   g_object_set (proxy,
                 "s", "a string",
@@ -926,9 +940,6 @@ check_bar_proxy (FooiGenBar *proxy,
    * updates on them works as well (See comment for "property vfuncs"
    * in gio/gdbus-codegen/codegen.py for details)
    */
-  const gchar *const *read_as;
-  const gchar *const *read_as2;
-  const gchar *const *read_as3;
   read_as = foo_igen_bar_get_as (proxy);
   read_as2 = foo_igen_bar_get_as (proxy);
   g_assert_cmpint (g_strv_length ((gchar **) read_as), ==, 2);
@@ -951,7 +962,7 @@ check_bar_proxy (FooiGenBar *proxy,
    * properties.
    *
    * On the first reception, y and i should both be increased by
-   * two. On the the second reception, only by one. The signal handler
+   * two. On the second reception, only by one. The signal handler
    * checks this.
    *
    * This also checks that _drain_notify() works.
@@ -1717,10 +1728,23 @@ on_object_proxy_removed (GDBusObjectManagerClient  *manager,
 }
 
 static void
+property_d_changed (GObject    *object,
+                   GParamSpec *pspec,
+                   gpointer    user_data)
+{
+  gboolean *changed = user_data;
+
+  *changed = TRUE;
+}
+
+static void
 om_check_property_and_signal_emission (GMainLoop  *loop,
                                        FooiGenBar *skeleton,
                                        FooiGenBar *proxy)
 {
+  gboolean d_changed = FALSE;
+  guint handler;
+
   /* First PropertiesChanged */
   g_assert_cmpint (foo_igen_bar_get_i (skeleton), ==, 0);
   g_assert_cmpint (foo_igen_bar_get_i (proxy), ==, 0);
@@ -1729,6 +1753,24 @@ om_check_property_and_signal_emission (GMainLoop  *loop,
   g_assert_cmpint (foo_igen_bar_get_i (skeleton), ==, 1);
   g_assert_cmpint (foo_igen_bar_get_i (proxy), ==, 1);
 
+  /* Double-check the gdouble case */
+  g_assert_cmpfloat (foo_igen_bar_get_d (skeleton), ==, 0.0);
+  g_assert_cmpfloat (foo_igen_bar_get_d (proxy), ==, 0.0);
+  foo_igen_bar_set_d (skeleton, 1.0);
+  _g_assert_property_notify (proxy, "d");
+
+  /* Verify that re-setting it to the same value doesn't cause a
+   * notify on the proxy, by taking advantage of the fact that
+   * notifications are serialized.
+   */
+  handler = g_signal_connect (proxy, "notify::d",
+                             G_CALLBACK (property_d_changed), &d_changed);
+  foo_igen_bar_set_d (skeleton, 1.0);
+  foo_igen_bar_set_i (skeleton, 2);
+  _g_assert_property_notify (proxy, "i");
+  g_assert (d_changed == FALSE);
+  g_signal_handler_disconnect (proxy, handler);
+
   /* Then just a regular signal */
   foo_igen_bar_emit_another_signal (skeleton, "word");
   _g_assert_signal_received (proxy, "another-signal");
@@ -1737,23 +1779,27 @@ om_check_property_and_signal_emission (GMainLoop  *loop,
 static void
 check_object_manager (void)
 {
-  FooiGenObjectSkeleton *o;
-  FooiGenObjectSkeleton *o2;
-  FooiGenObjectSkeleton *o3;
+  FooiGenObjectSkeleton *o = NULL;
+  FooiGenObjectSkeleton *o2 = NULL;
+  FooiGenObjectSkeleton *o3 = NULL;
   GDBusInterfaceSkeleton *i;
   GDBusConnection *c;
-  GDBusObjectManagerServer *manager;
+  GDBusObjectManagerServer *manager = NULL;
   GDBusNodeInfo *info;
   GError *error;
   GMainLoop *loop;
-  OMData *om_data;
-  guint om_signal_id;
-  GDBusObjectManager *pm;
+  OMData *om_data = NULL;
+  guint om_signal_id = -1;
+  GDBusObjectManager *pm = NULL;
   GList *object_proxies;
   GList *proxies;
   GDBusObject *op;
   GDBusProxy *p;
   FooiGenBar *bar_skeleton;
+  GDBusInterface *iface;
+  gchar *path, *name, *name_owner;
+  GDBusConnection *c2;
+  GDBusObjectManagerClientFlags flags;
 
   loop = g_main_loop_new (NULL, FALSE);
 
@@ -1797,8 +1843,18 @@ check_object_manager (void)
   g_assert (pm == NULL);
 
   manager = g_dbus_object_manager_server_new ("/managed");
+
+  g_assert (g_dbus_object_manager_server_get_connection (manager) == NULL);
+
   g_dbus_object_manager_server_set_connection (manager, c);
 
+  g_assert_cmpstr (g_dbus_object_manager_get_object_path (G_DBUS_OBJECT_MANAGER (manager)), ==, "/managed");
+  g_object_get (manager, "object-path", &path, "connection", &c2, NULL);
+  g_assert_cmpstr (path, ==, "/managed");
+  g_assert (c2 == c);
+  g_free (path);
+  g_clear_object (&c2);
+
   /* Check that the manager object is visible */
   info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed", loop);
   g_assert_cmpint (count_interfaces (info), ==, 4); /* ObjectManager + Properties,Introspectable,Peer */
@@ -1810,7 +1866,7 @@ check_object_manager (void)
   om_check_get_all (c, loop,
                     "(@a{oa{sa{sv}}} {},)");
 
-  /* Now try to create the the proxy manager again - this time it should work */
+  /* Now try to create the proxy manager again - this time it should work */
   error = NULL;
   foo_igen_object_manager_client_new (c,
                                       G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
@@ -1822,7 +1878,7 @@ check_object_manager (void)
   g_main_loop_run (loop);
   error = NULL;
   pm = foo_igen_object_manager_client_new_finish (om_res, &error);
-  g_object_unref (om_res);
+  g_clear_object (&om_res);
   g_assert_no_error (error);
   g_assert (pm != NULL);
   g_signal_connect (pm,
@@ -1833,6 +1889,25 @@ check_object_manager (void)
                     "object-removed",
                     G_CALLBACK (on_object_proxy_removed),
                     om_data);
+
+  g_assert_cmpstr (g_dbus_object_manager_get_object_path (G_DBUS_OBJECT_MANAGER (pm)), ==, "/managed");
+  g_object_get (pm,
+                "object-path", &path,
+                "connection", &c2,
+                "name", &name,
+                "name-owner", &name_owner,
+                "flags", &flags,
+                NULL);
+  g_assert_cmpstr (path, ==, "/managed");
+  g_assert_cmpstr (name, ==, g_dbus_connection_get_unique_name (c));
+  g_assert_cmpstr (name_owner, ==, g_dbus_connection_get_unique_name (c));
+  g_assert_cmpint (flags, ==, G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE);
+  g_assert (c2 == c);
+  g_free (path);
+  g_clear_object (&c2);
+  g_free (name);
+  g_free (name_owner);
+
   /* ... check there are no object proxies yet */
   object_proxies = g_dbus_object_manager_get_objects (pm);
   g_assert (object_proxies == NULL);
@@ -1848,18 +1923,25 @@ check_object_manager (void)
   g_assert_cmpint (G_OBJECT (o)->ref_count, ==, 1);
   g_assert (g_dbus_interface_get_object (G_DBUS_INTERFACE (i)) == G_DBUS_OBJECT (o));
   g_assert_cmpint (G_OBJECT (o)->ref_count, ==, 1);
-  g_assert_cmpint (G_OBJECT (o)->ref_count, ==, 1);
   foo_igen_object_skeleton_set_bar (o, NULL);
   g_assert (g_dbus_interface_get_object (G_DBUS_INTERFACE (i)) == NULL);
   g_assert_cmpint (G_OBJECT (o)->ref_count, ==, 1);
   foo_igen_object_skeleton_set_bar (o, FOO_IGEN_BAR (i));
   g_assert (g_dbus_interface_get_object (G_DBUS_INTERFACE (i)) == G_DBUS_OBJECT (o));
   g_assert_cmpint (G_OBJECT (o)->ref_count, ==, 1);
+
+  o2 = FOO_IGEN_OBJECT_SKELETON (g_dbus_interface_dup_object (G_DBUS_INTERFACE (i)));
+  g_assert (G_DBUS_OBJECT (o2) == G_DBUS_OBJECT (o));
+  g_assert_cmpint (G_OBJECT (o2)->ref_count, ==, 2);
+  g_clear_object (&o2);
+
   g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (o));
 
   /* ... check we get the InterfacesAdded signal */
   om_data->state = 1;
+
   g_main_loop_run (om_data->loop);
+
   g_assert_cmpint (om_data->state, ==, 2);
   g_assert_cmpint (om_data->num_object_proxy_added_signals, ==, 1);
   g_assert_cmpint (om_data->num_object_proxy_removed_signals, ==, 0);
@@ -1871,6 +1953,18 @@ check_object_manager (void)
   g_assert (has_interface (info, "org.project.Bar"));
   g_dbus_node_info_unref (info);
 
+  /* Also check g_dbus_object_manager_get_interface */
+  iface = g_dbus_object_manager_get_interface (G_DBUS_OBJECT_MANAGER (manager), "/managed/first", "org.project.Bar");
+  g_assert (iface != NULL);
+  g_clear_object (&iface);
+  iface = g_dbus_object_manager_get_interface (G_DBUS_OBJECT_MANAGER (manager), "/managed/first", "org.project.Bat");
+  g_assert (iface == NULL);
+  iface = g_dbus_object_manager_get_interface (G_DBUS_OBJECT_MANAGER (pm), "/managed/first", "org.project.Bar");
+  g_assert (iface != NULL);
+  g_clear_object (&iface);
+  iface = g_dbus_object_manager_get_interface (G_DBUS_OBJECT_MANAGER (pm), "/managed/first", "org.project.Bat");
+  g_assert (iface == NULL);
+
   /* Now, check adding the same interface replaces the existing one */
   foo_igen_object_skeleton_set_bar (o, FOO_IGEN_BAR (i));
   /* ... check we get the InterfacesRemoved */
@@ -1887,7 +1981,7 @@ check_object_manager (void)
   g_assert_cmpint (count_interfaces (info), ==, 4); /* Bar + Properties,Introspectable,Peer */
   g_assert (has_interface (info, "org.project.Bar"));
   g_dbus_node_info_unref (info);
-  g_object_unref (i);
+  g_clear_object (&i);
 
   /* check adding an interface of same type (but not same object) replaces the existing one */
   i = G_DBUS_INTERFACE_SKELETON (foo_igen_bar_skeleton_new ());
@@ -1905,12 +1999,12 @@ check_object_manager (void)
   g_assert_cmpint (count_interfaces (info), ==, 4); /* Bar + Properties,Introspectable,Peer */
   g_assert (has_interface (info, "org.project.Bar"));
   g_dbus_node_info_unref (info);
-  g_object_unref (i);
+  g_clear_object (&i);
 
   /* check adding an interface of another type doesn't replace the existing one */
   i = G_DBUS_INTERFACE_SKELETON (foo_igen_bat_skeleton_new ());
   foo_igen_object_skeleton_set_bat (o, FOO_IGEN_BAT (i));
-  g_object_unref (i);
+  g_clear_object (&i);
   /* ... check we get the InterfacesAdded */
   om_data->state = 11;
   g_main_loop_run (om_data->loop);
@@ -1971,7 +2065,7 @@ check_object_manager (void)
   /* and add an interface again */
   i = G_DBUS_INTERFACE_SKELETON (foo_igen_com_acme_coyote_skeleton_new ());
   foo_igen_object_skeleton_set_com_acme_coyote (o, FOO_IGEN_COM_ACME_COYOTE (i));
-  g_object_unref (i);
+  g_clear_object (&i);
   /* ... check we get the InterfacesAdded */
   om_data->state = 17;
   g_main_loop_run (om_data->loop);
@@ -1997,10 +2091,10 @@ check_object_manager (void)
   i = G_DBUS_INTERFACE_SKELETON (foo_igen_bar_skeleton_new ());
   bar_skeleton = FOO_IGEN_BAR (i); /* save for later test */
   foo_igen_object_skeleton_set_bar (o2, FOO_IGEN_BAR (i));
-  g_object_unref (i);
+  g_clear_object (&i);
   i = G_DBUS_INTERFACE_SKELETON (foo_igen_bat_skeleton_new ());
   foo_igen_object_skeleton_set_bat (o2, FOO_IGEN_BAT (i));
-  g_object_unref (i);
+  g_clear_object (&i);
   /* ... add it */
   g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (o2));
   /* ... check we get the InterfacesAdded with _two_ interfaces */
@@ -2027,6 +2121,7 @@ check_object_manager (void)
   info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed", loop);
   g_assert_cmpint (count_interfaces (info), ==, 0); /* nothing */
   g_dbus_node_info_unref (info);
+
   g_dbus_object_manager_server_set_connection (manager, c);
   om_check_get_all (c, loop,
                     "({objectpath '/managed/first': {'com.acme.Coyote': {'Mood': <''>}}, '/managed/second': {'org.project.Bar': {'y': <byte 0x00>, 'b': <false>, 'n': <int16 0>, 'q': <uint16 0>, 'i': <0>, 'u': <uint32 0>, 'x': <int64 0>, 't': <uint64 0>, 'd': <0.0>, 's': <''>, 'o': <objectpath '/'>, 'g': <signature ''>, 'ay': <b''>, 'as': <@as []>, 'aay': <@aay []>, 'ao': <@ao []>, 'ag': <@ag []>, 'FinallyNormalName': <''>, 'ReadonlyProperty': <''>, 'unset_i': <0>, 'unset_d': <0.0>, 'unset_s': <''>, 'unset_o': <objectpath '/'>, 'unset_g': <signature ''>, 'unset_ay': <b''>, 'unset_as': <@as []>, 'unset_ao': <@ao []>, 'unset_ag': <@ag []>, 'unset_struct': <(0, 0.0, '', objectpath '/', signature '', @ay [], @as [], @ao [], @ag [])>}, 'org.project.Bat': {'force_i': <0>, 'force_s': <''>, 'force_ay': <@ay []>, 'force_struct': <(0,)>}}},)");
@@ -2037,24 +2132,23 @@ check_object_manager (void)
    */
   object_proxies = g_dbus_object_manager_get_objects (pm);
   g_assert (g_list_length (object_proxies) == 2);
-  g_list_foreach (object_proxies, (GFunc) g_object_unref, NULL);
-  g_list_free (object_proxies);
+  g_list_free_full (object_proxies, g_object_unref);
   op = g_dbus_object_manager_get_object (pm, "/managed/first");
   g_assert (op != NULL);
   g_assert (FOO_IGEN_IS_OBJECT_PROXY (op));
   g_assert_cmpstr (g_dbus_object_get_object_path (op), ==, "/managed/first");
   proxies = g_dbus_object_get_interfaces (op);
   g_assert (g_list_length (proxies) == 1);
-  g_list_foreach (proxies, (GFunc) g_object_unref, NULL);
-  g_list_free (proxies);
+  g_list_free_full (proxies, g_object_unref);
   p = G_DBUS_PROXY (foo_igen_object_get_com_acme_coyote (FOO_IGEN_OBJECT (op)));
   g_assert (p != NULL);
   g_assert_cmpint (G_TYPE_FROM_INSTANCE (p), ==, FOO_IGEN_TYPE_COM_ACME_COYOTE_PROXY);
   g_assert (g_type_is_a (G_TYPE_FROM_INSTANCE (p), FOO_IGEN_TYPE_COM_ACME_COYOTE));
-  g_object_unref (p);
+  g_clear_object (&p);
   p = (GDBusProxy *) g_dbus_object_get_interface (op, "org.project.NonExisting");
   g_assert (p == NULL);
-  g_object_unref (op);
+  g_clear_object (&op);
+
   /* -- */
   op = g_dbus_object_manager_get_object (pm, "/managed/second");
   g_assert (op != NULL);
@@ -2062,13 +2156,12 @@ check_object_manager (void)
   g_assert_cmpstr (g_dbus_object_get_object_path (op), ==, "/managed/second");
   proxies = g_dbus_object_get_interfaces (op);
   g_assert (g_list_length (proxies) == 2);
-  g_list_foreach (proxies, (GFunc) g_object_unref, NULL);
-  g_list_free (proxies);
+  g_list_free_full (proxies, g_object_unref);
   p = G_DBUS_PROXY (foo_igen_object_get_bat (FOO_IGEN_OBJECT (op)));
   g_assert (p != NULL);
   g_assert_cmpint (G_TYPE_FROM_INSTANCE (p), ==, FOO_IGEN_TYPE_BAT_PROXY);
   g_assert (g_type_is_a (G_TYPE_FROM_INSTANCE (p), FOO_IGEN_TYPE_BAT));
-  g_object_unref (p);
+  g_clear_object (&p);
   p = G_DBUS_PROXY (foo_igen_object_get_bar (FOO_IGEN_OBJECT (op)));
   g_assert (p != NULL);
   g_assert_cmpint (G_TYPE_FROM_INSTANCE (p), ==, FOO_IGEN_TYPE_BAR_PROXY);
@@ -2077,10 +2170,10 @@ check_object_manager (void)
    *     and property changes...
    */
   om_check_property_and_signal_emission (loop, bar_skeleton, FOO_IGEN_BAR (p));
-  g_object_unref (p);
+  g_clear_object (&p);
   p = (GDBusProxy *) g_dbus_object_get_interface (op, "org.project.NonExisting");
   g_assert (p == NULL);
-  g_object_unref (op);
+  g_clear_object (&op);
 
   /* -------------------------------------------------- */
 
@@ -2103,7 +2196,6 @@ check_object_manager (void)
   /* Check GetManagedObjects() again */
   om_check_get_all (c, loop,
                     "({objectpath '/managed/first': {'com.acme.Coyote': {'Mood': <''>}}},)");
-
   /* -------------------------------------------------- */
 
   /* Check that export_uniquely() works */
@@ -2112,7 +2204,7 @@ check_object_manager (void)
   i = G_DBUS_INTERFACE_SKELETON (foo_igen_com_acme_coyote_skeleton_new ());
   foo_igen_com_acme_coyote_set_mood (FOO_IGEN_COM_ACME_COYOTE (i), "indifferent");
   foo_igen_object_skeleton_set_com_acme_coyote (o3, FOO_IGEN_COM_ACME_COYOTE (i));
-  g_object_unref (i);
+  g_clear_object (&i);
   g_dbus_object_manager_server_export_uniquely (manager, G_DBUS_OBJECT_SKELETON (o3));
   /* ... check we get the InterfacesAdded signal */
   om_data->state = 200;
@@ -2124,21 +2216,32 @@ check_object_manager (void)
 
   //g_main_loop_run (loop); /* TODO: tmp */
 
-  g_main_loop_unref (loop);
-
-  g_dbus_connection_signal_unsubscribe (c, om_signal_id);
-  g_object_unref (o3);
-  g_object_unref (o2);
-  g_object_unref (o);
-  g_object_unref (manager);
-  g_assert_cmpint (g_signal_handlers_disconnect_by_func (pm,
-                                                         G_CALLBACK (on_object_proxy_added),
-                                                         om_data), ==, 1);
-  g_assert_cmpint (g_signal_handlers_disconnect_by_func (pm,
-                                                         G_CALLBACK (on_object_proxy_removed),
-                                                         om_data), ==, 1);
-  g_object_unref (pm);
-  g_object_unref (c);
+  /* Clean up objects */
+  g_assert (g_dbus_object_manager_server_unexport (manager, "/managed/first_1"));
+  //g_assert (g_dbus_object_manager_server_unexport (manager, "/managed/second"));
+  g_assert (g_dbus_object_manager_server_unexport (manager, "/managed/first"));
+  g_assert_cmpint (g_list_length (g_dbus_object_manager_get_objects (G_DBUS_OBJECT_MANAGER (manager))), ==, 0);
+
+  if (loop != NULL)
+    g_main_loop_unref (loop);
+
+  if (om_signal_id != -1)
+    g_dbus_connection_signal_unsubscribe (c, om_signal_id);
+  g_clear_object (&o3);
+  g_clear_object (&o2);
+  g_clear_object (&o);
+  g_clear_object (&manager);
+  if (pm != NULL)
+    {
+      g_assert_cmpint (g_signal_handlers_disconnect_by_func (pm,
+                                                             G_CALLBACK (on_object_proxy_added),
+                                                             om_data), ==, 1);
+      g_assert_cmpint (g_signal_handlers_disconnect_by_func (pm,
+                                                             G_CALLBACK (on_object_proxy_removed),
+                                                             om_data), ==, 1);
+      g_clear_object (&pm);
+    }
+  g_clear_object (&c);
 
   g_free (om_data);
 }
@@ -2169,6 +2272,8 @@ test_object_manager (void)
   /* uncomment to keep the service around (to e.g. introspect it) */
   /* g_main_loop_run (loop); */
 
+  unexport_objects ();
+
   g_bus_unown_name (id);
   g_main_loop_unref (loop);
 }
@@ -2214,36 +2319,43 @@ test_interface_stability (void)
 
 /* ---------------------------------------------------------------------------------------------------- */
 
-int
-main (int   argc,
-      char *argv[])
+/* property naming
+ *
+ * - check that a property with name "Type" is mapped into g-name "type"
+ *   with C accessors get_type_ (to avoid clashing with the GType accessor)
+ *   and set_type_ (for symmetri)
+ *   (see https://bugzilla.gnome.org/show_bug.cgi?id=679473 for details)
+ *
+ * - (could add more tests here)
+ */
+
+static void
+test_property_naming (void)
 {
-  gint ret;
+  gpointer c_getter_name = foo_igen_naming_get_type_;
+  gpointer c_setter_name = foo_igen_naming_set_type_;
+  FooiGenNaming *skel;
 
-  g_type_init ();
-  g_test_init (&argc, &argv, NULL);
+  (void) c_getter_name;
+  (void) c_setter_name;
 
-  /* all the tests use a session bus with a well-known address that we can bring up and down
-   * using session_bus_up() and session_bus_down().
-   */
-  g_unsetenv ("DISPLAY");
-  g_setenv ("DBUS_SESSION_BUS_ADDRESS", session_bus_get_temporary_address (), TRUE);
+  skel = foo_igen_naming_skeleton_new ();
+  g_assert (g_object_class_find_property (G_OBJECT_GET_CLASS (skel), "type") != NULL);
+  g_object_unref (skel);
+}
 
-  session_bus_up ();
+/* ---------------------------------------------------------------------------------------------------- */
 
-  /* TODO: wait a bit for the bus to come up.. ideally session_bus_up() won't return
-   * until one can connect to the bus but that's not how things work right now
-   */
-  usleep (500 * 1000);
+int
+main (int   argc,
+      char *argv[])
+{
+  g_test_init (&argc, &argv, NULL);
 
   g_test_add_func ("/gdbus/codegen/annotations", test_annotations);
   g_test_add_func ("/gdbus/codegen/interface_stability", test_interface_stability);
   g_test_add_func ("/gdbus/codegen/object-manager", test_object_manager);
+  g_test_add_func ("/gdbus/codegen/property-naming", test_property_naming);
 
-  ret = g_test_run();
-
-  /* tear down bus */
-  session_bus_down ();
-
-  return ret;
+  return session_bus_run ();
 }