| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | /* GLib testing framework examples and tests
 | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-05-10 08:07:28 -04:00
										 |  |  |  * Copyright (C) 2008-2010 Red Hat, Inc. | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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 | 
					
						
							| 
									
										
										
										
											2017-05-27 17:19:21 +02:00
										 |  |  |  * version 2.1 of the License, or (at your option) any later version. | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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 | 
					
						
							| 
									
										
										
										
											2014-01-23 12:58:29 +01:00
										 |  |  |  * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
 | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-11 10:51:37 -04:00
										 |  |  |   data.loop = g_main_loop_new (g_main_context_get_thread_default (), FALSE); | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |   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); | 
					
						
							| 
									
										
										
										
											2013-02-03 10:21:20 -05:00
										 |  |  |   timeout_id = g_timeout_add_seconds (30, | 
					
						
							|  |  |  |                                       on_property_notify_timeout, | 
					
						
							|  |  |  |                                       &data); | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |   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; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-31 11:06:05 +01:00
										 |  |  | 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); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | /* ---------------------------------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-11 10:51:37 -04:00
										 |  |  |   data.loop = g_main_loop_new (g_main_context_get_thread_default (), FALSE); | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |   data.timed_out = FALSE; | 
					
						
							|  |  |  |   handler_id = g_signal_connect_swapped (object, | 
					
						
							|  |  |  |                                          signal_name, | 
					
						
							|  |  |  |                                          G_CALLBACK (on_signal_received), | 
					
						
							|  |  |  |                                          &data); | 
					
						
							| 
									
										
										
										
											2013-02-03 10:21:20 -05:00
										 |  |  |   timeout_id = g_timeout_add_seconds (30, | 
					
						
							|  |  |  |                                       on_signal_received_timeout, | 
					
						
							|  |  |  |                                       &data); | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |   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, | 
					
						
							| 
									
										
										
										
											2010-05-13 16:32:11 -04:00
										 |  |  |                                                 NULL, /* GDBusAuthObserver */ | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |                                                 cancellable, | 
					
						
							|  |  |  |                                                 error); | 
					
						
							|  |  |  |   g_free (address); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  out: | 
					
						
							|  |  |  |   return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ---------------------------------------------------------------------------------------------------- */ |