/* 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.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 * 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 . * * Author: David Zeuthen */ #include #include #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; } /* ---------------------------------------------------------------------------------------------------- */