Blame gio/tests/gdbus-tests.c

Packit ae235b
/* GLib testing framework examples and tests
Packit ae235b
 *
Packit ae235b
 * Copyright (C) 2008-2010 Red Hat, Inc.
Packit ae235b
 *
Packit ae235b
 * This library is free software; you can redistribute it and/or
Packit ae235b
 * modify it under the terms of the GNU Lesser General Public
Packit ae235b
 * License as published by the Free Software Foundation; either
Packit ae235b
 * version 2.1 of the License, or (at your option) any later version.
Packit ae235b
 *
Packit ae235b
 * This library is distributed in the hope that it will be useful,
Packit ae235b
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit ae235b
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit ae235b
 * Lesser General Public License for more details.
Packit ae235b
 *
Packit ae235b
 * You should have received a copy of the GNU Lesser General
Packit ae235b
 * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
Packit ae235b
 *
Packit ae235b
 * Author: David Zeuthen <davidz@redhat.com>
Packit ae235b
 */
Packit ae235b
Packit ae235b
#include <gio/gio.h>
Packit ae235b
#include <unistd.h>
Packit ae235b
Packit ae235b
#include "gdbus-tests.h"
Packit ae235b
Packit ae235b
/* ---------------------------------------------------------------------------------------------------- */
Packit ae235b
Packit ae235b
typedef struct
Packit ae235b
{
Packit ae235b
  GMainLoop *loop;
Packit ae235b
  gboolean   timed_out;
Packit ae235b
} PropertyNotifyData;
Packit ae235b
Packit ae235b
static void
Packit ae235b
on_property_notify (GObject    *object,
Packit ae235b
                    GParamSpec *pspec,
Packit ae235b
                    gpointer    user_data)
Packit ae235b
{
Packit ae235b
  PropertyNotifyData *data = user_data;
Packit ae235b
  g_main_loop_quit (data->loop);
Packit ae235b
}
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
on_property_notify_timeout (gpointer user_data)
Packit ae235b
{
Packit ae235b
  PropertyNotifyData *data = user_data;
Packit ae235b
  data->timed_out = TRUE;
Packit ae235b
  g_main_loop_quit (data->loop);
Packit ae235b
  return TRUE;
Packit ae235b
}
Packit ae235b
Packit ae235b
gboolean
Packit ae235b
_g_assert_property_notify_run (gpointer     object,
Packit ae235b
                               const gchar *property_name)
