[glib] Add a private copy of gio/tests/gdbus-tests.c,h to gio/
- From: David Zeuthen <davidz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib] Add a private copy of gio/tests/gdbus-tests.c,h to gio/
- Date: Wed, 18 Apr 2012 17:33:44 +0000 (UTC)
commit 07bbc87615c6c0d6a525f40c2bffad2c11e400d2
Author: Xavier Claessens <xavier claessens collabora co uk>
Date: Tue Apr 17 19:33:11 2012 +0200
Add a private copy of gio/tests/gdbus-tests.c,h to gio/
https://bugzilla.gnome.org/show_bug.cgi?id=672985
gio/Makefile.am | 1 +
gio/gdbus-tests.c | 268 +++++++++++++++++++++++++++++++++++++++++++++++++++++
gio/gdbus-tests.h | 145 +++++++++++++++++++++++++++++
3 files changed, 414 insertions(+), 0 deletions(-)
---
diff --git a/gio/Makefile.am b/gio/Makefile.am
index f34dfa3..cb30475 100644
--- a/gio/Makefile.am
+++ b/gio/Makefile.am
@@ -94,6 +94,7 @@ gdbus_sources = \
gdbusobjectmanager.h gdbusobjectmanager.c \
gdbusobjectmanagerclient.h gdbusobjectmanagerclient.c \
gdbusobjectmanagerserver.h gdbusobjectmanagerserver.c \
+ gdbus-tests.h gdbus-tests.c \
$(NULL)
settings_headers = \
diff --git a/gio/gdbus-tests.c b/gio/gdbus-tests.c
new file mode 100644
index 0000000..c51aebe
--- /dev/null
+++ b/gio/gdbus-tests.c
@@ -0,0 +1,268 @@
+/* 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 <davidz redhat com>
+ */
+
+#include "config.h"
+
+#include <unistd.h>
+
+#include "gdbus-tests.h"
+#include "gdbusaddress.h"
+#include "gdbusconnection.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 (30 * 1000,
+ 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;
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+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 (30 * 1000,
+ 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;
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+#if 0
+/* toggle refs are not easy to use (maybe not even safe) when multiple
+ * threads are involved so implement this by busy-waiting for now
+ */
+gboolean
+_g_object_wait_for_single_ref_do (gpointer object)
+{
+ guint num_ms_elapsed;
+ gboolean timed_out;
+
+ timed_out = FALSE;
+ num_ms_elapsed = 0;
+
+ while (TRUE)
+ {
+ if (G_OBJECT (object)->ref_count == 1)
+ goto out;
+
+ if (num_ms_elapsed > 30000)
+ {
+ timed_out = TRUE;
+ goto out;
+ }
+
+ usleep (10 * 1000);
+ num_ms_elapsed += 10;
+ }
+
+ out:
+ return timed_out;
+}
+
+#else
+
+typedef struct
+{
+ GMainLoop *loop;
+ gboolean timed_out;
+} WaitSingleRefData;
+
+static gboolean
+on_wait_single_ref_timeout (gpointer user_data)
+{
+ WaitSingleRefData *data = user_data;
+ data->timed_out = TRUE;
+ g_main_loop_quit (data->loop);
+ return TRUE;
+}
+
+static void
+on_wait_for_single_ref_toggled (gpointer user_data,
+ GObject *object,
+ gboolean is_last_ref)
+{
+ WaitSingleRefData *data = user_data;
+ g_main_loop_quit (data->loop);
+}
+
+gboolean
+_g_object_wait_for_single_ref_do (gpointer object)
+{
+ WaitSingleRefData data;
+ guint timeout_id;
+
+ data.timed_out = FALSE;
+
+ if (G_OBJECT (object)->ref_count == 1)
+ goto out;
+
+ data.loop = g_main_loop_new (NULL, FALSE);
+ timeout_id = g_timeout_add (30 * 1000,
+ on_wait_single_ref_timeout,
+ &data);
+
+ g_object_add_toggle_ref (G_OBJECT (object),
+ on_wait_for_single_ref_toggled,
+ &data);
+ /* the reference could have been removed between us checking the
+ * ref_count and the toggle ref being added
+ */
+ if (G_OBJECT (object)->ref_count == 2)
+ goto single_ref_already;
+
+ g_object_unref (object);
+ g_main_loop_run (data.loop);
+ g_object_ref (object);
+
+single_ref_already:
+ g_object_remove_toggle_ref (object,
+ on_wait_for_single_ref_toggled,
+ &data);
+
+ g_source_remove (timeout_id);
+ g_main_loop_unref (data.loop);
+
+ out:
+ if (data.timed_out)
+ {
+ g_printerr ("b ref_count is %d\n", G_OBJECT (object)->ref_count);
+ }
+ return data.timed_out;
+}
+#endif
+
+/* ---------------------------------------------------------------------------------------------------- */
diff --git a/gio/gdbus-tests.h b/gio/gdbus-tests.h
new file mode 100644
index 0000000..a92d242
--- /dev/null
+++ b/gio/gdbus-tests.h
@@ -0,0 +1,145 @@
+/* GLib testing framework examples and tests
+ *
+ * Copyright (C) 2008-2009 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 <davidz redhat com>
+ */
+
+#ifndef __TESTS_H__
+#define __TESTS_H__
+
+#include <gio/giotypes.h>
+
+G_BEGIN_DECLS
+
+/* TODO: clean up and move to gtestutils.c
+ *
+ * This is needed because libdbus-1 does not give predictable error messages - e.g. you
+ * get a different error message on connecting to a bus if the socket file is there vs
+ * if the socket file is missing.
+ */
+
+#define _g_assert_error_domain(err, dom) do { if (!err || (err)->domain != dom) \
+ g_assertion_message_error (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
+ #err, err, dom, -1); } while (0)
+
+#define _g_assert_property_notify(object, property_name) \
+ do \
+ { \
+ if (!G_IS_OBJECT (object)) \
+ { \
+ g_assertion_message (G_LOG_DOMAIN, \
+ __FILE__, \
+ __LINE__, \
+ G_STRFUNC, \
+ "Not a GObject instance"); \
+ } \
+ if (g_object_class_find_property (G_OBJECT_GET_CLASS (object), \
+ property_name) == NULL) \
+ { \
+ g_assertion_message (G_LOG_DOMAIN, \
+ __FILE__, \
+ __LINE__, \
+ G_STRFUNC, \
+ "Property " property_name " does not " \
+ "exist on object"); \
+ } \
+ if (_g_assert_property_notify_run (object, property_name)) \
+ { \
+ g_assertion_message (G_LOG_DOMAIN, \
+ __FILE__, \
+ __LINE__, \
+ G_STRFUNC, \
+ "Timed out waiting for notification " \
+ "on property " property_name); \
+ } \
+ } \
+ while (FALSE)
+
+#define _g_assert_signal_received(object, signal_name) \
+ do \
+ { \
+ if (!G_IS_OBJECT (object)) \
+ { \
+ g_assertion_message (G_LOG_DOMAIN, \
+ __FILE__, \
+ __LINE__, \
+ G_STRFUNC, \
+ "Not a GObject instance"); \
+ } \
+ if (g_signal_lookup (signal_name, \
+ G_TYPE_FROM_INSTANCE (object)) == 0) \
+ { \
+ g_assertion_message (G_LOG_DOMAIN, \
+ __FILE__, \
+ __LINE__, \
+ G_STRFUNC, \
+ "Signal `" signal_name "' does not " \
+ "exist on object"); \
+ } \
+ if (_g_assert_signal_received_run (object, signal_name)) \
+ { \
+ g_assertion_message (G_LOG_DOMAIN, \
+ __FILE__, \
+ __LINE__, \
+ G_STRFUNC, \
+ "Timed out waiting for signal `" \
+ signal_name "'"); \
+ } \
+ } \
+ while (FALSE)
+
+gboolean _g_assert_property_notify_run (gpointer object,
+ const gchar *property_name);
+
+
+gboolean _g_assert_signal_received_run (gpointer object,
+ const gchar *signal_name);
+
+GDBusConnection *_g_bus_get_priv (GBusType bus_type,
+ GCancellable *cancellable,
+ GError **error);
+
+
+#define _g_object_wait_for_single_ref(object) \
+ do \
+ { \
+ if (!G_IS_OBJECT (object)) \
+ { \
+ g_assertion_message (G_LOG_DOMAIN, \
+ __FILE__, \
+ __LINE__, \
+ G_STRFUNC, \
+ "Not a GObject instance"); \
+ } \
+ if (_g_object_wait_for_single_ref_do (object)) \
+ { \
+ g_assertion_message (G_LOG_DOMAIN, \
+ __FILE__, \
+ __LINE__, \
+ G_STRFUNC, \
+ "Timed out waiting for single ref"); \
+ } \
+ } \
+ while (FALSE)
+
+gboolean _g_object_wait_for_single_ref_do (gpointer object);
+
+G_END_DECLS
+
+#endif /* __TESTS_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]