Imported Upstream version 2.53.3
[platform/upstream/glib.git] / gio / tests / gdbus-proxy.c
index cdaa2ba..fff1f48 100644 (file)
@@ -5,7 +5,7 @@
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
+ * version 2.1 of the License, or (at your option) any later version.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -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>
  */
@@ -168,6 +166,8 @@ test_properties (GDBusProxy *proxy)
   GVariant *variant2;
   GVariant *result;
   gchar **names;
+  gchar *name_owner;
+  GDBusProxy *proxy2;
 
   error = NULL;
 
@@ -296,8 +296,6 @@ test_properties (GDBusProxy *proxy)
   g_assert (variant == NULL);
 
   /* Now test that G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES works - we need a new proxy for that */
-  gchar *name_owner;
-  GDBusProxy *proxy2;
   error = NULL;
   proxy2 = g_dbus_proxy_new_sync (g_dbus_proxy_get_connection (proxy),
                                   G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES,
@@ -569,7 +567,7 @@ test_bogus_property (GDBusProxy *proxy)
 static const gchar *frob_dbus_interface_xml =
   "<node>"
   "  <interface name='com.example.Frob'>"
-  /* PairReturn() is deliberately different from gdbus-testserver.py's definition */
+  /* PairReturn() is deliberately different from gdbus-testserver's definition */
   "    <method name='PairReturn'>"
   "      <arg type='u' name='somenumber' direction='in'/>"
   "      <arg type='s' name='somestring' direction='out'/>"
@@ -583,9 +581,9 @@ static const gchar *frob_dbus_interface_xml =
   "    </method>"
   /* We deliberately only mention a single property here */
   "    <property name='y' type='y' access='readwrite'/>"
-  /* The 'i' property is deliberately different from gdbus-testserver.py's definition */
+  /* The 'i' property is deliberately different from gdbus-testserver's definition */
   "    <property name='i' type='u' access='readwrite'/>"
-  /* ::TestSignal2 is deliberately different from gdbus-testserver.py's definition */
+  /* ::TestSignal2 is deliberately different from gdbus-testserver's definition */
   "    <signal name='TestSignal2'>"
   "      <arg type='u' name='somenumber'/>"
   "    </signal>"
@@ -620,12 +618,10 @@ test_expected_interface (GDBusProxy *proxy)
   if (g_test_undefined ())
     {
       /* Also check that we complain if setting a cached property of the wrong type */
-      if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT | G_TEST_TRAP_SILENCE_STDERR))
-        {
-          g_dbus_proxy_set_cached_property (proxy, "y", g_variant_new_string ("error_me_out!"));
-        }
-      g_test_trap_assert_stderr ("*Trying to set property y of type s but according to the expected interface the type is y*");
-      g_test_trap_assert_failed();
+      g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING,
+                             "*Trying to set property y of type s but according to the expected interface the type is y*");
+      g_dbus_proxy_set_cached_property (proxy, "y", g_variant_new_string ("error_me_out!"));
+      g_test_assert_expected_messages ();
     }
 
   /* this should work, however (since the type is correct) */
@@ -636,12 +632,10 @@ test_expected_interface (GDBusProxy *proxy)
       /* Try to get the value of a property where the type we expect is different from
        * what we have in our cache (e.g. what the service returned)
        */