Packit ae235b
{
Packit ae235b
  gchar *s;
Packit ae235b
  gulong handler_id;
Packit ae235b
  guint timeout_id;
Packit ae235b
  PropertyNotifyData data;
Packit ae235b
Packit ae235b
  data.loop = g_main_loop_new (g_main_context_get_thread_default (), FALSE);
Packit ae235b
  data.timed_out = FALSE;
Packit ae235b
  s = g_strdup_printf ("notify::%s", property_name);
Packit ae235b
  handler_id = g_signal_connect (object,
Packit ae235b
                                 s,
Packit ae235b
                                 G_CALLBACK (on_property_notify),
Packit ae235b
                                 &data);
Packit ae235b
  g_free (s);
Packit ae235b
  timeout_id = g_timeout_add_seconds (30,
Packit ae235b
                                      on_property_notify_timeout,
Packit ae235b
                                      &data);
Packit ae235b
  g_main_loop_run (data.loop);
Packit ae235b
  g_signal_handler_disconnect (object, handler_id);
Packit ae235b
  g_source_remove (timeout_id);
Packit ae235b
  g_main_loop_unref (data.loop);
Packit ae235b
Packit ae235b
  return data.timed_out;
Packit ae235b
}
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
_give_up (gpointer data)
Packit ae235b
{
Packit ae235b
  g_error ("%s", (const gchar *) data);
Packit ae235b
  g_return_val_if_reached (TRUE);
Packit ae235b
}
Packit ae235b
Packit ae235b
void
Packit ae235b
ensure_gdbus_testserver_up (void)
Packit ae235b
{
Packit ae235b
  guint id;
Packit ae235b
  gchar *name_owner;
Packit ae235b
  GDBusConnection *connection;
Packit ae235b
  GDBusProxy *proxy;
Packit ae235b
  GError *error = NULL;
Packit ae235b
Packit ae235b
  connection = g_bus_get_sync (G_BUS_TYPE_SESSION,
Packit ae235b
                               NULL,
Packit ae235b
                               &error);
Packit ae235b
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  error = NULL;
Packit ae235b
Packit ae235b
  proxy = g_dbus_proxy_new_sync (connection,
Packit ae235b
                                 G_DBUS_PROXY_FLAGS_NONE,
Packit ae235b
                                 NULL,                      /* GDBusInterfaceInfo */
Packit ae235b
                                 "com.example.TestService", /* name */
Packit ae235b
                                 "/com/example/TestObject", /* object path */
Packit ae235b
                                 "com.example.Frob",        /* interface */
Packit ae235b
                                 NULL, /* GCancellable */
Packit ae235b
                                 &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
Packit ae235b
  id = g_timeout_add_seconds (60, _give_up,
Packit ae235b
      "waited more than ~ 60s for gdbus-testserver to take its bus name");
Packit ae235b
Packit ae235b
  while (TRUE)
Packit ae235b
    {
Packit ae235b
      name_owner = g_dbus_proxy_get_name_owner (proxy);
Packit ae235b
Packit ae235b
      if (name_owner != NULL)
Packit ae235b
        break;
Packit ae235b
Packit ae235b
      g_main_context_iteration (NULL, TRUE);
Packit ae235b
    }
Packit ae235b
Packit ae235b
  g_source_remove (id);
Packit ae235b
  g_free (name_owner);
Packit ae235b
  g_object_unref (proxy);
Packit ae235b
  g_object_unref (connection);
Packit ae235b
}
Packit ae235b
Packit ae235b
/* ---------------------------------------------------------------------------------------------------- */
Packit ae235b
Packit ae235b
typedef struct
Packit ae235b
{
Packit ae235b
  GMainLoop *loop;
Packit ae235b
  gboolean   timed_out;
Packit ae235b
} SignalReceivedData;
Packit ae235b
Packit ae235b
static void
Packit ae235b
on_signal_received (gpointer user_data)
Packit ae235b
{
Packit ae235b
  SignalReceivedData *data = user_data;
Packit ae235b
  g_main_loop_quit (data->loop);
Packit ae235b
}
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
on_signal_received_timeout (gpointer user_data)
Packit ae235b
{
Packit ae235b
  SignalReceivedData *data = user_data;
Packit ae235b
  data->timed_out = TRUE;
Packit ae235b
  g_main_loop_quit (data->loop);
Packit ae235b
  return TRUE;
Packit ae235b
}
Packit ae235b
Packit ae235b
gboolean
Packit ae235b
_g_assert_signal_received_run (gpointer     object,
Packit ae235b
                               const gchar *signal_name)
Packit ae235b
{
Packit ae235b
  gulong handler_id;
Packit ae235b
  guint timeout_id;
Packit ae235b
  SignalReceivedData data;
Packit ae235b
Packit ae235b
  data.loop = g_main_loop_new (g_main_context_get_thread_default (), FALSE);
Packit ae235b
  data.timed_out = FALSE;
Packit ae235b
  handler_id = g_signal_connect_swapped (object,
Packit ae235b
                                         signal_name,
Packit ae235b
                                         G_CALLBACK (on_signal_received),
Packit ae235b
                                         &data);
Packit ae235b
  timeout_id = g_timeout_add_seconds (30,
Packit ae235b
                                      on_signal_received_timeout,
Packit ae235b
                                      &data);
Packit ae235b
  g_main_loop_run (data.loop);
Packit ae235b
  g_signal_handler_disconnect (object, handler_id);
Packit ae235b
  g_source_remove (timeout_id);
Packit ae235b
  g_main_loop_unref (data.loop);
Packit ae235b
Packit ae235b
  return data.timed_out;
Packit ae235b
}
Packit ae235b
Packit ae235b
/* ---------------------------------------------------------------------------------------------------- */
Packit ae235b
Packit ae235b
GDBusConnection *
Packit ae235b
_g_bus_get_priv (GBusType            bus_type,
Packit ae235b
                 GCancellable       *cancellable,
Packit ae235b
                 GError            **error)
Packit ae235b
{
Packit ae235b
  gchar *address;
Packit ae235b
  GDBusConnection *ret;
Packit ae235b
Packit ae235b
  ret = NULL;
Packit ae235b
Packit ae235b
  address = g_dbus_address_get_for_bus_sync (bus_type, cancellable, error);
Packit ae235b
  if (address == NULL)
Packit ae235b
    goto out;
Packit ae235b
Packit ae235b
  ret = g_dbus_connection_new_for_address_sync (address,
Packit ae235b
                                                G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT |
Packit ae235b
                                                G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION,
Packit ae235b
                                                NULL, /* GDBusAuthObserver */
Packit ae235b
                                                cancellable,
Packit ae235b
                                                error);
Packit ae235b
  g_free (address);
Packit ae235b
Packit ae235b
 out:
Packit ae235b
  return ret;
Packit ae235b
}
Packit ae235b
Packit ae235b
/* ---------------------------------------------------------------------------------------------------- */