/* GLib testing framework examples and tests * * Copyright (C) 2008-2010 Red Hat, Inc. * * 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. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * 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. * * Author: David Zeuthen */ #include #include #include #include "gdbus-tests.h" /* all tests rely on a shared mainloop */ static GMainLoop *loop = NULL; /* ---------------------------------------------------------------------------------------------------- */ static void proxy_new_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { GDBusProxy **ret = user_data; GError *error; error = NULL; *ret = g_dbus_proxy_new_finish (res, &error); g_assert_no_error (error); g_assert (ret != NULL); g_main_loop_quit (loop); } static void test_proxy_well_known_name (void) { GDBusProxy *p; GDBusProxy *p2; GDBusProxy *ap; GDBusProxy *ap2; GDBusConnection *c; GError *error; gchar *name_owner; gchar **property_names; GVariant *variant; GVariant *result; session_bus_up (); error = NULL; c = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); g_assert_no_error (error); g_assert (c != NULL); error = NULL; p = g_dbus_proxy_new_sync (c, G_DBUS_PROXY_FLAGS_NONE, NULL, /* GDBusInterfaceInfo* */ "com.example.TestService", /* name */ "/com/example/TestObject", /* object path */ "com.example.Frob", /* interface name */ NULL, /* GCancellable */ &error); g_assert_no_error (error); /* we shouldn't have a name owner nor any cached properties */ g_assert_cmpstr (g_dbus_proxy_get_name_owner (p), ==, NULL); g_assert (g_dbus_proxy_get_cached_property_names (p) == NULL); /* also for async: we shouldn't have a name owner nor any cached properties */ g_dbus_proxy_new (c, G_DBUS_PROXY_FLAGS_NONE, NULL, /* GDBusInterfaceInfo* */ "com.example.TestService", /* name */ "/com/example/TestObject", /* object path */ "com.example.Frob", /* interface name */ NULL, /* GCancellable */ (GAsyncReadyCallback) proxy_new_cb, &ap); g_main_loop_run (loop); g_assert_cmpstr (g_dbus_proxy_get_name_owner (ap), ==, NULL); g_assert (g_dbus_proxy_get_cached_property_names (ap) == NULL); /* this is safe; testserver will exit once the bus goes away */ g_assert (g_spawn_command_line_async (SRCDIR "/gdbus-testserver", NULL)); /* check that we get the notify::g-name-owner signal */ _g_assert_property_notify (p, "g-name-owner"); /* Now we should have a name owner as well as properties */ name_owner = g_dbus_proxy_get_name_owner (p); property_names = g_dbus_proxy_get_cached_property_names (p); g_assert (g_dbus_is_unique_name (name_owner)); g_assert (property_names != NULL && g_strv_length (property_names) > 0); g_free (name_owner); g_strfreev (property_names); /* if we create another proxy with the service being available, check that * it has a name owner and properties */ error = NULL; p2 = g_dbus_proxy_new_sync (c, G_DBUS_PROXY_FLAGS_NONE, NULL, /* GDBusInterfaceInfo* */ "com.example.TestService", /* name */ "/com/example/TestObject", /* object path */ "com.example.Frob", /* interface name */ NULL, /* GCancellable */ &error); g_assert_no_error (error); name_owner = g_dbus_proxy_get_name_owner (p2); property_names = g_dbus_proxy_get_cached_property_names (p2); g_assert (g_dbus_is_unique_name (name_owner)); g_assert (property_names != NULL && g_strv_length (property_names) > 0); g_free (name_owner); g_strfreev (property_names); /* also for async: we should have a name owner and cached properties */ g_dbus_proxy_new (c, G_DBUS_PROXY_FLAGS_NONE, NULL, /* GDBusInterfaceInfo* */ "com.example.TestService", /* name */ "/com/example/TestObject", /* object path */ "com.example.Frob", /* interface name */ NULL, /* GCancellable */ (GAsyncReadyCallback) proxy_new_cb, &ap2); g_main_loop_run (loop); name_owner = g_dbus_proxy_get_name_owner (ap2); property_names = g_dbus_proxy_get_cached_property_names (ap2); g_assert (g_dbus_is_unique_name (name_owner)); g_assert (property_names != NULL && g_strv_length (property_names) > 0); g_free (name_owner); g_strfreev (property_names); /* Check property value is the initial value */ variant = g_dbus_proxy_get_cached_property (p, "y"); g_assert (variant != NULL); g_assert_cmpint (g_variant_get_byte (variant), ==, 1); g_variant_unref (variant); variant = g_dbus_proxy_get_cached_property (p2, "y"); g_assert (variant != NULL); g_assert_cmpint (g_variant_get_byte (variant), ==, 1); g_variant_unref (variant); variant = g_dbus_proxy_get_cached_property (ap, "y"); g_assert (variant != NULL); g_assert_cmpint (g_variant_get_byte (variant), ==, 1); g_variant_unref (variant); variant = g_dbus_proxy_get_cached_property (ap2, "y"); g_assert (variant != NULL); g_assert_cmpint (g_variant_get_byte (variant), ==, 1); g_variant_unref (variant); /* Check that properties are updated on both p and p2 */ result = g_dbus_proxy_call_sync (p, "FrobSetProperty", g_variant_new ("(sv)", "y", g_variant_new_byte (42)), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); g_assert_no_error (error); g_assert (result != NULL); g_assert_cmpstr (g_variant_get_type_string (result), ==, "()"); g_variant_unref (result); _g_assert_signal_received (p, "g-properties-changed"); variant = g_dbus_proxy_get_cached_property (p, "y"); g_assert (variant != NULL); g_assert_cmpint (g_variant_get_byte (variant), ==, 42); g_variant_unref (variant); variant = g_dbus_proxy_get_cached_property (p2, "y"); g_assert (variant != NULL); g_assert_cmpint (g_variant_get_byte (variant), ==, 42); g_variant_unref (variant); variant = g_dbus_proxy_get_cached_property (ap, "y"); g_assert (variant != NULL); g_assert_cmpint (g_variant_get_byte (variant), ==, 42); g_variant_unref (variant); variant = g_dbus_proxy_get_cached_property (ap2, "y"); g_assert (variant != NULL); g_assert_cmpint (g_variant_get_byte (variant), ==, 42); g_variant_unref (variant); /* Nuke the service and check that we get the signal and then don't * have a name owner nor any cached properties */ result = g_dbus_proxy_call_sync (p, "Quit", NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); g_assert_no_error (error); g_assert (result != NULL); g_assert_cmpstr (g_variant_get_type_string (result), ==, "()"); g_variant_unref (result); /* and wait... */ _g_assert_property_notify (p, "g-name-owner"); /* now we shouldn't have a name owner nor any cached properties */ g_assert_cmpstr (g_dbus_proxy_get_name_owner (p), ==, NULL); g_assert (g_dbus_proxy_get_cached_property_names (p) == NULL); g_assert (g_dbus_proxy_get_cached_property (p, "y") == NULL); /* now bring back the server and wait for the proxy to be updated.. now * the 'y' property should be back at 1... */ /* this is safe; testserver will exit once the bus goes away */ g_assert (g_spawn_command_line_async (SRCDIR "/gdbus-testserver", NULL)); /* check that we get the notify::g-name-owner signal */ _g_assert_property_notify (p, "g-name-owner"); /* Now we should have a name owner as well as properties */ name_owner = g_dbus_proxy_get_name_owner (p); property_names = g_dbus_proxy_get_cached_property_names (p); g_assert (g_dbus_is_unique_name (name_owner)); g_assert (property_names != NULL && g_strv_length (property_names) > 0); g_free (name_owner); g_strfreev (property_names); /* and finally check the 'y' property */ variant = g_dbus_proxy_get_cached_property (p, "y"); g_assert (variant != NULL); g_assert_cmpint (g_variant_get_byte (variant), ==, 1); g_variant_unref (variant); g_object_unref (p2); g_object_unref (p); g_object_unref (ap2); g_object_unref (ap); g_object_unref (c); /* tear down bus */ session_bus_down (); } /* ---------------------------------------------------------------------------------------------------- */ int main (int argc, char *argv[]) { gint ret; g_test_init (&argc, &argv, NULL); /* 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-well-known-name", test_proxy_well_known_name); ret = g_test_run(); return ret; }