|  | /* 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, see <http://www.gnu.org/licenses/>. | 
|  | * | 
|  | * Author: David Zeuthen <davidz@redhat.com> | 
|  | */ | 
|  |  | 
|  | #include <gio/gio.h> | 
|  | #include <unistd.h> | 
|  |  | 
|  | #include "gdbus-tests.h" | 
|  |  | 
|  | /* ---------------------------------------------------------------------------------------------------- */ | 
|  |  | 
|  | typedef struct | 
|  | { | 
|  | GMainLoop *loop; | 
|  | gboolean   timed_out; | 
|  | } PropertyNotifyData; | 
|  |  | 
|  | static void | 
|  | on_property_notify (GObject    *object, | 
|  | GParamSpec *pspec, | 
|  | gpointer    user_data) | 
|  | { | 
|  | PropertyNotifyData *data = user_data; | 
|  | g_main_loop_quit (data->loop); | 
|  | } | 
|  |  | 
|  | static gboolean | 
|  | on_property_notify_timeout (gpointer user_data) | 
|  | { | 
|  | PropertyNotifyData *data = user_data; | 
|  | data->timed_out = TRUE; | 
|  | g_main_loop_quit (data->loop); | 
|  | return TRUE; | 
|  | } | 
|  |  | 
|  | gboolean | 
|  | _g_assert_property_notify_run (gpointer     object, | 
|  | const gchar *property_name) | 
|  | { | 
|  | gchar *s; | 
|  | gulong handler_id; | 
|  | guint timeout_id; | 
|  | PropertyNotifyData data; | 
|  |  | 
|  | data.loop = g_main_loop_new (g_main_context_get_thread_default (), FALSE); | 
|  | data.timed_out = FALSE; | 
|  | s = g_strdup_printf ("notify::%s", property_name); | 
|  | handler_id = g_signal_connect (object, | 
|  | s, | 
|  | G_CALLBACK (on_property_notify), | 
|  | &data); | 
|  | g_free (s); | 
|  | timeout_id = g_timeout_add_seconds (30, | 
|  | on_property_notify_timeout, | 
|  | &data); | 
|  | g_main_loop_run (data.loop); | 
|  | g_signal_handler_disconnect (object, handler_id); | 
|  | g_source_remove (timeout_id); | 
|  | g_main_loop_unref (data.loop); | 
|  |  | 
|  | return data.timed_out; | 
|  | } | 
|  |  | 
|  | static gboolean | 
|  | _give_up (gpointer data) | 
|  | { | 
|  | g_error ("%s", (const gchar *) data); | 
|  | g_return_val_if_reached (TRUE); | 
|  | } | 
|  |  | 
|  | void | 
|  | ensure_gdbus_testserver_up (void) | 
|  | { | 
|  | guint id; | 
|  | gchar *name_owner; | 
|  | GDBusConnection *connection; | 
|  | GDBusProxy *proxy; | 
|  | GError *error = NULL; | 
|  |  | 
|  | connection = g_bus_get_sync (G_BUS_TYPE_SESSION, | 
|  | NULL, | 
|  | &error); | 
|  |  | 
|  | g_assert_no_error (error); | 
|  | error = NULL; | 
|  |  | 
|  | proxy = g_dbus_proxy_new_sync (connection, | 
|  | G_DBUS_PROXY_FLAGS_NONE, | 
|  | NULL,                      /* GDBusInterfaceInfo */ | 
|  | "com.example.TestService", /* name */ | 
|  | "/com/example/TestObject", /* object path */ | 
|  | "com.example.Frob",        /* interface */ | 
|  | NULL, /* GCancellable */ | 
|  | &error); | 
|  | g_assert_no_error (error); | 
|  |  | 
|  | id = g_timeout_add_seconds (60, _give_up, | 
|  | "waited more than ~ 60s for gdbus-testserver to take its bus name"); | 
|  |  | 
|  | while (TRUE) | 
|  | { | 
|  | name_owner = g_dbus_proxy_get_name_owner (proxy); | 
|  |  | 
|  | if (name_owner != NULL) | 
|  | break; | 
|  |  | 
|  | g_main_context_iteration (NULL, TRUE); | 
|  | } | 
|  |  | 
|  | g_source_remove (id); | 
|  | g_free (name_owner); | 
|  | g_object_unref (proxy); | 
|  | g_object_unref (connection); | 
|  | } | 
|  |  | 
|  | /* ---------------------------------------------------------------------------------------------------- */ | 
|  |  | 
|  | typedef struct | 
|  | { | 
|  | GMainLoop *loop; | 
|  | gboolean   timed_out; | 
|  | } SignalReceivedData; | 
|  |  | 
|  | static void | 
|  | on_signal_received (gpointer user_data) | 
|  | { | 
|  | SignalReceivedData *data = user_data; | 
|  | g_main_loop_quit (data->loop); | 
|  | } | 
|  |  | 
|  | static gboolean | 
|  | on_signal_received_timeout (gpointer user_data) | 
|  | { | 
|  | SignalReceivedData *data = user_data; | 
|  | data->timed_out = TRUE; | 
|  | g_main_loop_quit (data->loop); | 
|  | return TRUE; | 
|  | } | 
|  |  | 
|  | gboolean | 
|  | _g_assert_signal_received_run (gpointer     object, | 
|  | const gchar *signal_name) | 
|  | { | 
|  | gulong handler_id; | 
|  | guint timeout_id; | 
|  | SignalReceivedData data; | 
|  |  | 
|  | data.loop = g_main_loop_new (g_main_context_get_thread_default (), FALSE); | 
|  | data.timed_out = FALSE; | 
|  | handler_id = g_signal_connect_swapped (object, | 
|  | signal_name, | 
|  | G_CALLBACK (on_signal_received), | 
|  | &data); | 
|  | timeout_id = g_timeout_add_seconds (30, | 
|  | on_signal_received_timeout, | 
|  | &data); | 
|  | g_main_loop_run (data.loop); | 
|  | g_signal_handler_disconnect (object, handler_id); | 
|  | g_source_remove (timeout_id); | 
|  | g_main_loop_unref (data.loop); | 
|  |  | 
|  | return data.timed_out; | 
|  | } | 
|  |  | 
|  | /* ---------------------------------------------------------------------------------------------------- */ | 
|  |  | 
|  | GDBusConnection * | 
|  | _g_bus_get_priv (GBusType            bus_type, | 
|  | GCancellable       *cancellable, | 
|  | GError            **error) | 
|  | { | 
|  | gchar *address; | 
|  | GDBusConnection *ret; | 
|  |  | 
|  | ret = NULL; | 
|  |  | 
|  | address = g_dbus_address_get_for_bus_sync (bus_type, cancellable, error); | 
|  | if (address == NULL) | 
|  | goto out; | 
|  |  | 
|  | ret = g_dbus_connection_new_for_address_sync (address, | 
|  | G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | | 
|  | G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION, | 
|  | NULL, /* GDBusAuthObserver */ | 
|  | cancellable, | 
|  | error); | 
|  | g_free (address); | 
|  |  | 
|  | out: | 
|  | return ret; | 
|  | } | 
|  |  | 
|  | /* ---------------------------------------------------------------------------------------------------- */ |