-      if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT | G_TEST_TRAP_SILENCE_STDERR))
-        {
-          value = g_dbus_proxy_get_cached_property (proxy, "i");
-        }
-      g_test_trap_assert_stderr ("*Trying to get property i with type i but according to the expected interface the type is u*");
-      g_test_trap_assert_failed();
+      g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING,
+                             "*Trying to get property i with type i but according to the expected interface the type is u*");
+      value = g_dbus_proxy_get_cached_property (proxy, "i");
+      g_test_assert_expected_messages ();
     }
 
   /* Even if a property does not exist in expected_interface, looking it
@@ -733,14 +727,40 @@ test_basic (GDBusProxy *proxy)
 }
 
 static void
+kill_test_service (GDBusConnection *connection)
+{
+#ifdef G_OS_UNIX
+  guint pid;
+  GVariant *ret;
+  GError *error = NULL;
+  const gchar *name = "com.example.TestService";
+
+  ret = g_dbus_connection_call_sync (connection,
+                                     "org.freedesktop.DBus",
+                                     "/org/freedesktop/DBus",
+                                     "org.freedesktop.DBus",
+                                     "GetConnectionUnixProcessID",
+                                     g_variant_new ("(s)", name),
+                                     NULL,
+                                     G_DBUS_CALL_FLAGS_NONE,
+                                     -1,
+                                     NULL,
+                                     &error);
+  g_variant_get (ret, "(u)", &pid);
+  g_variant_unref (ret);
+  kill (pid, SIGTERM);
+#else
+  g_warning ("Can't kill com.example.TestService");
+#endif
+}
+
+static void
 test_proxy (void)
 {
   GDBusProxy *proxy;
   GDBusConnection *connection;
   GError *error;
 
-  session_bus_up ();
-
   error = NULL;
   connection = g_bus_get_sync (G_BUS_TYPE_SESSION,
                                NULL,
@@ -758,7 +778,7 @@ test_proxy (void)
   g_assert_no_error (error);
 
   /* this is safe; testserver will exit once the bus goes away */
-  g_assert (g_spawn_command_line_async (SRCDIR "/gdbus-testserver.py", NULL));
+  g_assert (g_spawn_command_line_async (g_test_get_filename (G_TEST_BUILT, "gdbus-testserver", NULL), NULL));
 
   _g_assert_property_notify (proxy, "g-name-owner");
 
@@ -769,6 +789,7 @@ test_proxy (void)
   test_expected_interface (proxy);
 
   g_object_unref (proxy);
+  kill_test_service (connection);
   g_object_unref (connection);
 }
 
@@ -786,13 +807,23 @@ proxy_ready (GObject      *source,
   proxy = g_dbus_proxy_new_for_bus_finish (result, &error);
   g_assert_no_error (error);
 
+  _g_assert_property_notify (proxy, "g-name-owner");
+
   test_basic (proxy);
   test_methods (proxy);
   test_properties (proxy);
   test_signals (proxy);
   test_expected_interface (proxy);
 
+  kill_test_service (g_dbus_proxy_get_connection (proxy));
   g_object_unref (proxy);
+  g_main_loop_quit (loop);
+}
+
+static gboolean
+fail_test (gpointer user_data)
+{
+  g_assert_not_reached ();
 }
 
 static void
@@ -807,6 +838,12 @@ test_async (void)
                             NULL, /* GCancellable */
                             proxy_ready,
                             NULL);
+
+  /* this is safe; testserver will exit once the bus goes away */
+  g_assert (g_spawn_command_line_async (g_test_get_filename (G_TEST_BUILT, "gdbus-testserver", NULL), NULL));
+
+  g_timeout_add (10000, fail_test, NULL);
+  g_main_loop_run (loop);
 }
 
 static void
@@ -831,12 +868,6 @@ test_no_properties (void)
   g_object_unref (proxy);
 }
 
-static gboolean
-fail_test (gpointer user_data)
-{
-  g_assert_not_reached ();
-}
-
 static void
 check_error (GObject      *source,
              GAsyncResult *result,
@@ -879,7 +910,6 @@ main (int   argc,
   gint ret;
   GDBusNodeInfo *introspection_data = NULL;
 
-  g_type_init ();
   g_test_init (&argc, &argv, NULL);
 
   introspection_data = g_dbus_node_info_new_for_xml (frob_dbus_interface_xml, NULL);
@@ -889,15 +919,14 @@ main (int   argc,
   /* all the tests rely on a shared main loop */
   loop = g_main_loop_new (NULL, FALSE);
 
-  g_test_dbus_unset ();
-
   g_test_add_func ("/gdbus/proxy", test_proxy);
   g_test_add_func ("/gdbus/proxy/no-properties", test_no_properties);
   g_test_add_func ("/gdbus/proxy/wellknown-noauto", test_wellknown_noauto);
   g_test_add_func ("/gdbus/proxy/async", test_async);
 
-  ret = g_test_run();
+  ret = session_bus_run();
 
   g_dbus_node_info_unref (introspection_data);
+
   return ret;
 }