Blame gio/tests/gdbus-test-codegen.c

Packit ae235b
/* GLib testing framework examples and tests
Packit ae235b
 *
Packit ae235b
 * Copyright (C) 2008-2011 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
#include <string.h>
Packit ae235b
#include <stdio.h>
Packit ae235b
Packit ae235b
#include "gdbus-tests.h"
Packit ae235b
Packit ae235b
#include "gdbus-test-codegen-generated.h"
Packit ae235b
Packit ae235b
/* ---------------------------------------------------------------------------------------------------- */
Packit ae235b
Packit ae235b
static guint
Packit ae235b
count_annotations (GDBusAnnotationInfo **annotations)
Packit ae235b
{
Packit ae235b
  guint ret;
Packit ae235b
  ret = 0;
Packit ae235b
  while (annotations != NULL && annotations[ret] != NULL)
Packit ae235b
    ret++;
Packit ae235b
  return ret;
Packit ae235b
}
Packit ae235b
Packit ae235b
/* checks that
Packit ae235b
 *
Packit ae235b
 *  - non-internal annotations are written out correctly; and
Packit ae235b
 *  - injection via --annotation --key --value works
Packit ae235b
 */
Packit ae235b
static void
Packit ae235b
test_annotations (void)
Packit ae235b
{
Packit ae235b
  GDBusInterfaceInfo *iface;
Packit ae235b
  GDBusMethodInfo *method;
Packit ae235b
  GDBusSignalInfo *signal;
Packit ae235b
  GDBusPropertyInfo *property;
Packit ae235b
Packit ae235b
  iface = foo_igen_bar_interface_info ();
Packit ae235b
  g_assert (iface != NULL);
Packit ae235b
Packit ae235b
  /* see Makefile.am for where these annotations are injected */
Packit ae235b
  g_assert_cmpint (count_annotations (iface->annotations), ==, 1);
Packit ae235b
  g_assert_cmpstr (g_dbus_annotation_info_lookup (iface->annotations, "Key1"), ==, "Value1");
Packit ae235b
Packit ae235b
  method = g_dbus_interface_info_lookup_method (iface, "HelloWorld");
Packit ae235b
  g_assert (method != NULL);
Packit ae235b
  g_assert_cmpint (count_annotations (method->annotations), ==, 2);
Packit ae235b
  g_assert_cmpstr (g_dbus_annotation_info_lookup (method->annotations, "ExistingAnnotation"), ==, "blah");
Packit ae235b
  g_assert_cmpstr (g_dbus_annotation_info_lookup (method->annotations, "Key3"), ==, "Value3");
Packit ae235b
Packit ae235b
  signal = g_dbus_interface_info_lookup_signal (iface, "TestSignal");
Packit ae235b
  g_assert (signal != NULL);
Packit ae235b
  g_assert_cmpint (count_annotations (signal->annotations), ==, 1);
Packit ae235b
  g_assert_cmpstr (g_dbus_annotation_info_lookup (signal->annotations, "Key4"), ==, "Value4");
Packit ae235b
  g_assert_cmpstr (g_dbus_annotation_info_lookup (signal->args[1]->annotations, "Key8"), ==, "Value8");
Packit ae235b
Packit ae235b
  property = g_dbus_interface_info_lookup_property (iface, "ay");
Packit ae235b
  g_assert (property != NULL);
Packit ae235b
  g_assert_cmpint (count_annotations (property->annotations), ==, 1);
Packit ae235b
  g_assert_cmpstr (g_dbus_annotation_info_lookup (property->annotations, "Key5"), ==, "Value5");
Packit ae235b
Packit ae235b
  method = g_dbus_interface_info_lookup_method (iface, "TestPrimitiveTypes");
Packit ae235b
  g_assert (method != NULL);
Packit ae235b
  g_assert_cmpstr (g_dbus_annotation_info_lookup (method->in_args[4]->annotations, "Key6"), ==, "Value6");
Packit ae235b
  g_assert_cmpstr (g_dbus_annotation_info_lookup (method->out_args[5]->annotations, "Key7"), ==, "Value7");
Packit ae235b
}
Packit ae235b
Packit ae235b
/* ---------------------------------------------------------------------------------------------------- */
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
on_handle_hello_world (FooiGenBar             *object,
Packit ae235b
                       GDBusMethodInvocation  *invocation,
Packit ae235b
                       const gchar            *greeting,
Packit ae235b
                       gpointer                user_data)
Packit ae235b
{
Packit ae235b
  gchar *response;
Packit ae235b
  response = g_strdup_printf ("Word! You said '%s'. I'm Skeleton, btw!", greeting);
Packit ae235b
  foo_igen_bar_complete_hello_world (object, invocation, response);
Packit ae235b
  g_free (response);
Packit ae235b
  return TRUE;
Packit ae235b
}
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
on_handle_test_primitive_types (FooiGenBar            *object,
Packit ae235b
                                GDBusMethodInvocation *invocation,
Packit ae235b
                                guchar                 val_byte,
Packit ae235b
                                gboolean               val_boolean,
Packit ae235b
                                gint16                 val_int16,
Packit ae235b
                                guint16                val_uint16,
Packit ae235b
                                gint                   val_int32,
Packit ae235b
                                guint                  val_uint32,
Packit ae235b
                                gint64                 val_int64,
Packit ae235b
                                guint64                val_uint64,
Packit ae235b
                                gdouble                val_double,
Packit ae235b
                                const gchar           *val_string,
Packit ae235b
                                const gchar           *val_objpath,
Packit ae235b
                                const gchar           *val_signature,
Packit ae235b
                                const gchar           *val_bytestring,
Packit ae235b
                                gpointer               user_data)
Packit ae235b
{
Packit ae235b
  gchar *s1;
Packit ae235b
  gchar *s2;
Packit ae235b
  gchar *s3;
Packit ae235b
  s1 = g_strdup_printf ("Word! You said '%s'. Rock'n'roll!", val_string);
Packit ae235b
  s2 = g_strdup_printf ("/modified%s", val_objpath);
Packit ae235b
  s3 = g_strdup_printf ("assgit%s", val_signature);
Packit ae235b
  foo_igen_bar_complete_test_primitive_types (object,
Packit ae235b
                                              invocation,
Packit ae235b
                                              10 + val_byte,
Packit ae235b
                                              !val_boolean,
Packit ae235b
                                              100 + val_int16,
Packit ae235b
                                              1000 + val_uint16,
Packit ae235b
                                              10000 + val_int32,
Packit ae235b
                                              100000 + val_uint32,
Packit ae235b
                                              1000000 + val_int64,
Packit ae235b
                                              10000000 + val_uint64,
Packit ae235b
                                              val_double / G_PI,
Packit ae235b
                                              s1,
Packit ae235b
                                              s2,
Packit ae235b
                                              s3,
Packit ae235b
                                              "bytestring!\xff");
Packit ae235b
  g_free (s1);
Packit ae235b
  g_free (s2);
Packit ae235b
  g_free (s3);
Packit ae235b
  return TRUE;
Packit ae235b
}
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
on_handle_test_non_primitive_types (FooiGenBar            *object,
Packit ae235b
                                    GDBusMethodInvocation *invocation,
Packit ae235b
                                    GVariant              *dict_s_to_s,
Packit ae235b
                                    GVariant              *dict_s_to_pairs,
Packit ae235b
                                    GVariant              *a_struct,
Packit ae235b
                                    const gchar* const    *array_of_strings,
Packit ae235b
                                    const gchar* const    *array_of_objpaths,
Packit ae235b
                                    GVariant              *array_of_signatures,
Packit ae235b
                                    const gchar* const    *array_of_bytestrings,
Packit ae235b
                                    gpointer               user_data)
Packit ae235b
{
Packit ae235b
  gchar *s;
Packit ae235b
  GString *str;
Packit ae235b
  str = g_string_new (NULL);
Packit ae235b
  s = g_variant_print (dict_s_to_s, TRUE); g_string_append (str, s); g_free (s);
Packit ae235b
  s = g_variant_print (dict_s_to_pairs, TRUE); g_string_append (str, s); g_free (s);
Packit ae235b
  s = g_variant_print (a_struct, TRUE); g_string_append (str, s); g_free (s);
Packit ae235b
  s = g_strjoinv (", ", (gchar **) array_of_strings);
Packit ae235b
  g_string_append_printf (str, "array_of_strings: [%s] ", s);
Packit ae235b
  g_free (s);
Packit ae235b
  s = g_strjoinv (", ", (gchar **) array_of_objpaths);
Packit ae235b
  g_string_append_printf (str, "array_of_objpaths: [%s] ", s);
Packit ae235b
  g_free (s);
Packit ae235b
  s = g_variant_print (array_of_signatures, TRUE);
Packit ae235b
  g_string_append_printf (str, "array_of_signatures: %s ", s);
Packit ae235b
  g_free (s);
Packit ae235b
  s = g_strjoinv (", ", (gchar **) array_of_bytestrings);
Packit ae235b
  g_string_append_printf (str, "array_of_bytestrings: [%s] ", s);
Packit ae235b
  g_free (s);
Packit ae235b
  foo_igen_bar_complete_test_non_primitive_types (object, invocation,
Packit ae235b
                                                  array_of_strings,
Packit ae235b
                                                  array_of_objpaths,
Packit ae235b
                                                  array_of_signatures,
Packit ae235b
                                                  array_of_bytestrings,
Packit ae235b
                                                  str->str);
Packit ae235b
  g_string_free (str, TRUE);
Packit ae235b
  return TRUE;
Packit ae235b
}
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
on_handle_request_signal_emission (FooiGenBar             *object,
Packit ae235b
                                   GDBusMethodInvocation  *invocation,
Packit ae235b
                                   gint                    which_one,
Packit ae235b
                                   gpointer                user_data)
Packit ae235b
{
Packit ae235b
  if (which_one == 0)
Packit ae235b
    {
Packit ae235b
      const gchar *a_strv[] = {"foo", "bar", NULL};
Packit ae235b
      const gchar *a_bytestring_array[] = {"foo\xff", "bar\xff", NULL};
Packit ae235b
      GVariant *a_variant = g_variant_new_parsed ("{'first': (42, 42), 'second': (43, 43)}");
Packit ae235b
      foo_igen_bar_emit_test_signal (object, 43, a_strv, a_bytestring_array, a_variant); /* consumes a_variant */
Packit ae235b
      foo_igen_bar_complete_request_signal_emission (object, invocation);
Packit ae235b
    }
Packit ae235b
  return TRUE;
Packit ae235b
}
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
on_handle_request_multi_property_mods (FooiGenBar             *object,
Packit ae235b
                                       GDBusMethodInvocation  *invocation,
Packit ae235b
                                       gpointer                user_data)
Packit ae235b
{
Packit ae235b
  foo_igen_bar_set_y (object, foo_igen_bar_get_y (object) + 1);
Packit ae235b
  foo_igen_bar_set_i (object, foo_igen_bar_get_i (object) + 1);
Packit ae235b
  foo_igen_bar_set_y (object, foo_igen_bar_get_y (object) + 1);
Packit ae235b
  foo_igen_bar_set_i (object, foo_igen_bar_get_i (object) + 1);
Packit ae235b
  g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (object));
Packit ae235b
  foo_igen_bar_set_y (object, foo_igen_bar_get_y (object) + 1);
Packit ae235b
  foo_igen_bar_set_i (object, foo_igen_bar_get_i (object) + 1);
Packit ae235b
  foo_igen_bar_complete_request_multi_property_mods (object, invocation);
Packit ae235b
  return TRUE;
Packit ae235b
}
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
on_handle_property_cancellation (FooiGenBar             *object,
Packit ae235b
                                 GDBusMethodInvocation  *invocation,
Packit ae235b
                                 gpointer                user_data)
Packit ae235b
{
Packit ae235b
  guint n;
Packit ae235b
  n = foo_igen_bar_get_n (object);
Packit ae235b
  /* This queues up a PropertiesChange event */
Packit ae235b
  foo_igen_bar_set_n (object, n + 1);
Packit ae235b
  /* this modifies the queued up event */
Packit ae235b
  foo_igen_bar_set_n (object, n);
Packit ae235b
  /* this flushes all PropertiesChanges event (sends the D-Bus message right
Packit ae235b
   * away, if any - there should not be any)
Packit ae235b
   */
Packit ae235b
  g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (object));
Packit ae235b
  /* this makes us return the reply D-Bus method */
Packit ae235b
  foo_igen_bar_complete_property_cancellation (object, invocation);
Packit ae235b
  return TRUE;
Packit ae235b
}
Packit ae235b
Packit ae235b
/* ---------------------------------------------------------------------------------------------------- */
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
on_handle_force_method (FooiGenBat             *object,
Packit ae235b
                        GDBusMethodInvocation  *invocation,
Packit ae235b
                        GVariant               *force_in_i,
Packit ae235b
                        GVariant               *force_in_s,
Packit ae235b
                        GVariant               *force_in_ay,
Packit ae235b
                        GVariant               *force_in_struct,
Packit ae235b
                        gpointer                user_data)
Packit ae235b
{
Packit ae235b
  GVariant *ret_i;
Packit ae235b
  GVariant *ret_s;
Packit ae235b
  GVariant *ret_ay;
Packit ae235b
  GVariant *ret_struct;
Packit ae235b
  gint32 val;
Packit ae235b
  gchar *s;
Packit ae235b
Packit ae235b
  ret_i = g_variant_new_int32 (g_variant_get_int32 (force_in_i) + 10);
Packit ae235b
  s = g_strdup_printf ("%s_foo", g_variant_get_string (force_in_s, NULL));
Packit ae235b
  ret_s = g_variant_new_string (s);
Packit ae235b
  g_free (s);
Packit ae235b
  s = g_strdup_printf ("%s_foo\xff", g_variant_get_bytestring (force_in_ay));
Packit ae235b
  ret_ay = g_variant_new_bytestring (s);
Packit ae235b
  g_free (s);
Packit ae235b
Packit ae235b
  g_variant_get (force_in_struct, "(i)", &val;;
Packit ae235b
  ret_struct = g_variant_new ("(i)", val + 10);
Packit ae235b
Packit ae235b
  g_variant_ref_sink (ret_i);
Packit ae235b
  g_variant_ref_sink (ret_s);
Packit ae235b
  g_variant_ref_sink (ret_ay);
Packit ae235b
  g_variant_ref_sink (ret_struct);
Packit ae235b
Packit ae235b
  foo_igen_bat_emit_force_signal (object,
Packit ae235b
                                  ret_i,
Packit ae235b
                                  ret_s,
Packit ae235b
                                  ret_ay,
Packit ae235b
                                  ret_struct);
Packit ae235b
Packit ae235b
  foo_igen_bat_complete_force_method (object,
Packit ae235b
                                      invocation,
Packit ae235b
                                      ret_i,
Packit ae235b
                                      ret_s,
Packit ae235b
                                      ret_ay,
Packit ae235b
                                      ret_struct);
Packit ae235b
Packit ae235b
  g_variant_unref (ret_i);
Packit ae235b
  g_variant_unref (ret_s);
Packit ae235b
  g_variant_unref (ret_ay);
Packit ae235b
  g_variant_unref (ret_struct);
Packit ae235b
Packit ae235b
  return TRUE;
Packit ae235b
}
Packit ae235b
Packit ae235b
Packit ae235b
/* ---------------------------------------------------------------------------------------------------- */
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
my_g_authorize_method_handler (GDBusInterfaceSkeleton *interface,
Packit ae235b
                               GDBusMethodInvocation  *invocation,
Packit ae235b
                               gpointer                user_data)
Packit ae235b
{
Packit ae235b
  const gchar *method_name;
Packit ae235b
  gboolean authorized;
Packit ae235b
Packit ae235b
  authorized = FALSE;
Packit ae235b
Packit ae235b
  method_name = g_dbus_method_invocation_get_method_name (invocation);
Packit ae235b
  if (g_strcmp0 (method_name, "CheckNotAuthorized") == 0)
Packit ae235b
    {
Packit ae235b
      authorized = FALSE;
Packit ae235b
    }
Packit ae235b
  else if (g_strcmp0 (method_name, "CheckAuthorized") == 0)
Packit ae235b
    {
Packit ae235b
      authorized = TRUE;
Packit ae235b
    }
Packit ae235b
  else if (g_strcmp0 (method_name, "CheckNotAuthorizedFromObject") == 0)
Packit ae235b
    {
Packit ae235b
      authorized = TRUE;
Packit ae235b
    }
Packit ae235b
  else
Packit ae235b
    {
Packit ae235b
      g_assert_not_reached ();
Packit ae235b
    }
Packit ae235b
Packit ae235b
  if (!authorized)
Packit ae235b
    {
Packit ae235b
      g_dbus_method_invocation_return_error (invocation,
Packit ae235b
                                             G_IO_ERROR,
Packit ae235b
                                             G_IO_ERROR_PERMISSION_DENIED,
Packit ae235b
                                             "not authorized...");
Packit ae235b
    }
Packit ae235b
  return authorized;
Packit ae235b
}
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
my_object_authorize_method_handler (GDBusObjectSkeleton     *object,
Packit ae235b
                                    GDBusInterfaceSkeleton  *interface,
Packit ae235b
                                    GDBusMethodInvocation   *invocation,
Packit ae235b
                                    gpointer                 user_data)
Packit ae235b
{
Packit ae235b
  const gchar *method_name;
Packit ae235b
  gboolean authorized;
Packit ae235b
Packit ae235b
  authorized = FALSE;
Packit ae235b
Packit ae235b
  method_name = g_dbus_method_invocation_get_method_name (invocation);
Packit ae235b
  if (g_strcmp0 (method_name, "CheckNotAuthorized") == 0)
Packit ae235b
    {
Packit ae235b
      authorized = TRUE;
Packit ae235b
    }
Packit ae235b
  else if (g_strcmp0 (method_name, "CheckAuthorized") == 0)
Packit ae235b
    {
Packit ae235b
      authorized = TRUE;
Packit ae235b
    }
Packit ae235b
  else if (g_strcmp0 (method_name, "CheckNotAuthorizedFromObject") == 0)
Packit ae235b
    {
Packit ae235b
      authorized = FALSE;
Packit ae235b
    }
Packit ae235b
  else
Packit ae235b
    {
Packit ae235b
      g_assert_not_reached ();
Packit ae235b
    }
Packit ae235b
Packit ae235b
  if (!authorized)
Packit ae235b
    {
Packit ae235b
      g_dbus_method_invocation_return_error (invocation,
Packit ae235b
                                             G_IO_ERROR,
Packit ae235b
                                             G_IO_ERROR_PENDING,
Packit ae235b
                                             "not authorized (from object)...");
Packit ae235b
    }
Packit ae235b
  return authorized;
Packit ae235b
}
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
on_handle_check_not_authorized (FooiGenAuthorize       *object,
Packit ae235b
                                GDBusMethodInvocation  *invocation,
Packit ae235b
                                gpointer                user_data)
Packit ae235b
{
Packit ae235b
  foo_igen_authorize_complete_check_not_authorized (object, invocation);
Packit ae235b
  return TRUE;
Packit ae235b
}
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
on_handle_check_authorized (FooiGenAuthorize       *object,
Packit ae235b
                            GDBusMethodInvocation  *invocation,
Packit ae235b
                            gpointer                user_data)
Packit ae235b
{
Packit ae235b
  foo_igen_authorize_complete_check_authorized (object, invocation);
Packit ae235b
  return TRUE;
Packit ae235b
}
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
on_handle_check_not_authorized_from_object (FooiGenAuthorize       *object,
Packit ae235b
                                            GDBusMethodInvocation  *invocation,
Packit ae235b
                                            gpointer                user_data)
Packit ae235b
{
Packit ae235b
  foo_igen_authorize_complete_check_not_authorized_from_object (object, invocation);
Packit ae235b
  return TRUE;
Packit ae235b
}
Packit ae235b
Packit ae235b
/* ---------------------------------------------------------------------------------------------------- */
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
on_handle_get_self (FooiGenMethodThreads   *object,
Packit ae235b
                    GDBusMethodInvocation  *invocation,
Packit ae235b
                    gpointer                user_data)
Packit ae235b
{
Packit ae235b
  gchar *s;
Packit ae235b
  s = g_strdup_printf ("%p", (void *)g_thread_self ());
Packit ae235b
  foo_igen_method_threads_complete_get_self (object, invocation, s);
Packit ae235b
  g_free (s);
Packit ae235b
  return TRUE;
Packit ae235b
}
Packit ae235b
Packit ae235b
/* ---------------------------------------------------------------------------------------------------- */
Packit ae235b
Packit ae235b
static GThread *method_handler_thread = NULL;
Packit ae235b
Packit ae235b
static FooiGenBar *exported_bar_object = NULL;
Packit ae235b
static FooiGenBat *exported_bat_object = NULL;
Packit ae235b
static FooiGenAuthorize *exported_authorize_object = NULL;
Packit ae235b
static GDBusObjectSkeleton *authorize_enclosing_object = NULL;
Packit ae235b
static FooiGenMethodThreads *exported_thread_object_1 = NULL;
Packit ae235b
static FooiGenMethodThreads *exported_thread_object_2 = NULL;
Packit ae235b
Packit ae235b
static void
Packit ae235b
unexport_objects (void)
Packit ae235b
{
Packit ae235b
  g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_bar_object));
Packit ae235b
  g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_bat_object));
Packit ae235b
  g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_authorize_object));
Packit ae235b
  g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_thread_object_1));
Packit ae235b
  g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_thread_object_2));
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
on_bus_acquired (GDBusConnection *connection,
Packit ae235b
                 const gchar     *name,
Packit ae235b
                 gpointer         user_data)
Packit ae235b
{
Packit ae235b
  GError *error;
Packit ae235b
Packit ae235b
  /* Test that we can export an object using the generated
Packit ae235b
   * FooiGenBarSkeleton subclass. Notes:
Packit ae235b
   *
Packit ae235b
   * 1. We handle methods by simply connecting to the appropriate
Packit ae235b
   * GObject signal.
Packit ae235b
   *
Packit ae235b
   * 2. Property storage is taken care of by the class; we can
Packit ae235b
   *    use g_object_get()/g_object_set() (and the generated
Packit ae235b
   *    C bindings at will)
Packit ae235b
   */
Packit ae235b
  error = NULL;
Packit ae235b
  exported_bar_object = foo_igen_bar_skeleton_new ();
Packit ae235b
  foo_igen_bar_set_ay (exported_bar_object, "ABCabc");
Packit ae235b
  foo_igen_bar_set_y (exported_bar_object, 42);
Packit ae235b
  foo_igen_bar_set_d (exported_bar_object, 43.0);
Packit ae235b
  foo_igen_bar_set_finally_normal_name (exported_bar_object, "There aint no place like home");
Packit ae235b
  foo_igen_bar_set_writeonly_property (exported_bar_object, "Mr. Burns");
Packit ae235b
Packit ae235b
  /* The following works because it's on the Skeleton object - it will
Packit ae235b
   * fail (at run-time) on a Proxy (see on_proxy_appeared() below)
Packit ae235b
   */
Packit ae235b
  foo_igen_bar_set_readonly_property (exported_bar_object, "blah");
Packit ae235b
  g_assert_cmpstr (foo_igen_bar_get_writeonly_property (exported_bar_object), ==, "Mr. Burns");
Packit ae235b
Packit ae235b
  g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (exported_bar_object),
Packit ae235b
                                    connection,
Packit ae235b
                                    "/bar",
Packit ae235b
                                    &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_signal_connect (exported_bar_object,
Packit ae235b
                    "handle-hello-world",
Packit ae235b
                    G_CALLBACK (on_handle_hello_world),
Packit ae235b
                    NULL);
Packit ae235b
  g_signal_connect (exported_bar_object,
Packit ae235b
                    "handle-test-primitive-types",
Packit ae235b
                    G_CALLBACK (on_handle_test_primitive_types),
Packit ae235b
                    NULL);
Packit ae235b
  g_signal_connect (exported_bar_object,
Packit ae235b
                    "handle-test-non-primitive-types",
Packit ae235b
                    G_CALLBACK (on_handle_test_non_primitive_types),
Packit ae235b
                    NULL);
Packit ae235b
  g_signal_connect (exported_bar_object,
Packit ae235b
                    "handle-request-signal-emission",
Packit ae235b
                    G_CALLBACK (on_handle_request_signal_emission),
Packit ae235b
                    NULL);
Packit ae235b
  g_signal_connect (exported_bar_object,
Packit ae235b
                    "handle-request-multi-property-mods",
Packit ae235b
                    G_CALLBACK (on_handle_request_multi_property_mods),
Packit ae235b
                    NULL);
Packit ae235b
  g_signal_connect (exported_bar_object,
Packit ae235b
                    "handle-property-cancellation",
Packit ae235b
                    G_CALLBACK (on_handle_property_cancellation),
Packit ae235b
                    NULL);
Packit ae235b
Packit ae235b
  exported_bat_object = foo_igen_bat_skeleton_new ();
Packit ae235b
  g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (exported_bat_object),
Packit ae235b
                                    connection,
Packit ae235b
                                    "/bat",
Packit ae235b
                                    &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_signal_connect (exported_bat_object,
Packit ae235b
                    "handle-force-method",
Packit ae235b
                    G_CALLBACK (on_handle_force_method),
Packit ae235b
                    NULL);
Packit ae235b
  g_object_set (exported_bat_object,
Packit ae235b
                "force-i", g_variant_new_int32 (43),
Packit ae235b
                "force-s", g_variant_new_string ("prop string"),
Packit ae235b
                "force-ay", g_variant_new_bytestring ("prop bytestring\xff"),
Packit ae235b
                "force-struct", g_variant_new ("(i)", 4300),
Packit ae235b
                NULL);
Packit ae235b
Packit ae235b
  authorize_enclosing_object = g_dbus_object_skeleton_new ("/authorize");
Packit ae235b
  g_signal_connect (authorize_enclosing_object,
Packit ae235b
                    "authorize-method",
Packit ae235b
                    G_CALLBACK (my_object_authorize_method_handler),
Packit ae235b
                    NULL);
Packit ae235b
  exported_authorize_object = foo_igen_authorize_skeleton_new ();
Packit ae235b
  g_dbus_object_skeleton_add_interface (authorize_enclosing_object,
Packit ae235b
                                        G_DBUS_INTERFACE_SKELETON (exported_authorize_object));
Packit ae235b
  g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (exported_authorize_object),
Packit ae235b
                                    connection,
Packit ae235b
                                    "/authorize",
Packit ae235b
                                    &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_signal_connect (exported_authorize_object,
Packit ae235b
                    "g-authorize-method",
Packit ae235b
                    G_CALLBACK (my_g_authorize_method_handler),
Packit ae235b
                    NULL);
Packit ae235b
  g_signal_connect (exported_authorize_object,
Packit ae235b
                    "handle-check-not-authorized",
Packit ae235b
                    G_CALLBACK (on_handle_check_not_authorized),
Packit ae235b
                    NULL);
Packit ae235b
  g_signal_connect (exported_authorize_object,
Packit ae235b
                    "handle-check-authorized",
Packit ae235b
                    G_CALLBACK (on_handle_check_authorized),
Packit ae235b
                    NULL);
Packit ae235b
  g_signal_connect (exported_authorize_object,
Packit ae235b
                    "handle-check-not-authorized-from-object",
Packit ae235b
                    G_CALLBACK (on_handle_check_not_authorized_from_object),
Packit ae235b
                    NULL);
Packit ae235b
Packit ae235b
Packit ae235b
  /* only object 1 has the G_DBUS_INTERFACE_SKELETON_FLAGS_HANDLE_METHOD_INVOCATIONS_IN_THREAD flag set */
Packit ae235b
  exported_thread_object_1 = foo_igen_method_threads_skeleton_new ();
Packit ae235b
  g_dbus_interface_skeleton_set_flags (G_DBUS_INTERFACE_SKELETON (exported_thread_object_1),
Packit ae235b
                                       G_DBUS_INTERFACE_SKELETON_FLAGS_HANDLE_METHOD_INVOCATIONS_IN_THREAD);
Packit ae235b
Packit ae235b
  g_assert (!g_dbus_interface_skeleton_has_connection (G_DBUS_INTERFACE_SKELETON (exported_thread_object_1), connection));
Packit ae235b
  g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (exported_thread_object_1),
Packit ae235b
                                    connection,
Packit ae235b
                                    "/method_threads_1",
Packit ae235b
                                    &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_signal_connect (exported_thread_object_1,
Packit ae235b
                    "handle-get-self",
Packit ae235b
                    G_CALLBACK (on_handle_get_self),
Packit ae235b
                    NULL);
Packit ae235b
  g_assert_cmpint (g_dbus_interface_skeleton_get_flags (G_DBUS_INTERFACE_SKELETON (exported_thread_object_1)), ==, G_DBUS_INTERFACE_SKELETON_FLAGS_HANDLE_METHOD_INVOCATIONS_IN_THREAD);
Packit ae235b
Packit ae235b
  exported_thread_object_2 = foo_igen_method_threads_skeleton_new ();
Packit ae235b
  g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (exported_thread_object_2),
Packit ae235b
                                    connection,
Packit ae235b
                                    "/method_threads_2",
Packit ae235b
                                    &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_signal_connect (exported_thread_object_2,
Packit ae235b
                    "handle-get-self",
Packit ae235b
                    G_CALLBACK (on_handle_get_self),
Packit ae235b
                    NULL);
Packit ae235b
Packit ae235b
  g_assert_cmpint (g_dbus_interface_skeleton_get_flags (G_DBUS_INTERFACE_SKELETON (exported_thread_object_2)), ==, G_DBUS_INTERFACE_SKELETON_FLAGS_NONE);
Packit ae235b
Packit ae235b
  method_handler_thread = g_thread_self ();
Packit ae235b
}
Packit ae235b
Packit ae235b
static gpointer check_proxies_in_thread (gpointer user_data);
Packit ae235b
Packit ae235b
static void
Packit ae235b
on_name_acquired (GDBusConnection *connection,
Packit ae235b
                  const gchar     *name,
Packit ae235b
                  gpointer         user_data)
Packit ae235b
{
Packit ae235b
  GMainLoop *loop = user_data;
Packit ae235b
Packit ae235b
  g_thread_new ("check-proxies",
Packit ae235b
                check_proxies_in_thread,
Packit ae235b
                loop);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
on_name_lost (GDBusConnection *connection,
Packit ae235b
              const gchar     *name,
Packit ae235b
              gpointer         user_data)
Packit ae235b
{
Packit ae235b
  g_assert_not_reached ();
Packit ae235b
}
Packit ae235b
Packit ae235b
/* ---------------------------------------------------------------------------------------------------- */
Packit ae235b
Packit ae235b
typedef struct
Packit ae235b
{
Packit ae235b
  GMainLoop *thread_loop;
Packit ae235b
  gint initial_y;
Packit ae235b
  gint initial_i;
Packit ae235b
  guint num_g_properties_changed;
Packit ae235b
  gboolean received_test_signal;
Packit ae235b
  guint num_notify_u;
Packit ae235b
  guint num_notify_n;
Packit ae235b
} ClientData;
Packit ae235b
Packit ae235b
static void
Packit ae235b
on_notify_u (GObject    *object,
Packit ae235b
           GParamSpec *pspec,
Packit ae235b
           gpointer    user_data)
Packit ae235b
{
Packit ae235b
  ClientData *data = user_data;
Packit ae235b
  g_assert_cmpstr (pspec->name, ==, "u");
Packit ae235b
  data->num_notify_u += 1;
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
on_notify_n (GObject    *object,
Packit ae235b
             GParamSpec *pspec,
Packit ae235b
             gpointer    user_data)
Packit ae235b
{
Packit ae235b
  ClientData *data = user_data;
Packit ae235b
  g_assert_cmpstr (pspec->name, ==, "n");
Packit ae235b
  data->num_notify_n += 1;
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
on_g_properties_changed (GDBusProxy          *_proxy,
Packit ae235b
                         GVariant            *changed_properties,
Packit ae235b
                         const gchar* const  *invalidated_properties,
Packit ae235b
                         gpointer             user_data)
Packit ae235b
{
Packit ae235b
  ClientData *data = user_data;
Packit ae235b
  FooiGenBar *proxy = FOO_IGEN_BAR (_proxy);
Packit ae235b
Packit ae235b
  g_assert_cmpint (g_variant_n_children (changed_properties), ==, 2);
Packit ae235b
Packit ae235b
  if (data->num_g_properties_changed == 0)
Packit ae235b
    {
Packit ae235b
      g_assert_cmpint (data->initial_y, ==, foo_igen_bar_get_y (proxy) - 2);
Packit ae235b
      g_assert_cmpint (data->initial_i, ==, foo_igen_bar_get_i (proxy) - 2);
Packit ae235b
    }
Packit ae235b
  else if (data->num_g_properties_changed == 1)
Packit ae235b
    {
Packit ae235b
      g_assert_cmpint (data->initial_y, ==, foo_igen_bar_get_y (proxy) - 3);
Packit ae235b
      g_assert_cmpint (data->initial_i, ==, foo_igen_bar_get_i (proxy) - 3);
Packit ae235b
    }
Packit ae235b
  else
Packit ae235b
    g_assert_not_reached ();
Packit ae235b
Packit ae235b
  data->num_g_properties_changed++;
Packit ae235b
Packit ae235b
  if (data->num_g_properties_changed == 2)
Packit ae235b
    g_main_loop_quit (data->thread_loop);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
on_test_signal (FooiGenBar          *proxy,
Packit ae235b
                gint                 val_int32,
Packit ae235b
                const gchar* const  *array_of_strings,
Packit ae235b
                const gchar* const  *array_of_bytestrings,
Packit ae235b
                GVariant            *dict_s_to_pairs,
Packit ae235b
                gpointer             user_data)
Packit ae235b
{
Packit ae235b
  ClientData *data = user_data;
Packit ae235b
Packit ae235b
  g_assert_cmpint (val_int32, ==, 43);
Packit ae235b
  g_assert_cmpstr (array_of_strings[0], ==, "foo");
Packit ae235b
  g_assert_cmpstr (array_of_strings[1], ==, "bar");
Packit ae235b
  g_assert (array_of_strings[2] == NULL);
Packit ae235b
  g_assert_cmpstr (array_of_bytestrings[0], ==, "foo\xff");
Packit ae235b
  g_assert_cmpstr (array_of_bytestrings[1], ==, "bar\xff");
Packit ae235b
  g_assert (array_of_bytestrings[2] == NULL);
Packit ae235b
Packit ae235b
  data->received_test_signal = TRUE;
Packit ae235b
  g_main_loop_quit (data->thread_loop);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
on_property_cancellation_cb (FooiGenBar    *proxy,
Packit ae235b
                             GAsyncResult  *res,
Packit ae235b
                             gpointer       user_data)
Packit ae235b
{
Packit ae235b
  ClientData *data = user_data;
Packit ae235b
  gboolean ret;
Packit ae235b
  GError *error = NULL;
Packit ae235b
Packit ae235b
  error = NULL;
Packit ae235b
  ret = foo_igen_bar_call_property_cancellation_finish (proxy, res, &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (ret);
Packit ae235b
Packit ae235b
  g_main_loop_quit (data->thread_loop);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
check_bar_proxy (FooiGenBar *proxy,
Packit ae235b
                 GMainLoop  *thread_loop)
Packit ae235b
{
Packit ae235b
  const gchar *array_of_strings[3] = {"one", "two", NULL};
Packit ae235b
  const gchar *array_of_strings_2[3] = {"one2", "two2", NULL};
Packit ae235b
  const gchar *array_of_objpaths[3] = {"/one", "/one/two", NULL};
Packit ae235b
  GVariant *array_of_signatures = NULL;
Packit ae235b
  const gchar *array_of_bytestrings[3] = {"one\xff", "two\xff", NULL};
Packit ae235b
  gchar **ret_array_of_strings = NULL;
Packit ae235b
  gchar **ret_array_of_objpaths = NULL;
Packit ae235b
  GVariant *ret_array_of_signatures = NULL;
Packit ae235b
  gchar **ret_array_of_bytestrings = NULL;
Packit ae235b
  guchar ret_val_byte;
Packit ae235b
  gboolean ret_val_boolean;
Packit ae235b
  gint16 ret_val_int16;
Packit ae235b
  guint16 ret_val_uint16;
Packit ae235b
  gint ret_val_int32;
Packit ae235b
  guint ret_val_uint32;
Packit ae235b
  gint64 ret_val_int64;
Packit ae235b
  guint64 ret_val_uint64;
Packit ae235b
  gdouble ret_val_double;
Packit ae235b
  gchar *ret_val_string;
Packit ae235b
  gchar *ret_val_objpath;
Packit ae235b
  gchar *ret_val_signature;
Packit ae235b
  gchar *ret_val_bytestring;
Packit ae235b
  gboolean ret;
Packit ae235b
  GError *error;
Packit ae235b
  ClientData *data;
Packit ae235b
  guchar val_y;
Packit ae235b
  gboolean val_b;
Packit ae235b
  gint val_n;
Packit ae235b
  guint val_q;
Packit ae235b
  gint val_i;
Packit ae235b
  guint val_u;
Packit ae235b
  gint64 val_x;
Packit ae235b
  guint64 val_t;
Packit ae235b
  gdouble val_d;
Packit ae235b
  gchar *val_s;
Packit ae235b
  gchar *val_o;
Packit ae235b
  gchar *val_g;
Packit ae235b
  gchar *val_ay;
Packit ae235b
  gchar **val_as;
Packit ae235b
  gchar **val_ao;
Packit ae235b
  GVariant *val_ag;
Packit ae235b
  gint32 val_unset_i;
Packit ae235b
  gdouble val_unset_d;
Packit ae235b
  gchar *val_unset_s;
Packit ae235b
  gchar *val_unset_o;
Packit ae235b
  gchar *val_unset_g;
Packit ae235b
  gchar *val_unset_ay;
Packit ae235b
  gchar **val_unset_as;
Packit ae235b
  gchar **val_unset_ao;
Packit ae235b
  GVariant *val_unset_ag;
Packit ae235b
  GVariant *val_unset_struct;
Packit ae235b
  gchar *val_finally_normal_name;
Packit ae235b
  GVariant *v;
Packit ae235b
  gchar *s;
Packit ae235b
  const gchar *const *read_as;
Packit ae235b
  const gchar *const *read_as2;
Packit ae235b
  const gchar *const *read_as3;
Packit ae235b
Packit ae235b
  data = g_new0 (ClientData, 1);
Packit ae235b
  data->thread_loop = thread_loop;
Packit ae235b
Packit ae235b
  v = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "y");
Packit ae235b
  g_assert (v != NULL);
Packit ae235b
  g_variant_unref (v);
Packit ae235b
Packit ae235b
  /* set empty values to non-empty */
Packit ae235b
  val_unset_i = 42;
Packit ae235b
  val_unset_d = 42.0;
Packit ae235b
  val_unset_s = "42";
Packit ae235b
  val_unset_o = "42";
Packit ae235b
  val_unset_g = "42";
Packit ae235b
  val_unset_ay = NULL;
Packit ae235b
  val_unset_as = NULL;
Packit ae235b
  val_unset_ao = NULL;
Packit ae235b
  val_unset_ag = NULL;
Packit ae235b
  val_unset_struct = NULL;
Packit ae235b
  /* check properties */
Packit ae235b
  g_object_get (proxy,
Packit ae235b
                "y", &val_y,
Packit ae235b
                "b", &val_b,
Packit ae235b
                "n", &val_n,
Packit ae235b
                "q", &val_q,
Packit ae235b
                "i", &val_i,
Packit ae235b
                "u", &val_u,
Packit ae235b
                "x", &val_x,
Packit ae235b
                "t", &val_t,
Packit ae235b
                "d", &val_d,
Packit ae235b
                "s", &val_s,
Packit ae235b
                "o", &val_o,
Packit ae235b
                "g", &val_g,
Packit ae235b
                "ay", &val_ay,
Packit ae235b
                "as", &val_as,
Packit ae235b
                "ao", &val_ao,
Packit ae235b
                "ag", &val_ag,
Packit ae235b
                "unset_i", &val_unset_i,
Packit ae235b
                "unset_d", &val_unset_d,
Packit ae235b
                "unset_s", &val_unset_s,
Packit ae235b
                "unset_o", &val_unset_o,
Packit ae235b
                "unset_g", &val_unset_g,
Packit ae235b
                "unset_ay", &val_unset_ay,
Packit ae235b
                "unset_as", &val_unset_as,
Packit ae235b
                "unset_ao", &val_unset_ao,
Packit ae235b
                "unset_ag", &val_unset_ag,
Packit ae235b
                "unset_struct", &val_unset_struct,
Packit ae235b
                "finally-normal-name", &val_finally_normal_name,
Packit ae235b
                NULL);
Packit ae235b
  g_assert_cmpint (val_y, ==, 42);
Packit ae235b
  g_assert_cmpstr (val_finally_normal_name, ==, "There aint no place like home");
Packit ae235b
  g_free (val_s);
Packit ae235b
  g_free (val_o);
Packit ae235b
  g_free (val_g);
Packit ae235b
  g_assert_cmpstr (val_ay, ==, "ABCabc");
Packit ae235b
  g_free (val_ay);
Packit ae235b
  g_strfreev (val_as);
Packit ae235b
  g_strfreev (val_ao);
Packit ae235b
  g_variant_unref (val_ag);
Packit ae235b
  g_free (val_finally_normal_name);
Packit ae235b
  /* check empty values */
Packit ae235b
  g_assert_cmpint (val_unset_i, ==, 0);
Packit ae235b
  g_assert_cmpfloat (val_unset_d, ==, 0.0);
Packit ae235b
  g_assert_cmpstr (val_unset_s, ==, "");
Packit ae235b
  g_assert_cmpstr (val_unset_o, ==, "/");
Packit ae235b
  g_assert_cmpstr (val_unset_g, ==, "");
Packit ae235b
  g_free (val_unset_s);
Packit ae235b
  g_free (val_unset_o);
Packit ae235b
  g_free (val_unset_g);
Packit ae235b
  g_assert_cmpstr (val_unset_ay, ==, "");
Packit ae235b
  g_assert (val_unset_as[0] == NULL);
Packit ae235b
  g_assert (val_unset_ao[0] == NULL);
Packit ae235b
  g_assert (g_variant_is_of_type (val_unset_ag, G_VARIANT_TYPE ("ag")));
Packit ae235b
  g_assert (g_variant_is_of_type (val_unset_struct, G_VARIANT_TYPE ("(idsogayasaoag)")));
Packit ae235b
  s = g_variant_print (val_unset_struct, TRUE);
Packit ae235b
  g_assert_cmpstr (s, ==, "(0, 0.0, '', objectpath '/', signature '', @ay [], @as [], @ao [], @ag [])");
Packit ae235b
  g_free (s);
Packit ae235b
  g_free (val_unset_ay);
Packit ae235b
  g_strfreev (val_unset_as);
Packit ae235b
  g_strfreev (val_unset_ao);
Packit ae235b
  g_variant_unref (val_unset_ag);
Packit ae235b
  g_variant_unref (val_unset_struct);
Packit ae235b
Packit ae235b
  /* Try setting a property. This causes the generated glue to invoke
Packit ae235b
   * the org.fd.DBus.Properties.Set() method asynchronously. So we
Packit ae235b
   * have to wait for properties-changed...
Packit ae235b
   */
Packit ae235b
  foo_igen_bar_set_finally_normal_name (proxy, "foo!");
Packit ae235b
  _g_assert_property_notify (proxy, "finally-normal-name");
Packit ae235b
  g_assert_cmpstr (foo_igen_bar_get_finally_normal_name (proxy), ==, "foo!");
Packit ae235b
Packit ae235b
  /* Try setting properties that requires memory management. This
Packit ae235b
   * is to exercise the paths that frees the references.
Packit ae235b
   */
Packit ae235b
Packit ae235b
  g_object_set (proxy,
Packit ae235b
                "s", "a string",
Packit ae235b
                "o", "/a/path",
Packit ae235b
                "g", "asig",
Packit ae235b
                "ay", g_variant_new_parsed ("[byte 0x65, 0x67]"),
Packit ae235b
                "as", array_of_strings,
Packit ae235b
                "ao", array_of_objpaths,
Packit ae235b
                "ag", g_variant_new_parsed ("[@g 'ass', 'git']"),
Packit ae235b
                NULL);
Packit ae235b
Packit ae235b
  error = NULL;
Packit ae235b
  ret = foo_igen_bar_call_test_primitive_types_sync (proxy,
Packit ae235b
                                                     10,
Packit ae235b
                                                     TRUE,
Packit ae235b
                                                     11,
Packit ae235b
                                                     12,
Packit ae235b
                                                     13,
Packit ae235b
                                                     14,
Packit ae235b
                                                     15,
Packit ae235b
                                                     16,
Packit ae235b
                                                     17,
Packit ae235b
                                                     "a string",
Packit ae235b
                                                     "/a/path",
Packit ae235b
                                                     "asig",
Packit ae235b
                                                     "bytestring\xff",
Packit ae235b
                                                     &ret_val_byte,
Packit ae235b
                                                     &ret_val_boolean,
Packit ae235b
                                                     &ret_val_int16,
Packit ae235b
                                                     &ret_val_uint16,
Packit ae235b
                                                     &ret_val_int32,
Packit ae235b
                                                     &ret_val_uint32,
Packit ae235b
                                                     &ret_val_int64,
Packit ae235b
                                                     &ret_val_uint64,
Packit ae235b
                                                     &ret_val_double,
Packit ae235b
                                                     &ret_val_string,
Packit ae235b
                                                     &ret_val_objpath,
Packit ae235b
                                                     &ret_val_signature,
Packit ae235b
                                                     &ret_val_bytestring,
Packit ae235b
                                                     NULL, /* GCancellable */
Packit ae235b
                                                     &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (ret);
Packit ae235b
Packit ae235b
  g_clear_pointer (&ret_val_string, g_free);
Packit ae235b
  g_clear_pointer (&ret_val_objpath, g_free);
Packit ae235b
  g_clear_pointer (&ret_val_signature, g_free);
Packit ae235b
  g_clear_pointer (&ret_val_bytestring, g_free);
Packit ae235b
Packit ae235b
  error = NULL;
Packit ae235b
  array_of_signatures = g_variant_ref_sink (g_variant_new_parsed ("[@g 'ass', 'git']"));
Packit ae235b
  ret = foo_igen_bar_call_test_non_primitive_types_sync (proxy,
Packit ae235b
                                                         g_variant_new_parsed ("{'one': 'red',"
Packit ae235b
                                                                               " 'two': 'blue'}"),
Packit ae235b
                                                         g_variant_new_parsed ("{'first': (42, 42), "
Packit ae235b
                                                                               "'second': (43, 43)}"),
Packit ae235b
                                                         g_variant_new_parsed ("(42, 'foo', 'bar')"),
Packit ae235b
                                                         array_of_strings,
Packit ae235b
                                                         array_of_objpaths,
Packit ae235b
                                                         array_of_signatures,
Packit ae235b
                                                         array_of_bytestrings,
Packit ae235b
                                                         &ret_array_of_strings,
Packit ae235b
                                                         &ret_array_of_objpaths,
Packit ae235b
                                                         &ret_array_of_signatures,
Packit ae235b
                                                         &ret_array_of_bytestrings,
Packit ae235b
                                                         &s,
Packit ae235b
                                                         NULL, /* GCancellable */
Packit ae235b
                                                         &error);
Packit ae235b
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (ret);
Packit ae235b
Packit ae235b
  g_assert_nonnull (ret_array_of_strings);
Packit ae235b
  g_assert_cmpuint (g_strv_length ((gchar **) ret_array_of_strings), ==,
Packit ae235b
                    g_strv_length ((gchar **) array_of_strings));
Packit ae235b
  g_assert_nonnull (ret_array_of_objpaths);
Packit ae235b
  g_assert_cmpuint (g_strv_length ((gchar **) ret_array_of_objpaths), ==,
Packit ae235b
                    g_strv_length ((gchar **) array_of_objpaths));
Packit ae235b
  g_assert_nonnull (ret_array_of_signatures);
Packit ae235b
  g_assert_true (g_variant_equal (ret_array_of_signatures, array_of_signatures));
Packit ae235b
  g_assert_nonnull (ret_array_of_bytestrings);
Packit ae235b
  g_assert_cmpuint (g_strv_length ((gchar **) ret_array_of_bytestrings), ==,
Packit ae235b
                    g_strv_length ((gchar **) array_of_bytestrings));
Packit ae235b
Packit ae235b
  g_clear_pointer (&ret_array_of_strings, g_strfreev);
Packit ae235b
  g_clear_pointer (&ret_array_of_objpaths, g_strfreev);
Packit ae235b
  g_clear_pointer (&ret_array_of_signatures, g_variant_unref);
Packit ae235b
  g_clear_pointer (&ret_array_of_bytestrings, g_strfreev);
Packit ae235b
  g_clear_pointer (&s, g_free);
Packit ae235b
Packit ae235b
  /* Check that org.freedesktop.DBus.Error.UnknownMethod is returned on
Packit ae235b
   * unimplemented methods.
Packit ae235b
   */
Packit ae235b
  error = NULL;
Packit ae235b
  ret = foo_igen_bar_call_unimplemented_method_sync (proxy, NULL /* GCancellable */, &error);
Packit ae235b
  g_assert_error (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD);
Packit ae235b
  g_error_free (error);
Packit ae235b
  error = NULL;
Packit ae235b
  g_assert (!ret);
Packit ae235b
Packit ae235b
  g_signal_connect (proxy,
Packit ae235b
                    "test-signal",
Packit ae235b
                    G_CALLBACK (on_test_signal),
Packit ae235b
                    data);
Packit ae235b
  error = NULL;
Packit ae235b
  ret = foo_igen_bar_call_request_signal_emission_sync (proxy, 0, NULL, &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (ret);
Packit ae235b
Packit ae235b
  g_assert (!data->received_test_signal);
Packit ae235b
  g_main_loop_run (thread_loop);
Packit ae235b
  g_assert (data->received_test_signal);
Packit ae235b
Packit ae235b
  /* Try setting a property. This causes the generated glue to invoke
Packit ae235b
   * the org.fd.DBus.Properties.Set() method asynchronously. So we
Packit ae235b
   * have to wait for properties-changed...
Packit ae235b
   */
Packit ae235b
  foo_igen_bar_set_finally_normal_name (proxy, "hey back!");
Packit ae235b
  _g_assert_property_notify (proxy, "finally-normal-name");
Packit ae235b
  g_assert_cmpstr (foo_igen_bar_get_finally_normal_name (proxy), ==, "hey back!");
Packit ae235b
Packit ae235b
  /* Check that multiple calls to a strv getter works... and that
Packit ae235b
   * updates on them works as well (See comment for "property vfuncs"
Packit ae235b
   * in gio/gdbus-codegen/codegen.py for details)
Packit ae235b
   */
Packit ae235b
  read_as = foo_igen_bar_get_as (proxy);
Packit ae235b
  read_as2 = foo_igen_bar_get_as (proxy);
Packit ae235b
  g_assert_cmpint (g_strv_length ((gchar **) read_as), ==, 2);
Packit ae235b
  g_assert_cmpstr (read_as[0], ==, "one");
Packit ae235b
  g_assert_cmpstr (read_as[1], ==, "two");
Packit ae235b
  g_assert (read_as == read_as2); /* this is more testing an implementation detail */
Packit ae235b
  g_object_set (proxy,
Packit ae235b
                "as", array_of_strings_2,
Packit ae235b
                NULL);
Packit ae235b
  _g_assert_property_notify (proxy, "as");
Packit ae235b
  read_as3 = foo_igen_bar_get_as (proxy);
Packit ae235b
  g_assert_cmpint (g_strv_length ((gchar **) read_as3), ==, 2);
Packit ae235b
  g_assert_cmpstr (read_as3[0], ==, "one2");
Packit ae235b
  g_assert_cmpstr (read_as3[1], ==, "two2");
Packit ae235b
Packit ae235b
  /* Check that grouping changes in idle works.
Packit ae235b
   *
Packit ae235b
   * See on_handle_request_multi_property_mods(). The server should
Packit ae235b
   * emit exactly two PropertiesChanged signals each containing two
Packit ae235b
   * properties.
Packit ae235b
   *
Packit ae235b
   * On the first reception, y and i should both be increased by
Packit ae235b
   * two. On the second reception, only by one. The signal handler
Packit ae235b
   * checks this.
Packit ae235b
   *
Packit ae235b
   * This also checks that _drain_notify() works.
Packit ae235b
   */
Packit ae235b
  data->initial_y = foo_igen_bar_get_y (proxy);
Packit ae235b
  data->initial_i = foo_igen_bar_get_i (proxy);
Packit ae235b
  g_signal_connect (proxy,
Packit ae235b
                    "g-properties-changed",
Packit ae235b
                    G_CALLBACK (on_g_properties_changed),
Packit ae235b
                    data);
Packit ae235b
  error = NULL;
Packit ae235b
  ret = foo_igen_bar_call_request_multi_property_mods_sync (proxy, NULL, &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (ret);
Packit ae235b
  g_main_loop_run (thread_loop);
Packit ae235b
  g_assert_cmpint (data->num_g_properties_changed, ==, 2);
Packit ae235b
  g_signal_handlers_disconnect_by_func (proxy,
Packit ae235b
                                        G_CALLBACK (on_g_properties_changed),
Packit ae235b
                                        data);
Packit ae235b
Packit ae235b
  /* Check that we don't emit PropertiesChanged() if the property
Packit ae235b
   * didn't change... we actually get two notifies.. one for the
Packit ae235b
   * local set (without a value change) and one when receiving
Packit ae235b
   * the PropertiesChanged() signal generated from the remote end.
Packit ae235b
   */
Packit ae235b
  g_assert_cmpint (data->num_notify_u, ==, 0);
Packit ae235b
  g_signal_connect (proxy,
Packit ae235b
                    "notify::u",
Packit ae235b
                    G_CALLBACK (on_notify_u),
Packit ae235b
                    data);
Packit ae235b
  foo_igen_bar_set_u (proxy, 1042);
Packit ae235b
  g_assert_cmpint (data->num_notify_u, ==, 1);
Packit ae235b
  g_assert_cmpint (foo_igen_bar_get_u (proxy), ==, 0);
Packit ae235b
  _g_assert_property_notify (proxy, "u");
Packit ae235b
  g_assert_cmpint (foo_igen_bar_get_u (proxy), ==, 1042);
Packit ae235b
  g_assert_cmpint (data->num_notify_u, ==, 2);
Packit ae235b
Packit ae235b
  /* Now change u again to the same value.. this will cause a
Packit ae235b
   * local notify:: notify and the usual Properties.Set() call
Packit ae235b
   *
Packit ae235b
   * (Btw, why also the Set() call if the value in the cache is
Packit ae235b
   * the same? Because someone else might have changed it
Packit ae235b
   * in the mean time and we're just waiting to receive the
Packit ae235b
   * PropertiesChanged() signal...)
Packit ae235b
   *
Packit ae235b
   * More tricky - how do we check for the *absence* of the
Packit ae235b
   * notification that u changed? Simple: we change another
Packit ae235b
   * property and wait for that PropertiesChanged() message
Packit ae235b
   * to arrive.
Packit ae235b
   */
Packit ae235b
  foo_igen_bar_set_u (proxy, 1042);
Packit ae235b
  g_assert_cmpint (data->num_notify_u, ==, 3);
Packit ae235b
Packit ae235b
  g_assert_cmpint (data->num_notify_n, ==, 0);
Packit ae235b
  g_signal_connect (proxy,
Packit ae235b
                    "notify::n",
Packit ae235b
                    G_CALLBACK (on_notify_n),
Packit ae235b
                    data);
Packit ae235b
  foo_igen_bar_set_n (proxy, 10042);
Packit ae235b
  g_assert_cmpint (data->num_notify_n, ==, 1);
Packit ae235b
  g_assert_cmpint (foo_igen_bar_get_n (proxy), ==, 0);
Packit ae235b
  _g_assert_property_notify (proxy, "n");
Packit ae235b
  g_assert_cmpint (foo_igen_bar_get_n (proxy), ==, 10042);
Packit ae235b
  g_assert_cmpint (data->num_notify_n, ==, 2);
Packit ae235b
  /* Checks that u didn't change at all */
Packit ae235b
  g_assert_cmpint (data->num_notify_u, ==, 3);
Packit ae235b
Packit ae235b
  /* Now we check that if the service does
Packit ae235b
   *
Packit ae235b
   *   guint n = foo_igen_bar_get_n (foo);
Packit ae235b
   *   foo_igen_bar_set_n (foo, n + 1);
Packit ae235b
   *   foo_igen_bar_set_n (foo, n);
Packit ae235b
   *
Packit ae235b
   *  then no PropertiesChanged() signal is emitted!
Packit ae235b
   */
Packit ae235b
  error = NULL;
Packit ae235b
  foo_igen_bar_call_property_cancellation (proxy,
Packit ae235b
                                           NULL, /* GCancellable */
Packit ae235b
                                           (GAsyncReadyCallback) on_property_cancellation_cb,
Packit ae235b
                                           data);
Packit ae235b
  g_main_loop_run (thread_loop);
Packit ae235b
  /* Checks that n didn't change at all */
Packit ae235b
  g_assert_cmpint (data->num_notify_n, ==, 2);
Packit ae235b
Packit ae235b
  /* cleanup */
Packit ae235b
  g_free (data);
Packit ae235b
  g_variant_unref (array_of_signatures);
Packit ae235b
}
Packit ae235b
Packit ae235b
/* ---------------------------------------------------------------------------------------------------- */
Packit ae235b
Packit ae235b
static void
Packit ae235b
on_force_signal (FooiGenBat *proxy,
Packit ae235b
                 GVariant   *force_i,
Packit ae235b
                 GVariant   *force_s,
Packit ae235b
                 GVariant   *force_ay,
Packit ae235b
                 GVariant   *force_struct,
Packit ae235b
                 gpointer    user_data)
Packit ae235b
{
Packit ae235b
  gboolean *signal_received = user_data;
Packit ae235b
  gint val;
Packit ae235b
Packit ae235b
  g_assert (!(*signal_received));
Packit ae235b
Packit ae235b
  g_assert_cmpint (g_variant_get_int32 (force_i), ==, 42 + 10);
Packit ae235b
  g_assert_cmpstr (g_variant_get_string (force_s, NULL), ==, "a string_foo");
Packit ae235b
  g_assert_cmpstr (g_variant_get_bytestring (force_ay), ==, "a bytestring\xff_foo\xff");
Packit ae235b
  g_variant_get (force_struct, "(i)", &val;;
Packit ae235b
  g_assert_cmpint (val, ==, 4200 + 10);
Packit ae235b
Packit ae235b
  *signal_received = TRUE;
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
check_bat_proxy (FooiGenBat *proxy,
Packit ae235b
                 GMainLoop  *thread_loop)
Packit ae235b
{
Packit ae235b
  GError *error;
Packit ae235b
  GVariant *ret_i;
Packit ae235b
  GVariant *ret_s;
Packit ae235b
  GVariant *ret_ay;
Packit ae235b
  GVariant *ret_struct;
Packit ae235b
  gint val;
Packit ae235b
  gboolean force_signal_received;
Packit ae235b
Packit ae235b
  /* --------------------------------------------------- */
Packit ae235b
  /* Check type-mapping where we force use of a GVariant */
Packit ae235b
  /* --------------------------------------------------- */
Packit ae235b
Packit ae235b
  /* check properties */
Packit ae235b
  g_object_get (proxy,
Packit ae235b
                "force-i", &ret_i,
Packit ae235b
                "force-s", &ret_s,
Packit ae235b
                "force-ay", &ret_ay,
Packit ae235b
                "force-struct", &ret_struct,
Packit ae235b
                NULL);
Packit ae235b
  g_assert_cmpint (g_variant_get_int32 (ret_i), ==, 43);
Packit ae235b
  g_assert_cmpstr (g_variant_get_string (ret_s, NULL), ==, "prop string");
Packit ae235b
  g_assert_cmpstr (g_variant_get_bytestring (ret_ay), ==, "prop bytestring\xff");
Packit ae235b
  g_variant_get (ret_struct, "(i)", &val;;
Packit ae235b
  g_assert_cmpint (val, ==, 4300);
Packit ae235b
  g_variant_unref (ret_i);
Packit ae235b
  g_variant_unref (ret_s);
Packit ae235b
  g_variant_unref (ret_ay);
Packit ae235b
  g_variant_unref (ret_struct);
Packit ae235b
Packit ae235b
  /* check method and signal */
Packit ae235b
  force_signal_received = FALSE;
Packit ae235b
  g_signal_connect (proxy,
Packit ae235b
                    "force-signal",
Packit ae235b
                    G_CALLBACK (on_force_signal),
Packit ae235b
                    &force_signal_received);
Packit ae235b
Packit ae235b
  error = NULL;
Packit ae235b
  foo_igen_bat_call_force_method_sync (proxy,
Packit ae235b
                                       g_variant_new_int32 (42),
Packit ae235b
                                       g_variant_new_string ("a string"),
Packit ae235b
                                       g_variant_new_bytestring ("a bytestring\xff"),
Packit ae235b
                                       g_variant_new ("(i)", 4200),
Packit ae235b
                                       &ret_i,
Packit ae235b
                                       &ret_s,
Packit ae235b
                                       &ret_ay,
Packit ae235b
                                       &ret_struct,
Packit ae235b
                                       NULL, /* GCancellable* */
Packit ae235b
                                       &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert_cmpint (g_variant_get_int32 (ret_i), ==, 42 + 10);
Packit ae235b
  g_assert_cmpstr (g_variant_get_string (ret_s, NULL), ==, "a string_foo");
Packit ae235b
  g_assert_cmpstr (g_variant_get_bytestring (ret_ay), ==, "a bytestring\xff_foo\xff");
Packit ae235b
  g_variant_get (ret_struct, "(i)", &val;;
Packit ae235b
  g_assert_cmpint (val, ==, 4200 + 10);
Packit ae235b
  g_variant_unref (ret_i);
Packit ae235b
  g_variant_unref (ret_s);
Packit ae235b
  g_variant_unref (ret_ay);
Packit ae235b
  g_variant_unref (ret_struct);
Packit ae235b
  _g_assert_signal_received (proxy, "force-signal");
Packit ae235b
  g_assert (force_signal_received);
Packit ae235b
}
Packit ae235b
Packit ae235b
/* ---------------------------------------------------------------------------------------------------- */
Packit ae235b
Packit ae235b
static void
Packit ae235b
check_authorize_proxy (FooiGenAuthorize *proxy,
Packit ae235b
                       GMainLoop        *thread_loop)
Packit ae235b
{
Packit ae235b
  GError *error;
Packit ae235b
  gboolean ret;
Packit ae235b
Packit ae235b
  /* Check that g-authorize-method works as intended */
Packit ae235b
Packit ae235b
  error = NULL;
Packit ae235b
  ret = foo_igen_authorize_call_check_not_authorized_sync (proxy, NULL, &error);
Packit ae235b
  g_assert_error (error, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED);
Packit ae235b
  g_error_free (error);
Packit ae235b
  g_assert (!ret);
Packit ae235b
Packit ae235b
  error = NULL;
Packit ae235b
  ret = foo_igen_authorize_call_check_authorized_sync (proxy, NULL, &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (ret);
Packit ae235b
Packit ae235b
  error = NULL;
Packit ae235b
  ret = foo_igen_authorize_call_check_not_authorized_from_object_sync (proxy, NULL, &error);
Packit ae235b
  g_assert_error (error, G_IO_ERROR, G_IO_ERROR_PENDING);
Packit ae235b
  g_error_free (error);
Packit ae235b
  g_assert (!ret);
Packit ae235b
}
Packit ae235b
Packit ae235b
/* ---------------------------------------------------------------------------------------------------- */
Packit ae235b
Packit ae235b
static GThread *
Packit ae235b
get_self_via_proxy (FooiGenMethodThreads *proxy_1)
Packit ae235b
{
Packit ae235b
  GError *error;
Packit ae235b
  gchar *self_str;
Packit ae235b
  gboolean ret;
Packit ae235b
  gpointer self;
Packit ae235b
Packit ae235b
  error = NULL;
Packit ae235b
  ret = foo_igen_method_threads_call_get_self_sync (proxy_1, &self_str, NULL, &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (ret);
Packit ae235b
Packit ae235b
  g_assert_cmpint (sscanf (self_str, "%p", &self), ==, 1);
Packit ae235b
Packit ae235b
  g_free (self_str);
Packit ae235b
Packit ae235b
  return self;
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
check_thread_proxies (FooiGenMethodThreads *proxy_1,
Packit ae235b
                      FooiGenMethodThreads *proxy_2,
Packit ae235b
                      GMainLoop            *thread_loop)
Packit ae235b
{
Packit ae235b
  /* proxy_1 is indeed using threads so should never get the handler thread */
Packit ae235b
  g_assert (get_self_via_proxy (proxy_1) != method_handler_thread);
Packit ae235b
Packit ae235b
  /* proxy_2 is not using threads so should get the handler thread */
Packit ae235b
  g_assert (get_self_via_proxy (proxy_2) == method_handler_thread);
Packit ae235b
}
Packit ae235b
Packit ae235b
/* ---------------------------------------------------------------------------------------------------- */
Packit ae235b
Packit ae235b
static gpointer
Packit ae235b
check_proxies_in_thread (gpointer user_data)
Packit ae235b
{
Packit ae235b
  GMainLoop *loop = user_data;
Packit ae235b
  GMainContext *thread_context;
Packit ae235b
  GMainLoop *thread_loop;
Packit ae235b
  GError *error;
Packit ae235b
  FooiGenBar *bar_proxy;
Packit ae235b
  FooiGenBat *bat_proxy;
Packit ae235b
  FooiGenAuthorize *authorize_proxy;
Packit ae235b
  FooiGenMethodThreads *thread_proxy_1;
Packit ae235b
  FooiGenMethodThreads *thread_proxy_2;
Packit ae235b
Packit ae235b
  thread_context = g_main_context_new ();
Packit ae235b
  thread_loop = g_main_loop_new (thread_context, FALSE);
Packit ae235b
  g_main_context_push_thread_default (thread_context);
Packit ae235b
Packit ae235b
  /* Check the object */
Packit ae235b
  error = NULL;
Packit ae235b
  bar_proxy = foo_igen_bar_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
Packit ae235b
                                                   G_DBUS_PROXY_FLAGS_NONE,
Packit ae235b
                                                   "org.gtk.GDBus.BindingsTool.Test",
Packit ae235b
                                                   "/bar",
Packit ae235b
                                                   NULL, /* GCancellable* */
Packit ae235b
                                                   &error);
Packit ae235b
  check_bar_proxy (bar_proxy, thread_loop);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_object_unref (bar_proxy);
Packit ae235b
Packit ae235b
  error = NULL;
Packit ae235b
  bat_proxy = foo_igen_bat_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
Packit ae235b
                                                   G_DBUS_PROXY_FLAGS_NONE,
Packit ae235b
                                                   "org.gtk.GDBus.BindingsTool.Test",
Packit ae235b
                                                   "/bat",
Packit ae235b
                                                   NULL, /* GCancellable* */
Packit ae235b
                                                   &error);
Packit ae235b
  check_bat_proxy (bat_proxy, thread_loop);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_object_unref (bat_proxy);
Packit ae235b
Packit ae235b
  error = NULL;
Packit ae235b
  authorize_proxy = foo_igen_authorize_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
Packit ae235b
                                                               G_DBUS_PROXY_FLAGS_NONE,
Packit ae235b
                                                               "org.gtk.GDBus.BindingsTool.Test",
Packit ae235b
                                                               "/authorize",
Packit ae235b
                                                               NULL, /* GCancellable* */
Packit ae235b
                                                               &error);
Packit ae235b
  check_authorize_proxy (authorize_proxy, thread_loop);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_object_unref (authorize_proxy);
Packit ae235b
Packit ae235b
  error = NULL;
Packit ae235b
  thread_proxy_1 = foo_igen_method_threads_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
Packit ae235b
                                                                   G_DBUS_PROXY_FLAGS_NONE,
Packit ae235b
                                                                   "org.gtk.GDBus.BindingsTool.Test",
Packit ae235b
                                                                   "/method_threads_1",
Packit ae235b
                                                                   NULL, /* GCancellable* */
Packit ae235b
                                                                   &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  thread_proxy_2 = foo_igen_method_threads_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
Packit ae235b
                                                                   G_DBUS_PROXY_FLAGS_NONE,
Packit ae235b
                                                                   "org.gtk.GDBus.BindingsTool.Test",
Packit ae235b
                                                                   "/method_threads_2",
Packit ae235b
                                                                   NULL, /* GCancellable* */
Packit ae235b
                                                                   &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  check_thread_proxies (thread_proxy_1, thread_proxy_2, thread_loop);
Packit ae235b
  g_object_unref (thread_proxy_1);
Packit ae235b
  g_object_unref (thread_proxy_2);
Packit ae235b
Packit ae235b
  g_main_loop_unref (thread_loop);
Packit ae235b
  g_main_context_unref (thread_context);
Packit ae235b
Packit ae235b
  /* this breaks out of the loop in main() (below) */
Packit ae235b
  g_main_loop_quit (loop);
Packit ae235b
  return NULL;
Packit ae235b
}
Packit ae235b
Packit ae235b
/* ---------------------------------------------------------------------------------------------------- */
Packit ae235b
Packit ae235b
typedef struct
Packit ae235b
{
Packit ae235b
  gchar *xml;
Packit ae235b
  GMainLoop *loop;
Packit ae235b
} IntrospectData;
Packit ae235b
Packit ae235b
static void
Packit ae235b
introspect_cb (GDBusConnection   *connection,
Packit ae235b
               GAsyncResult      *res,
Packit ae235b
               gpointer           user_data)
Packit ae235b
{
Packit ae235b
  IntrospectData *data = user_data;
Packit ae235b
  GVariant *result;
Packit ae235b
  GError *error;
Packit ae235b
Packit ae235b
  error = NULL;
Packit ae235b
  result = g_dbus_connection_call_finish (connection,
Packit ae235b
                                          res,
Packit ae235b
                                          &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (result != NULL);
Packit ae235b
  g_variant_get (result, "(s)", &data->xml);
Packit ae235b
  g_variant_unref (result);
Packit ae235b
Packit ae235b
  g_main_loop_quit (data->loop);
Packit ae235b
}
Packit ae235b
Packit ae235b
static GDBusNodeInfo *
Packit ae235b
introspect (GDBusConnection  *connection,
Packit ae235b
            const gchar      *name,
Packit ae235b
            const gchar      *object_path,
Packit ae235b
            GMainLoop        *loop)
Packit ae235b
{
Packit ae235b
  GError *error;
Packit ae235b
  GDBusNodeInfo *node_info;
Packit ae235b
  IntrospectData *data;
Packit ae235b
Packit ae235b
  data = g_new0 (IntrospectData, 1);
Packit ae235b
  data->xml = NULL;
Packit ae235b
  data->loop = loop;
Packit ae235b
Packit ae235b
  /* do this async to avoid deadlocks */
Packit ae235b
  g_dbus_connection_call (connection,
Packit ae235b
                          name,
Packit ae235b
                          object_path,
Packit ae235b
                          "org.freedesktop.DBus.Introspectable",
Packit ae235b
                          "Introspect",
Packit ae235b
                          NULL, /* params */
Packit ae235b
                          G_VARIANT_TYPE ("(s)"),
Packit ae235b
                          G_DBUS_CALL_FLAGS_NONE,
Packit ae235b
                          -1,
Packit ae235b
                          NULL,
Packit ae235b
                          (GAsyncReadyCallback) introspect_cb,
Packit ae235b
                          data);
Packit ae235b
  g_main_loop_run (loop);
Packit ae235b
  g_assert (data->xml != NULL);
Packit ae235b
Packit ae235b
  error = NULL;
Packit ae235b
  node_info = g_dbus_node_info_new_for_xml (data->xml, &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (node_info != NULL);
Packit ae235b
  g_free (data->xml);
Packit ae235b
  g_free (data);
Packit ae235b
Packit ae235b
  return node_info;
Packit ae235b
}
Packit ae235b
Packit ae235b
static guint
Packit ae235b
count_interfaces (GDBusNodeInfo *info)
Packit ae235b
{
Packit ae235b
  guint n;
Packit ae235b
  for (n = 0; info->interfaces != NULL && info->interfaces[n] != NULL; n++)
Packit ae235b
    ;
Packit ae235b
  return n;
Packit ae235b
}
Packit ae235b
Packit ae235b
static guint
Packit ae235b
count_nodes (GDBusNodeInfo *info)
Packit ae235b
{
Packit ae235b
  guint n;
Packit ae235b
  for (n = 0; info->nodes != NULL && info->nodes[n] != NULL; n++)
Packit ae235b
    ;
Packit ae235b
  return n;
Packit ae235b
}
Packit ae235b
Packit ae235b
static guint
Packit ae235b
has_interface (GDBusNodeInfo *info,
Packit ae235b
               const gchar   *name)
Packit ae235b
{
Packit ae235b
  guint n;
Packit ae235b
  for (n = 0; info->interfaces != NULL && info->interfaces[n] != NULL; n++)
Packit ae235b
    {
Packit ae235b
      if (g_strcmp0 (info->interfaces[n]->name, name) == 0)
Packit ae235b
        return TRUE;
Packit ae235b
    }
Packit ae235b
  return FALSE;
Packit ae235b
}
Packit ae235b
Packit ae235b
/* ---------------------------------------------------------------------------------------------------- */
Packit ae235b
Packit ae235b
typedef struct {
Packit ae235b
  GMainLoop *loop;
Packit ae235b
  GVariant *result;
Packit ae235b
} OMGetManagedObjectsData;
Packit ae235b
Packit ae235b
static void
Packit ae235b
om_get_all_cb (GDBusConnection *connection,
Packit ae235b
               GAsyncResult    *res,
Packit ae235b
               gpointer         user_data)
Packit ae235b
{
Packit ae235b
  OMGetManagedObjectsData *data = user_data;
Packit ae235b
  GError *error;
Packit ae235b
Packit ae235b
  error = NULL;
Packit ae235b
  data->result = g_dbus_connection_call_finish (connection,
Packit ae235b
                                                res,
Packit ae235b
                                                &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (data->result != NULL);
Packit ae235b
  g_main_loop_quit (data->loop);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
om_check_get_all (GDBusConnection *c,
Packit ae235b
                  GMainLoop       *loop,
Packit ae235b
                  const gchar     *str)
Packit ae235b
{
Packit ae235b
  OMGetManagedObjectsData data;
Packit ae235b
  gchar *s;
Packit ae235b
Packit ae235b
  data.loop = loop;
Packit ae235b
  data.result = NULL;
Packit ae235b
Packit ae235b
  /* do this async to avoid deadlocks */
Packit ae235b
  g_dbus_connection_call (c,
Packit ae235b
                          g_dbus_connection_get_unique_name (c),
Packit ae235b
                          "/managed",
Packit ae235b
                          "org.freedesktop.DBus.ObjectManager",
Packit ae235b
                          "GetManagedObjects",
Packit ae235b
                          NULL, /* params */
Packit ae235b
                          G_VARIANT_TYPE ("(a{oa{sa{sv}}})"),
Packit ae235b
                          G_DBUS_CALL_FLAGS_NONE,
Packit ae235b
                          -1,
Packit ae235b
                          NULL,
Packit ae235b
                          (GAsyncReadyCallback) om_get_all_cb,
Packit ae235b
                          &data);
Packit ae235b
  g_main_loop_run (loop);
Packit ae235b
  g_assert (data.result != NULL);
Packit ae235b
  s = g_variant_print (data.result, TRUE);
Packit ae235b
  g_assert_cmpstr (s, ==, str);
Packit ae235b
  g_free (s);
Packit ae235b
  g_variant_unref (data.result);
Packit ae235b
}
Packit ae235b
Packit ae235b
typedef struct
Packit ae235b
{
Packit ae235b
  GMainLoop *loop;
Packit ae235b
  guint state;
Packit ae235b
Packit ae235b
  guint num_object_proxy_added_signals;
Packit ae235b
  guint num_object_proxy_removed_signals;
Packit ae235b
  guint num_interface_added_signals;
Packit ae235b
  guint num_interface_removed_signals;
Packit ae235b
} OMData;
Packit ae235b
Packit ae235b
static gint
Packit ae235b
my_pstrcmp (const gchar **a, const gchar **b)
Packit ae235b
{
Packit ae235b
  return g_strcmp0 (*a, *b);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
om_check_interfaces_added (const gchar *signal_name,
Packit ae235b
                           GVariant *parameters,
Packit ae235b
                           const gchar *object_path,
Packit ae235b
                           const gchar *first_interface_name,
Packit ae235b
                           ...)
Packit ae235b
{
Packit ae235b
  const gchar *path;
Packit ae235b
  GVariant *array;
Packit ae235b
  guint n;
Packit ae235b
  GPtrArray *interfaces;
Packit ae235b
  GPtrArray *interfaces_in_message;
Packit ae235b
  va_list var_args;
Packit ae235b
  const gchar *str;
Packit ae235b
Packit ae235b
  interfaces = g_ptr_array_new ();
Packit ae235b
  g_ptr_array_add (interfaces, (gpointer) first_interface_name);
Packit ae235b
  va_start (var_args, first_interface_name);
Packit ae235b
  do
Packit ae235b
    {
Packit ae235b
      str = va_arg (var_args, const gchar *);
Packit ae235b
      if (str == NULL)
Packit ae235b
        break;
Packit ae235b
      g_ptr_array_add (interfaces, (gpointer) str);
Packit ae235b
    }
Packit ae235b
  while (TRUE);
Packit ae235b
  va_end (var_args);
Packit ae235b
Packit ae235b
  g_variant_get (parameters, "(&o*)", &path, &array);
Packit ae235b
  g_assert_cmpstr (signal_name, ==, "InterfacesAdded");
Packit ae235b
  g_assert_cmpstr (path, ==, object_path);
Packit ae235b
  g_assert_cmpint (g_variant_n_children (array), ==, interfaces->len);
Packit ae235b
  interfaces_in_message = g_ptr_array_new ();
Packit ae235b
  for (n = 0; n < interfaces->len; n++)
Packit ae235b
    {
Packit ae235b
      const gchar *iface_name;
Packit ae235b
      g_variant_get_child (array, n, "{&sa{sv}}", &iface_name, NULL);
Packit ae235b
      g_ptr_array_add (interfaces_in_message, (gpointer) iface_name);
Packit ae235b
    }
Packit ae235b
  g_assert_cmpint (interfaces_in_message->len, ==, interfaces->len);
Packit ae235b
  g_ptr_array_sort (interfaces, (GCompareFunc) my_pstrcmp);
Packit ae235b
  g_ptr_array_sort (interfaces_in_message, (GCompareFunc) my_pstrcmp);
Packit ae235b
  for (n = 0; n < interfaces->len; n++)
Packit ae235b
    g_assert_cmpstr (interfaces->pdata[n], ==, interfaces_in_message->pdata[n]);
Packit ae235b
  g_ptr_array_unref (interfaces_in_message);
Packit ae235b
  g_ptr_array_unref (interfaces);
Packit ae235b
  g_variant_unref (array);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
om_check_interfaces_removed (const gchar *signal_name,
Packit ae235b
                             GVariant *parameters,
Packit ae235b
                             const gchar *object_path,
Packit ae235b
                             const gchar *first_interface_name,
Packit ae235b
                             ...)
Packit ae235b
{
Packit ae235b
  const gchar *path;
Packit ae235b
  GVariant *array;
Packit ae235b
  guint n;
Packit ae235b
  GPtrArray *interfaces;
Packit ae235b
  GPtrArray *interfaces_in_message;
Packit ae235b
  va_list var_args;
Packit ae235b
  const gchar *str;
Packit ae235b
Packit ae235b
  interfaces = g_ptr_array_new ();
Packit ae235b
  g_ptr_array_add (interfaces, (gpointer) first_interface_name);
Packit ae235b
  va_start (var_args, first_interface_name);
Packit ae235b
  do
Packit ae235b
    {
Packit ae235b
      str = va_arg (var_args, const gchar *);
Packit ae235b
      if (str == NULL)
Packit ae235b
        break;
Packit ae235b
      g_ptr_array_add (interfaces, (gpointer) str);
Packit ae235b
    }
Packit ae235b
  while (TRUE);
Packit ae235b
  va_end (var_args);
Packit ae235b
Packit ae235b
  g_variant_get (parameters, "(&o*)", &path, &array);
Packit ae235b
  g_assert_cmpstr (signal_name, ==, "InterfacesRemoved");
Packit ae235b
  g_assert_cmpstr (path, ==, object_path);
Packit ae235b
  g_assert_cmpint (g_variant_n_children (array), ==, interfaces->len);
Packit ae235b
  interfaces_in_message = g_ptr_array_new ();
Packit ae235b
  for (n = 0; n < interfaces->len; n++)
Packit ae235b
    {
Packit ae235b
      const gchar *iface_name;
Packit ae235b
      g_variant_get_child (array, n, "&s", &iface_name, NULL);
Packit ae235b
      g_ptr_array_add (interfaces_in_message, (gpointer) iface_name);
Packit ae235b
    }
Packit ae235b
  g_assert_cmpint (interfaces_in_message->len, ==, interfaces->len);
Packit ae235b
  g_ptr_array_sort (interfaces, (GCompareFunc) my_pstrcmp);
Packit ae235b
  g_ptr_array_sort (interfaces_in_message, (GCompareFunc) my_pstrcmp);
Packit ae235b
  for (n = 0; n < interfaces->len; n++)
Packit ae235b
    g_assert_cmpstr (interfaces->pdata[n], ==, interfaces_in_message->pdata[n]);
Packit ae235b
  g_ptr_array_unref (interfaces_in_message);
Packit ae235b
  g_ptr_array_unref (interfaces);
Packit ae235b
  g_variant_unref (array);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
om_on_signal (GDBusConnection *connection,
Packit ae235b
              const gchar     *sender_name,
Packit ae235b
              const gchar     *object_path,
Packit ae235b
              const gchar     *interface_name,
Packit ae235b
              const gchar     *signal_name,
Packit ae235b
              GVariant        *parameters,
Packit ae235b
              gpointer         user_data)
Packit ae235b
{
Packit ae235b
  OMData *om_data = user_data;
Packit ae235b
Packit ae235b
  //g_debug ("foo: %s", g_variant_print (parameters, TRUE));
Packit ae235b
Packit ae235b
  switch (om_data->state)
Packit ae235b
    {
Packit ae235b
    default:
Packit ae235b
    case 0:
Packit ae235b
      g_printerr ("failing and om_data->state=%d on signal %s, params=%s\n",
Packit ae235b
               om_data->state,
Packit ae235b
               signal_name,
Packit ae235b
               g_variant_print (parameters, TRUE));
Packit ae235b
      g_assert_not_reached ();
Packit ae235b
      break;
Packit ae235b
Packit ae235b
    case 1:
Packit ae235b
      om_check_interfaces_added (signal_name, parameters, "/managed/first",
Packit ae235b
                                 "org.project.Bar", NULL);
Packit ae235b
      om_data->state = 2;
Packit ae235b
      g_main_loop_quit (om_data->loop);
Packit ae235b
      break;
Packit ae235b
Packit ae235b
    case 3:
Packit ae235b
      om_check_interfaces_removed (signal_name, parameters, "/managed/first",
Packit ae235b
                                   "org.project.Bar", NULL);
Packit ae235b
      om_data->state = 5;
Packit ae235b
      /* keep running the loop */
Packit ae235b
      break;
Packit ae235b
Packit ae235b
    case 5:
Packit ae235b
      om_check_interfaces_added (signal_name, parameters, "/managed/first",
Packit ae235b
                                 "org.project.Bar", NULL);
Packit ae235b
      om_data->state = 6;
Packit ae235b
      g_main_loop_quit (om_data->loop);
Packit ae235b
      break;
Packit ae235b
Packit ae235b
    case 7:
Packit ae235b
      om_check_interfaces_removed (signal_name, parameters, "/managed/first",
Packit ae235b
                                   "org.project.Bar", NULL);
Packit ae235b
      om_data->state = 9;
Packit ae235b
      /* keep running the loop */
Packit ae235b
      break;
Packit ae235b
Packit ae235b
    case 9:
Packit ae235b
      om_check_interfaces_added (signal_name, parameters, "/managed/first",
Packit ae235b
                                 "org.project.Bar", NULL);
Packit ae235b
      om_data->state = 10;
Packit ae235b
      g_main_loop_quit (om_data->loop);
Packit ae235b
      break;
Packit ae235b
Packit ae235b
    case 11:
Packit ae235b
      om_check_interfaces_added (signal_name, parameters, "/managed/first",
Packit ae235b
                                 "org.project.Bat", NULL);
Packit ae235b
      om_data->state = 12;
Packit ae235b
      g_main_loop_quit (om_data->loop);
Packit ae235b
      break;
Packit ae235b
Packit ae235b
    case 13:
Packit ae235b
      om_check_interfaces_removed (signal_name, parameters, "/managed/first",
Packit ae235b
                                   "org.project.Bar", NULL);
Packit ae235b
      om_data->state = 14;
Packit ae235b
      g_main_loop_quit (om_data->loop);
Packit ae235b
      break;
Packit ae235b
Packit ae235b
    case 15:
Packit ae235b
      om_check_interfaces_removed (signal_name, parameters, "/managed/first",
Packit ae235b
                                   "org.project.Bat", NULL);
Packit ae235b
      om_data->state = 16;
Packit ae235b
      g_main_loop_quit (om_data->loop);
Packit ae235b
      break;
Packit ae235b
Packit ae235b
    case 17:
Packit ae235b
      om_check_interfaces_added (signal_name, parameters, "/managed/first",
Packit ae235b
                                 "com.acme.Coyote", NULL);
Packit ae235b
      om_data->state = 18;
Packit ae235b
      g_main_loop_quit (om_data->loop);
Packit ae235b
      break;
Packit ae235b
Packit ae235b
    case 101:
Packit ae235b
      om_check_interfaces_added (signal_name, parameters, "/managed/second",
Packit ae235b
                                 "org.project.Bat", "org.project.Bar", NULL);
Packit ae235b
      om_data->state = 102;
Packit ae235b
      g_main_loop_quit (om_data->loop);
Packit ae235b
      break;
Packit ae235b
Packit ae235b
    case 103:
Packit ae235b
      om_check_interfaces_removed (signal_name, parameters, "/managed/second",
Packit ae235b
                                   "org.project.Bat", "org.project.Bar", NULL);
Packit ae235b
      om_data->state = 104;
Packit ae235b
      g_main_loop_quit (om_data->loop);
Packit ae235b
      break;
Packit ae235b
Packit ae235b
    case 200:
Packit ae235b
      om_check_interfaces_added (signal_name, parameters, "/managed/first_1",
Packit ae235b
                                 "com.acme.Coyote", NULL);
Packit ae235b
      om_data->state = 201;
Packit ae235b
      g_main_loop_quit (om_data->loop);
Packit ae235b
      break;
Packit ae235b
    }
Packit ae235b
}
Packit ae235b
Packit ae235b
static GAsyncResult *om_res = NULL;
Packit ae235b
Packit ae235b
static void
Packit ae235b
om_pm_start_cb (FooiGenObjectManagerClient *manager,
Packit ae235b
                GAsyncResult               *res,
Packit ae235b
                gpointer                    user_data)
Packit ae235b
{
Packit ae235b
  GMainLoop *loop = user_data;
Packit ae235b
  om_res = g_object_ref (res);
Packit ae235b
  g_main_loop_quit (loop);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
on_interface_added (GDBusObject    *object,
Packit ae235b
                    GDBusInterface *interface,
Packit ae235b
                    gpointer        user_data)
Packit ae235b
{
Packit ae235b
  OMData *om_data = user_data;
Packit ae235b
  om_data->num_interface_added_signals += 1;
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
on_interface_removed (GDBusObject    *object,
Packit ae235b
                      GDBusInterface *interface,
Packit ae235b
                      gpointer        user_data)
Packit ae235b
{
Packit ae235b
  OMData *om_data = user_data;
Packit ae235b
  om_data->num_interface_removed_signals += 1;
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
on_object_proxy_added (GDBusObjectManagerClient  *manager,
Packit ae235b
                       GDBusObjectProxy   *object_proxy,
Packit ae235b
                       gpointer            user_data)
Packit ae235b
{
Packit ae235b
  OMData *om_data = user_data;
Packit ae235b
  om_data->num_object_proxy_added_signals += 1;
Packit ae235b
  g_signal_connect (object_proxy,
Packit ae235b
                    "interface-added",
Packit ae235b
                    G_CALLBACK (on_interface_added),
Packit ae235b
                    om_data);
Packit ae235b
  g_signal_connect (object_proxy,
Packit ae235b
                    "interface-removed",
Packit ae235b
                    G_CALLBACK (on_interface_removed),
Packit ae235b
                    om_data);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
on_object_proxy_removed (GDBusObjectManagerClient  *manager,
Packit ae235b
                         GDBusObjectProxy   *object_proxy,
Packit ae235b
                         gpointer            user_data)
Packit ae235b
{
Packit ae235b
  OMData *om_data = user_data;
Packit ae235b
  om_data->num_object_proxy_removed_signals += 1;
Packit ae235b
  g_assert_cmpint (g_signal_handlers_disconnect_by_func (object_proxy,
Packit ae235b
                                                         G_CALLBACK (on_interface_added),
Packit ae235b
                                                         om_data), ==, 1);
Packit ae235b
  g_assert_cmpint (g_signal_handlers_disconnect_by_func (object_proxy,
Packit ae235b
                                                         G_CALLBACK (on_interface_removed),
Packit ae235b
                                                         om_data), ==, 1);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
property_d_changed (GObject    *object,
Packit ae235b
		    GParamSpec *pspec,
Packit ae235b
		    gpointer    user_data)
Packit ae235b
{
Packit ae235b
  gboolean *changed = user_data;
Packit ae235b
Packit ae235b
  *changed = TRUE;
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
om_check_property_and_signal_emission (GMainLoop  *loop,
Packit ae235b
                                       FooiGenBar *skeleton,
Packit ae235b
                                       FooiGenBar *proxy)
Packit ae235b
{
Packit ae235b
  gboolean d_changed = FALSE;
Packit ae235b
  guint handler;
Packit ae235b
Packit ae235b
  /* First PropertiesChanged */
Packit ae235b
  g_assert_cmpint (foo_igen_bar_get_i (skeleton), ==, 0);
Packit ae235b
  g_assert_cmpint (foo_igen_bar_get_i (proxy), ==, 0);
Packit ae235b
  foo_igen_bar_set_i (skeleton, 1);
Packit ae235b
  _g_assert_property_notify (proxy, "i");
Packit ae235b
  g_assert_cmpint (foo_igen_bar_get_i (skeleton), ==, 1);
Packit ae235b
  g_assert_cmpint (foo_igen_bar_get_i (proxy), ==, 1);
Packit ae235b
Packit ae235b
  /* Double-check the gdouble case */
Packit ae235b
  g_assert_cmpfloat (foo_igen_bar_get_d (skeleton), ==, 0.0);
Packit ae235b
  g_assert_cmpfloat (foo_igen_bar_get_d (proxy), ==, 0.0);
Packit ae235b
  foo_igen_bar_set_d (skeleton, 1.0);
Packit ae235b
  _g_assert_property_notify (proxy, "d");
Packit ae235b
Packit ae235b
  /* Verify that re-setting it to the same value doesn't cause a
Packit ae235b
   * notify on the proxy, by taking advantage of the fact that
Packit ae235b
   * notifications are serialized.
Packit ae235b
   */
Packit ae235b
  handler = g_signal_connect (proxy, "notify::d",
Packit ae235b
			      G_CALLBACK (property_d_changed), &d_changed);
Packit ae235b
  foo_igen_bar_set_d (skeleton, 1.0);
Packit ae235b
  foo_igen_bar_set_i (skeleton, 2);
Packit ae235b
  _g_assert_property_notify (proxy, "i");
Packit ae235b
  g_assert (d_changed == FALSE);
Packit ae235b
  g_signal_handler_disconnect (proxy, handler);
Packit ae235b
Packit ae235b
  /* Then just a regular signal */
Packit ae235b
  foo_igen_bar_emit_another_signal (skeleton, "word");
Packit ae235b
  _g_assert_signal_received (proxy, "another-signal");
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
check_object_manager (void)
Packit ae235b
{
Packit ae235b
  FooiGenObjectSkeleton *o = NULL;
Packit ae235b
  FooiGenObjectSkeleton *o2 = NULL;
Packit ae235b
  FooiGenObjectSkeleton *o3 = NULL;
Packit ae235b
  GDBusInterfaceSkeleton *i;
Packit ae235b
  GDBusConnection *c;
Packit ae235b
  GDBusObjectManagerServer *manager = NULL;
Packit ae235b
  GDBusNodeInfo *info;
Packit ae235b
  GError *error;
Packit ae235b
  GMainLoop *loop;
Packit ae235b
  OMData *om_data = NULL;
Packit ae235b
  guint om_signal_id = -1;
Packit ae235b
  GDBusObjectManager *pm = NULL;
Packit ae235b
  GList *object_proxies;
Packit ae235b
  GList *proxies;
Packit ae235b
  GDBusObject *op;
Packit ae235b
  GDBusProxy *p;
Packit ae235b
  FooiGenBar *bar_skeleton;
Packit ae235b
  GDBusInterface *iface;
Packit ae235b
  gchar *path, *name, *name_owner;
Packit ae235b
  GDBusConnection *c2;
Packit ae235b
  GDBusObjectManagerClientFlags flags;
Packit ae235b
Packit ae235b
  loop = g_main_loop_new (NULL, FALSE);
Packit ae235b
Packit ae235b
  om_data = g_new0 (OMData, 1);
Packit ae235b
  om_data->loop = loop;
Packit ae235b
  om_data->state = 0;
Packit ae235b
Packit ae235b
  error = NULL;
Packit ae235b
  c = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (c != NULL);
Packit ae235b
Packit ae235b
  om_signal_id = g_dbus_connection_signal_subscribe (c,
Packit ae235b
                                                     NULL, /* sender */
Packit ae235b
                                                     "org.freedesktop.DBus.ObjectManager",
Packit ae235b
                                                     NULL, /* member */
Packit ae235b
                                                     NULL, /* object_path */
Packit ae235b
                                                     NULL, /* arg0 */
Packit ae235b
                                                     G_DBUS_SIGNAL_FLAGS_NONE,
Packit ae235b
                                                     om_on_signal,
Packit ae235b
                                                     om_data,
Packit ae235b
                                                     NULL); /* user_data_free_func */
Packit ae235b
Packit ae235b
  /* Our GDBusObjectManagerClient tests are simple - we basically just count the
Packit ae235b
   * number of times the various signals have been emitted (we don't check
Packit ae235b
   * that the right objects/interfaces are passed though - that's checked
Packit ae235b
   * in the lower-level tests in om_on_signal()...)
Packit ae235b
   *
Packit ae235b
   * Note that these tests rely on the D-Bus signal handlers used by
Packit ae235b
   * GDBusObjectManagerClient firing before om_on_signal().
Packit ae235b
   */
Packit ae235b
  error = NULL;
Packit ae235b
  pm = foo_igen_object_manager_client_new_sync (c,
Packit ae235b
                                                G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
Packit ae235b
                                                g_dbus_connection_get_unique_name (c),
Packit ae235b
                                                "/managed",
Packit ae235b
                                                NULL, /* GCancellable */
Packit ae235b
                                                &error);
Packit ae235b
  g_assert_error (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD);
Packit ae235b
  g_error_free (error);
Packit ae235b
  g_assert (pm == NULL);
Packit ae235b
Packit ae235b
  manager = g_dbus_object_manager_server_new ("/managed");
Packit ae235b
Packit ae235b
  g_assert (g_dbus_object_manager_server_get_connection (manager) == NULL);
Packit ae235b
Packit ae235b
  g_dbus_object_manager_server_set_connection (manager, c);
Packit ae235b
Packit ae235b
  g_assert_cmpstr (g_dbus_object_manager_get_object_path (G_DBUS_OBJECT_MANAGER (manager)), ==, "/managed");
Packit ae235b
  g_object_get (manager, "object-path", &path, "connection", &c2, NULL);
Packit ae235b
  g_assert_cmpstr (path, ==, "/managed");
Packit ae235b
  g_assert (c2 == c);
Packit ae235b
  g_free (path);
Packit ae235b
  g_clear_object (&c2;;
Packit ae235b
Packit ae235b
  /* Check that the manager object is visible */
Packit ae235b
  info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed", loop);
Packit ae235b
  g_assert_cmpint (count_interfaces (info), ==, 4); /* ObjectManager + Properties,Introspectable,Peer */
Packit ae235b
  g_assert (has_interface (info, "org.freedesktop.DBus.ObjectManager"));
Packit ae235b
  g_assert_cmpint (count_nodes (info), ==, 0);
Packit ae235b
  g_dbus_node_info_unref (info);
Packit ae235b
Packit ae235b
  /* Check GetManagedObjects() - should be empty since we have no objects */
Packit ae235b
  om_check_get_all (c, loop,
Packit ae235b
                    "(@a{oa{sa{sv}}} {},)");
Packit ae235b
Packit ae235b
  /* Now try to create the proxy manager again - this time it should work */
Packit ae235b
  error = NULL;
Packit ae235b
  foo_igen_object_manager_client_new (c,
Packit ae235b
                                      G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
Packit ae235b
                                      g_dbus_connection_get_unique_name (c),
Packit ae235b
                                      "/managed",
Packit ae235b
                                      NULL, /* GCancellable */
Packit ae235b
                                      (GAsyncReadyCallback) om_pm_start_cb,
Packit ae235b
                                      loop);
Packit ae235b
  g_main_loop_run (loop);
Packit ae235b
  error = NULL;
Packit ae235b
  pm = foo_igen_object_manager_client_new_finish (om_res, &error);
Packit ae235b
  g_clear_object (&om_res);
Packit ae235b
  g_assert_no_error (error);
Packit ae235b
  g_assert (pm != NULL);
Packit ae235b
  g_signal_connect (pm,
Packit ae235b
                    "object-added",
Packit ae235b
                    G_CALLBACK (on_object_proxy_added),
Packit ae235b
                    om_data);
Packit ae235b
  g_signal_connect (pm,
Packit ae235b
                    "object-removed",
Packit ae235b
                    G_CALLBACK (on_object_proxy_removed),
Packit ae235b
                    om_data);
Packit ae235b
Packit ae235b
  g_assert_cmpstr (g_dbus_object_manager_get_object_path (G_DBUS_OBJECT_MANAGER (pm)), ==, "/managed");
Packit ae235b
  g_object_get (pm,
Packit ae235b
                "object-path", &path,
Packit ae235b
                "connection", &c2,
Packit ae235b
                "name", &name,
Packit ae235b
                "name-owner", &name_owner,
Packit ae235b
                "flags", &flags,
Packit ae235b
                NULL);
Packit ae235b
  g_assert_cmpstr (path, ==, "/managed");
Packit ae235b
  g_assert_cmpstr (name, ==, g_dbus_connection_get_unique_name (c));
Packit ae235b
  g_assert_cmpstr (name_owner, ==, g_dbus_connection_get_unique_name (c));
Packit ae235b
  g_assert_cmpint (flags, ==, G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE);
Packit ae235b
  g_assert (c2 == c);
Packit ae235b
  g_free (path);
Packit ae235b
  g_clear_object (&c2;;
Packit ae235b
  g_free (name);
Packit ae235b
  g_free (name_owner);
Packit ae235b
Packit ae235b
  /* ... check there are no object proxies yet */
Packit ae235b
  object_proxies = g_dbus_object_manager_get_objects (pm);
Packit ae235b
  g_assert (object_proxies == NULL);
Packit ae235b
Packit ae235b
  /* First, export an object with a single interface (also check that
Packit ae235b
   * g_dbus_interface_get_object() works and that the object isn't reffed)
Packit ae235b
   */
Packit ae235b
  o = foo_igen_object_skeleton_new ("/managed/first");
Packit ae235b
  i = G_DBUS_INTERFACE_SKELETON (foo_igen_bar_skeleton_new ());
Packit ae235b
  g_assert (g_dbus_interface_get_object (G_DBUS_INTERFACE (i)) == NULL);
Packit ae235b
  g_assert_cmpint (G_OBJECT (o)->ref_count, ==, 1);
Packit ae235b
  foo_igen_object_skeleton_set_bar (o, FOO_IGEN_BAR (i));
Packit ae235b
  g_assert_cmpint (G_OBJECT (o)->ref_count, ==, 1);
Packit ae235b
  g_assert (g_dbus_interface_get_object (G_DBUS_INTERFACE (i)) == G_DBUS_OBJECT (o));
Packit ae235b
  g_assert_cmpint (G_OBJECT (o)->ref_count, ==, 1);
Packit ae235b
  foo_igen_object_skeleton_set_bar (o, NULL);
Packit ae235b
  g_assert (g_dbus_interface_get_object (G_DBUS_INTERFACE (i)) == NULL);
Packit ae235b
  g_assert_cmpint (G_OBJECT (o)->ref_count, ==, 1);
Packit ae235b
  foo_igen_object_skeleton_set_bar (o, FOO_IGEN_BAR (i));
Packit ae235b
  g_assert (g_dbus_interface_get_object (G_DBUS_INTERFACE (i)) == G_DBUS_OBJECT (o));
Packit ae235b
  g_assert_cmpint (G_OBJECT (o)->ref_count, ==, 1);
Packit ae235b
Packit ae235b
  o2 = FOO_IGEN_OBJECT_SKELETON (g_dbus_interface_dup_object (G_DBUS_INTERFACE (i)));
Packit ae235b
  g_assert (G_DBUS_OBJECT (o2) == G_DBUS_OBJECT (o));
Packit ae235b
  g_assert_cmpint (G_OBJECT (o2)->ref_count, ==, 2);
Packit ae235b
  g_clear_object (&o2;;
Packit ae235b
Packit ae235b
  g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (o));
Packit ae235b
Packit ae235b
  /* ... check we get the InterfacesAdded signal */
Packit ae235b
  om_data->state = 1;
Packit ae235b
Packit ae235b
  g_main_loop_run (om_data->loop);
Packit ae235b
Packit ae235b
  g_assert_cmpint (om_data->state, ==, 2);
Packit ae235b
  g_assert_cmpint (om_data->num_object_proxy_added_signals, ==, 1);
Packit ae235b
  g_assert_cmpint (om_data->num_object_proxy_removed_signals, ==, 0);
Packit ae235b
  g_assert_cmpint (om_data->num_interface_added_signals, ==, 0);
Packit ae235b
  g_assert_cmpint (om_data->num_interface_removed_signals, ==, 0);
Packit ae235b
  /* ... check there's one non-standard interfaces */
Packit ae235b
  info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed/first", loop);
Packit ae235b
  g_assert_cmpint (count_interfaces (info), ==, 4); /* Bar + Properties,Introspectable,Peer */
Packit ae235b
  g_assert (has_interface (info, "org.project.Bar"));
Packit ae235b
  g_dbus_node_info_unref (info);
Packit ae235b
Packit ae235b
  /* Also check g_dbus_object_manager_get_interface */
Packit ae235b
  iface = g_dbus_object_manager_get_interface (G_DBUS_OBJECT_MANAGER (manager), "/managed/first", "org.project.Bar");
Packit ae235b
  g_assert (iface != NULL);
Packit ae235b
  g_clear_object (&iface);
Packit ae235b
  iface = g_dbus_object_manager_get_interface (G_DBUS_OBJECT_MANAGER (manager), "/managed/first", "org.project.Bat");
Packit ae235b
  g_assert (iface == NULL);
Packit ae235b
  iface = g_dbus_object_manager_get_interface (G_DBUS_OBJECT_MANAGER (pm), "/managed/first", "org.project.Bar");
Packit ae235b
  g_assert (iface != NULL);
Packit ae235b
  g_clear_object (&iface);
Packit ae235b
  iface = g_dbus_object_manager_get_interface (G_DBUS_OBJECT_MANAGER (pm), "/managed/first", "org.project.Bat");
Packit ae235b
  g_assert (iface == NULL);
Packit ae235b
Packit ae235b
  /* Now, check adding the same interface replaces the existing one */
Packit ae235b
  foo_igen_object_skeleton_set_bar (o, FOO_IGEN_BAR (i));
Packit ae235b
  /* ... check we get the InterfacesRemoved */
Packit ae235b
  om_data->state = 3;
Packit ae235b
  g_main_loop_run (om_data->loop);
Packit ae235b
  /* ... and then check we get the InterfacesAdded */
Packit ae235b
  g_assert_cmpint (om_data->state, ==, 6);
Packit ae235b
  g_assert_cmpint (om_data->num_object_proxy_added_signals, ==, 2);
Packit ae235b
  g_assert_cmpint (om_data->num_object_proxy_removed_signals, ==, 1);
Packit ae235b
  g_assert_cmpint (om_data->num_interface_added_signals, ==, 0);
Packit ae235b
  g_assert_cmpint (om_data->num_interface_removed_signals, ==, 0);
Packit ae235b
  /* ... check introspection data */
Packit ae235b
  info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed/first", loop);
Packit ae235b
  g_assert_cmpint (count_interfaces (info), ==, 4); /* Bar + Properties,Introspectable,Peer */
Packit ae235b
  g_assert (has_interface (info, "org.project.Bar"));
Packit ae235b
  g_dbus_node_info_unref (info);
Packit ae235b
  g_clear_object (&i);
Packit ae235b
Packit ae235b
  /* check adding an interface of same type (but not same object) replaces the existing one */
Packit ae235b
  i = G_DBUS_INTERFACE_SKELETON (foo_igen_bar_skeleton_new ());
Packit ae235b
  foo_igen_object_skeleton_set_bar (o, FOO_IGEN_BAR (i));
Packit ae235b
  /* ... check we get the InterfacesRemoved and then InterfacesAdded */
Packit ae235b
  om_data->state = 7;
Packit ae235b
  g_main_loop_run (om_data->loop);
Packit ae235b
  g_assert_cmpint (om_data->state, ==, 10);
Packit ae235b
  g_assert_cmpint (om_data->num_object_proxy_added_signals, ==, 3);
Packit ae235b
  g_assert_cmpint (om_data->num_object_proxy_removed_signals, ==, 2);
Packit ae235b
  g_assert_cmpint (om_data->num_interface_added_signals, ==, 0);
Packit ae235b
  g_assert_cmpint (om_data->num_interface_removed_signals, ==, 0);
Packit ae235b
  /* ... check introspection data */
Packit ae235b
  info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed/first", loop);
Packit ae235b
  g_assert_cmpint (count_interfaces (info), ==, 4); /* Bar + Properties,Introspectable,Peer */
Packit ae235b
  g_assert (has_interface (info, "org.project.Bar"));
Packit ae235b
  g_dbus_node_info_unref (info);
Packit ae235b
  g_clear_object (&i);
Packit ae235b
Packit ae235b
  /* check adding an interface of another type doesn't replace the existing one */
Packit ae235b
  i = G_DBUS_INTERFACE_SKELETON (foo_igen_bat_skeleton_new ());
Packit ae235b
  foo_igen_object_skeleton_set_bat (o, FOO_IGEN_BAT (i));
Packit ae235b
  g_clear_object (&i);
Packit ae235b
  /* ... check we get the InterfacesAdded */
Packit ae235b
  om_data->state = 11;
Packit ae235b
  g_main_loop_run (om_data->loop);
Packit ae235b
  g_assert_cmpint (om_data->state, ==, 12);
Packit ae235b
  g_assert_cmpint (om_data->num_object_proxy_added_signals, ==, 3);
Packit ae235b
  g_assert_cmpint (om_data->num_object_proxy_removed_signals, ==, 2);
Packit ae235b
  g_assert_cmpint (om_data->num_interface_added_signals, ==, 1);
Packit ae235b
  g_assert_cmpint (om_data->num_interface_removed_signals, ==, 0);
Packit ae235b
  /* ... check introspection data */
Packit ae235b
  info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed/first", loop);
Packit ae235b
  g_assert_cmpint (count_interfaces (info), ==, 5); /* Bar,Bat + Properties,Introspectable,Peer */
Packit ae235b
  g_assert (has_interface (info, "org.project.Bar"));
Packit ae235b
  g_assert (has_interface (info, "org.project.Bat"));
Packit ae235b
  g_dbus_node_info_unref (info);
Packit ae235b
Packit ae235b
  /* check we can remove an interface */
Packit ae235b
  foo_igen_object_skeleton_set_bar (o, NULL);
Packit ae235b
  /* ... check we get the InterfacesRemoved */
Packit ae235b
  om_data->state = 13;
Packit ae235b
  g_main_loop_run (om_data->loop);
Packit ae235b
  g_assert_cmpint (om_data->state, ==, 14);
Packit ae235b
  g_assert_cmpint (om_data->num_object_proxy_added_signals, ==, 3);
Packit ae235b
  g_assert_cmpint (om_data->num_object_proxy_removed_signals, ==, 2);
Packit ae235b
  g_assert_cmpint (om_data->num_interface_added_signals, ==, 1);
Packit ae235b
  g_assert_cmpint (om_data->num_interface_removed_signals, ==, 1);
Packit ae235b
  /* ... check introspection data */
Packit ae235b
  info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed/first", loop);
Packit ae235b
  g_assert_cmpint (count_interfaces (info), ==, 4); /* Bat + Properties,Introspectable,Peer */
Packit ae235b
  g_assert (has_interface (info, "org.project.Bat"));
Packit ae235b
  g_dbus_node_info_unref (info);
Packit ae235b
  /* also and that the call only has effect if the interface actually exists
Packit ae235b
   *
Packit ae235b
   * (Note: if a signal was emitted we'd assert in the signal handler
Packit ae235b
   * because we're in state 14)
Packit ae235b
   */
Packit ae235b
  foo_igen_object_skeleton_set_bar (o, NULL);
Packit ae235b
  /* ... check introspection data */
Packit ae235b
  info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed/first", loop);
Packit ae235b
  g_assert_cmpint (count_interfaces (info), ==, 4); /* Bat + Properties,Introspectable,Peer */
Packit ae235b
  g_assert (has_interface (info, "org.project.Bat"));
Packit ae235b
  g_dbus_node_info_unref (info);
Packit ae235b
Packit ae235b
  /* remove the last interface */
Packit ae235b
  foo_igen_object_skeleton_set_bat (o, NULL);
Packit ae235b
  /* ... check we get the InterfacesRemoved */
Packit ae235b
  om_data->state = 15;
Packit ae235b
  g_main_loop_run (om_data->loop);
Packit ae235b
  g_assert_cmpint (om_data->state, ==, 16);
Packit ae235b
  g_assert_cmpint (om_data->num_object_proxy_added_signals, ==, 3);
Packit ae235b
  g_assert_cmpint (om_data->num_object_proxy_removed_signals, ==, 3);
Packit ae235b
  g_assert_cmpint (om_data->num_interface_added_signals, ==, 1);
Packit ae235b
  g_assert_cmpint (om_data->num_interface_removed_signals, ==, 1);
Packit ae235b
  /* ... check introspection data */
Packit ae235b
  info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed/first", loop);
Packit ae235b
  g_assert_cmpint (count_interfaces (info), ==, 0); /* nothing */
Packit ae235b
  g_dbus_node_info_unref (info);
Packit ae235b
Packit ae235b
  /* and add an interface again */
Packit ae235b
  i = G_DBUS_INTERFACE_SKELETON (foo_igen_com_acme_coyote_skeleton_new ());
Packit ae235b
  foo_igen_object_skeleton_set_com_acme_coyote (o, FOO_IGEN_COM_ACME_COYOTE (i));
Packit ae235b
  g_clear_object (&i);
Packit ae235b
  /* ... check we get the InterfacesAdded */
Packit ae235b
  om_data->state = 17;
Packit ae235b
  g_main_loop_run (om_data->loop);
Packit ae235b
  g_assert_cmpint (om_data->state, ==, 18);
Packit ae235b
  g_assert_cmpint (om_data->num_object_proxy_added_signals, ==, 4);
Packit ae235b
  g_assert_cmpint (om_data->num_object_proxy_removed_signals, ==, 3);
Packit ae235b
  g_assert_cmpint (om_data->num_interface_added_signals, ==, 1);
Packit ae235b
  g_assert_cmpint (om_data->num_interface_removed_signals, ==, 1);
Packit ae235b
  /* ... check introspection data */
Packit ae235b
  info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed/first", loop);
Packit ae235b
  g_assert_cmpint (count_interfaces (info), ==, 4); /* com.acme.Coyote + Properties,Introspectable,Peer */
Packit ae235b
  g_assert (has_interface (info, "com.acme.Coyote"));
Packit ae235b
  g_dbus_node_info_unref (info);
Packit ae235b
Packit ae235b
  /* Check GetManagedObjects() - should be just the Coyote */
Packit ae235b
  om_check_get_all (c, loop,
Packit ae235b
                    "({objectpath '/managed/first': {'com.acme.Coyote': {'Mood': <''>}}},)");
Packit ae235b
Packit ae235b
  /* -------------------------------------------------- */
Packit ae235b
Packit ae235b
  /* create a new object with two interfaces */
Packit ae235b
  o2 = foo_igen_object_skeleton_new ("/managed/second");
Packit ae235b
  i = G_DBUS_INTERFACE_SKELETON (foo_igen_bar_skeleton_new ());
Packit ae235b
  bar_skeleton = FOO_IGEN_BAR (i); /* save for later test */
Packit ae235b
  foo_igen_object_skeleton_set_bar (o2, FOO_IGEN_BAR (i));
Packit ae235b
  g_clear_object (&i);
Packit ae235b
  i = G_DBUS_INTERFACE_SKELETON (foo_igen_bat_skeleton_new ());
Packit ae235b
  foo_igen_object_skeleton_set_bat (o2, FOO_IGEN_BAT (i));
Packit ae235b
  g_clear_object (&i);
Packit ae235b
  /* ... add it */
Packit ae235b
  g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (o2));
Packit ae235b
  /* ... check we get the InterfacesAdded with _two_ interfaces */
Packit ae235b
  om_data->state = 101;
Packit ae235b
  g_main_loop_run (om_data->loop);
Packit ae235b
  g_assert_cmpint (om_data->state, ==, 102);
Packit ae235b
  g_assert_cmpint (om_data->num_object_proxy_added_signals, ==, 5);
Packit ae235b
  g_assert_cmpint (om_data->num_object_proxy_removed_signals, ==, 3);
Packit ae235b
  g_assert_cmpint (om_data->num_interface_added_signals, ==, 1);
Packit ae235b
  g_assert_cmpint (om_data->num_interface_removed_signals, ==, 1);
Packit ae235b
Packit ae235b
  /* -------------------------------------------------- */
Packit ae235b
Packit ae235b
  /* Now that we have a couple of objects with interfaces, check
Packit ae235b
   * that ObjectManager.GetManagedObjects() works
Packit ae235b
   */
Packit ae235b
  om_check_get_all (c, loop,
Packit ae235b
                    "({objectpath '/managed/first': {'com.acme.Coyote': {'Mood': <''>}}, '/managed/second': {'org.project.Bar': {'y': <byte 0x00>, 'b': <false>, 'n': <int16 0>, 'q': <uint16 0>, 'i': <0>, 'u': <uint32 0>, 'x': <int64 0>, 't': <uint64 0>, 'd': <0.0>, 's': <''>, 'o': <objectpath '/'>, 'g': <signature ''>, 'ay': <b''>, 'as': <@as []>, 'aay': <@aay []>, 'ao': <@ao []>, 'ag': <@ag []>, 'FinallyNormalName': <''>, 'ReadonlyProperty': <''>, 'unset_i': <0>, 'unset_d': <0.0>, 'unset_s': <''>, 'unset_o': <objectpath '/'>, 'unset_g': <signature ''>, 'unset_ay': <b''>, 'unset_as': <@as []>, 'unset_ao': <@ao []>, 'unset_ag': <@ag []>, 'unset_struct': <(0, 0.0, '', objectpath '/', signature '', @ay [], @as [], @ao [], @ag [])>}, 'org.project.Bat': {'force_i': <0>, 'force_s': <''>, 'force_ay': <@ay []>, 'force_struct': <(0,)>}}},)");
Packit ae235b
Packit ae235b
  /* Set connection to NULL, causing everything to be unexported.. verify this.. and
Packit ae235b
   * then set the connection back.. and then check things still work
Packit ae235b
   */
Packit ae235b
  g_dbus_object_manager_server_set_connection (manager, NULL);
Packit ae235b
  info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed", loop);
Packit ae235b
  g_assert_cmpint (count_interfaces (info), ==, 0); /* nothing */
Packit ae235b
  g_dbus_node_info_unref (info);
Packit ae235b
Packit ae235b
  g_dbus_object_manager_server_set_connection (manager, c);
Packit ae235b
  om_check_get_all (c, loop,
Packit ae235b
                    "({objectpath '/managed/first': {'com.acme.Coyote': {'Mood': <''>}}, '/managed/second': {'org.project.Bar': {'y': <byte 0x00>, 'b': <false>, 'n': <int16 0>, 'q': <uint16 0>, 'i': <0>, 'u': <uint32 0>, 'x': <int64 0>, 't': <uint64 0>, 'd': <0.0>, 's': <''>, 'o': <objectpath '/'>, 'g': <signature ''>, 'ay': <b''>, 'as': <@as []>, 'aay': <@aay []>, 'ao': <@ao []>, 'ag': <@ag []>, 'FinallyNormalName': <''>, 'ReadonlyProperty': <''>, 'unset_i': <0>, 'unset_d': <0.0>, 'unset_s': <''>, 'unset_o': <objectpath '/'>, 'unset_g': <signature ''>, 'unset_ay': <b''>, 'unset_as': <@as []>, 'unset_ao': <@ao []>, 'unset_ag': <@ag []>, 'unset_struct': <(0, 0.0, '', objectpath '/', signature '', @ay [], @as [], @ao [], @ag [])>}, 'org.project.Bat': {'force_i': <0>, 'force_s': <''>, 'force_ay': <@ay []>, 'force_struct': <(0,)>}}},)");
Packit ae235b
Packit ae235b
  /* Also check that the ObjectManagerClient returns these objects - and
Packit ae235b
   * that they are of the right GType cf. what was requested via
Packit ae235b
   * the generated ::get-proxy-type signal handler
Packit ae235b
   */
Packit ae235b
  object_proxies = g_dbus_object_manager_get_objects (pm);
Packit ae235b
  g_assert (g_list_length (object_proxies) == 2);
Packit ae235b
  g_list_free_full (object_proxies, g_object_unref);
Packit ae235b
  op = g_dbus_object_manager_get_object (pm, "/managed/first");
Packit ae235b
  g_assert (op != NULL);
Packit ae235b
  g_assert (FOO_IGEN_IS_OBJECT_PROXY (op));
Packit ae235b
  g_assert_cmpstr (g_dbus_object_get_object_path (op), ==, "/managed/first");
Packit ae235b
  proxies = g_dbus_object_get_interfaces (op);
Packit ae235b
  g_assert (g_list_length (proxies) == 1);
Packit ae235b
  g_list_free_full (proxies, g_object_unref);
Packit ae235b
  p = G_DBUS_PROXY (foo_igen_object_get_com_acme_coyote (FOO_IGEN_OBJECT (op)));
Packit ae235b
  g_assert (p != NULL);
Packit ae235b
  g_assert_cmpint (G_TYPE_FROM_INSTANCE (p), ==, FOO_IGEN_TYPE_COM_ACME_COYOTE_PROXY);
Packit ae235b
  g_assert (g_type_is_a (G_TYPE_FROM_INSTANCE (p), FOO_IGEN_TYPE_COM_ACME_COYOTE));
Packit ae235b
  g_clear_object (&p);
Packit ae235b
  p = (GDBusProxy *) g_dbus_object_get_interface (op, "org.project.NonExisting");
Packit ae235b
  g_assert (p == NULL);
Packit ae235b
  g_clear_object (&op);
Packit ae235b
Packit ae235b
  /* -- */
Packit ae235b
  op = g_dbus_object_manager_get_object (pm, "/managed/second");
Packit ae235b
  g_assert (op != NULL);
Packit ae235b
  g_assert (FOO_IGEN_IS_OBJECT_PROXY (op));
Packit ae235b
  g_assert_cmpstr (g_dbus_object_get_object_path (op), ==, "/managed/second");
Packit ae235b
  proxies = g_dbus_object_get_interfaces (op);
Packit ae235b
  g_assert (g_list_length (proxies) == 2);
Packit ae235b
  g_list_free_full (proxies, g_object_unref);
Packit ae235b
  p = G_DBUS_PROXY (foo_igen_object_get_bat (FOO_IGEN_OBJECT (op)));
Packit ae235b
  g_assert (p != NULL);
Packit ae235b
  g_assert_cmpint (G_TYPE_FROM_INSTANCE (p), ==, FOO_IGEN_TYPE_BAT_PROXY);
Packit ae235b
  g_assert (g_type_is_a (G_TYPE_FROM_INSTANCE (p), FOO_IGEN_TYPE_BAT));
Packit ae235b
  g_clear_object (&p);
Packit ae235b
  p = G_DBUS_PROXY (foo_igen_object_get_bar (FOO_IGEN_OBJECT (op)));
Packit ae235b
  g_assert (p != NULL);
Packit ae235b
  g_assert_cmpint (G_TYPE_FROM_INSTANCE (p), ==, FOO_IGEN_TYPE_BAR_PROXY);
Packit ae235b
  g_assert (g_type_is_a (G_TYPE_FROM_INSTANCE (p), FOO_IGEN_TYPE_BAR));
Packit ae235b
  /* ... now that we have a Bar instance around, also check that we get signals
Packit ae235b
   *     and property changes...
Packit ae235b
   */
Packit ae235b
  om_check_property_and_signal_emission (loop, bar_skeleton, FOO_IGEN_BAR (p));
Packit ae235b
  g_clear_object (&p);
Packit ae235b
  p = (GDBusProxy *) g_dbus_object_get_interface (op, "org.project.NonExisting");
Packit ae235b
  g_assert (p == NULL);
Packit ae235b
  g_clear_object (&op);
Packit ae235b
Packit ae235b
  /* -------------------------------------------------- */
Packit ae235b
Packit ae235b
  /* Now remove the second object added above */
Packit ae235b
  g_dbus_object_manager_server_unexport (manager, "/managed/second");
Packit ae235b
  /* ... check we get InterfacesRemoved with both interfaces */
Packit ae235b
  om_data->state = 103;
Packit ae235b
  g_main_loop_run (om_data->loop);
Packit ae235b
  g_assert_cmpint (om_data->state, ==, 104);
Packit ae235b
  g_assert_cmpint (om_data->num_object_proxy_added_signals, ==, 5);
Packit ae235b
  g_assert_cmpint (om_data->num_object_proxy_removed_signals, ==, 4);
Packit ae235b
  g_assert_cmpint (om_data->num_interface_added_signals, ==, 1);
Packit ae235b
  g_assert_cmpint (om_data->num_interface_removed_signals, ==, 1);
Packit ae235b
  /* ... check introspection data (there should be nothing) */
Packit ae235b
  info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed/second", loop);
Packit ae235b
  g_assert_cmpint (count_nodes (info), ==, 0);
Packit ae235b
  g_assert_cmpint (count_interfaces (info), ==, 0);
Packit ae235b
  g_dbus_node_info_unref (info);
Packit ae235b
Packit ae235b
  /* Check GetManagedObjects() again */
Packit ae235b
  om_check_get_all (c, loop,
Packit ae235b
                    "({objectpath '/managed/first': {'com.acme.Coyote': {'Mood': <''>}}},)");
Packit ae235b
  /* -------------------------------------------------- */
Packit ae235b
Packit ae235b
  /* Check that export_uniquely() works */
Packit ae235b
Packit ae235b
  o3 = foo_igen_object_skeleton_new ("/managed/first");
Packit ae235b
  i = G_DBUS_INTERFACE_SKELETON (foo_igen_com_acme_coyote_skeleton_new ());
Packit ae235b
  foo_igen_com_acme_coyote_set_mood (FOO_IGEN_COM_ACME_COYOTE (i), "indifferent");
Packit ae235b
  foo_igen_object_skeleton_set_com_acme_coyote (o3, FOO_IGEN_COM_ACME_COYOTE (i));
Packit ae235b
  g_clear_object (&i);
Packit ae235b
  g_dbus_object_manager_server_export_uniquely (manager, G_DBUS_OBJECT_SKELETON (o3));
Packit ae235b
  /* ... check we get the InterfacesAdded signal */
Packit ae235b
  om_data->state = 200;
Packit ae235b
  g_main_loop_run (om_data->loop);
Packit ae235b
  g_assert_cmpint (om_data->state, ==, 201);
Packit ae235b
Packit ae235b
  om_check_get_all (c, loop,
Packit ae235b
                    "({objectpath '/managed/first': {'com.acme.Coyote': {'Mood': <''>}}, '/managed/first_1': {'com.acme.Coyote': {'Mood': <'indifferent'>}}},)");
Packit ae235b
Packit ae235b
  //g_main_loop_run (loop); /* TODO: tmp */
Packit ae235b
Packit ae235b
  /* Clean up objects */
Packit ae235b
  g_assert (g_dbus_object_manager_server_unexport (manager, "/managed/first_1"));
Packit ae235b
  //g_assert (g_dbus_object_manager_server_unexport (manager, "/managed/second"));
Packit ae235b
  g_assert (g_dbus_object_manager_server_unexport (manager, "/managed/first"));
Packit ae235b
  g_assert_cmpint (g_list_length (g_dbus_object_manager_get_objects (G_DBUS_OBJECT_MANAGER (manager))), ==, 0);
Packit ae235b
Packit ae235b
  if (loop != NULL)
Packit ae235b
    g_main_loop_unref (loop);
Packit ae235b
Packit ae235b
  if (om_signal_id != -1)
Packit ae235b
    g_dbus_connection_signal_unsubscribe (c, om_signal_id);
Packit ae235b
  g_clear_object (&o3;;
Packit ae235b
  g_clear_object (&o2;;
Packit ae235b
  g_clear_object (&o);
Packit ae235b
  g_clear_object (&manager);
Packit ae235b
  if (pm != NULL)
Packit ae235b
    {
Packit ae235b
      g_assert_cmpint (g_signal_handlers_disconnect_by_func (pm,
Packit ae235b
                                                             G_CALLBACK (on_object_proxy_added),
Packit ae235b
                                                             om_data), ==, 1);
Packit ae235b
      g_assert_cmpint (g_signal_handlers_disconnect_by_func (pm,
Packit ae235b
                                                             G_CALLBACK (on_object_proxy_removed),
Packit ae235b
                                                             om_data), ==, 1);
Packit ae235b
      g_clear_object (&pm);
Packit ae235b
    }
Packit ae235b
  g_clear_object (&c);
Packit ae235b
Packit ae235b
  g_free (om_data);
Packit ae235b
}
Packit ae235b
Packit ae235b
/* ---------------------------------------------------------------------------------------------------- */
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_object_manager (void)
Packit ae235b
{
Packit ae235b
  GMainLoop *loop;
Packit ae235b
  guint id;
Packit ae235b
Packit ae235b
  loop = g_main_loop_new (NULL, FALSE);
Packit ae235b
Packit ae235b
  id = g_bus_own_name (G_BUS_TYPE_SESSION,
Packit ae235b
                       "org.gtk.GDBus.BindingsTool.Test",
Packit ae235b
                       G_BUS_NAME_OWNER_FLAGS_NONE,
Packit ae235b
                       on_bus_acquired,
Packit ae235b
                       on_name_acquired,
Packit ae235b
                       on_name_lost,
Packit ae235b
                       loop,
Packit ae235b
                       NULL);
Packit ae235b
Packit ae235b
  g_main_loop_run (loop);
Packit ae235b
Packit ae235b
  check_object_manager ();
Packit ae235b
Packit ae235b
  /* uncomment to keep the service around (to e.g. introspect it) */
Packit ae235b
  /* g_main_loop_run (loop); */
Packit ae235b
Packit ae235b
  unexport_objects ();
Packit ae235b
Packit ae235b
  g_bus_unown_name (id);
Packit ae235b
  g_main_loop_unref (loop);
Packit ae235b
}
Packit ae235b
Packit ae235b
/* ---------------------------------------------------------------------------------------------------- */
Packit ae235b
/* This checks that forcing names via org.gtk.GDBus.Name works (see test-codegen.xml) */
Packit ae235b
Packit ae235b
extern gpointer name_forcing_1;
Packit ae235b
extern gpointer name_forcing_2;
Packit ae235b
extern gpointer name_forcing_3;
Packit ae235b
extern gpointer name_forcing_4;
Packit ae235b
extern gpointer name_forcing_5;
Packit ae235b
extern gpointer name_forcing_6;
Packit ae235b
extern gpointer name_forcing_7;
Packit ae235b
gpointer name_forcing_1 = foo_igen_rocket123_get_type;
Packit ae235b
gpointer name_forcing_2 = foo_igen_rocket123_call_ignite_xyz;
Packit ae235b
gpointer name_forcing_3 = foo_igen_rocket123_emit_exploded_xyz;
Packit ae235b
gpointer name_forcing_4 = foo_igen_rocket123_get_speed_xyz;
Packit ae235b
gpointer name_forcing_5 = foo_igen_test_ugly_case_interface_call_get_iscsi_servers;
Packit ae235b
gpointer name_forcing_6 = foo_igen_test_ugly_case_interface_emit_servers_updated_now;
Packit ae235b
gpointer name_forcing_7 = foo_igen_test_ugly_case_interface_get_ugly_name;
Packit ae235b
Packit ae235b
/* ---------------------------------------------------------------------------------------------------- */
Packit ae235b
Packit ae235b
/* See https://bugzilla.gnome.org/show_bug.cgi?id=647577#c5 for details */
Packit ae235b
Packit ae235b
#define CHECK_FIELD(name, v1, v2) g_assert_cmpint (G_STRUCT_OFFSET (FooiGenChangingInterface##v1##Iface, name), ==, G_STRUCT_OFFSET (FooiGenChangingInterface##v2##Iface, name));
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_interface_stability (void)
Packit ae235b
{
Packit ae235b
  CHECK_FIELD(handle_foo_method, V1, V2);
Packit ae235b
  CHECK_FIELD(handle_bar_method, V1, V2);
Packit ae235b
  CHECK_FIELD(handle_baz_method, V1, V2);
Packit ae235b
  CHECK_FIELD(foo_signal, V1, V2);
Packit ae235b
  CHECK_FIELD(bar_signal, V1, V2);
Packit ae235b
  CHECK_FIELD(baz_signal, V1, V2);
Packit ae235b
  CHECK_FIELD(handle_new_method_in2, V2, V10);
Packit ae235b
  CHECK_FIELD(new_signal_in2, V2, V10);
Packit ae235b
}
Packit ae235b
Packit ae235b
#undef CHECK_FIELD
Packit ae235b
Packit ae235b
/* ---------------------------------------------------------------------------------------------------- */
Packit ae235b
Packit ae235b
/* property naming
Packit ae235b
 *
Packit ae235b
 * - check that a property with name "Type" is mapped into g-name "type"
Packit ae235b
 *   with C accessors get_type_ (to avoid clashing with the GType accessor)
Packit ae235b
 *   and set_type_ (for symmetri)
Packit ae235b
 *   (see https://bugzilla.gnome.org/show_bug.cgi?id=679473 for details)
Packit ae235b
 *
Packit ae235b
 * - (could add more tests here)
Packit ae235b
 */
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_property_naming (void)
Packit ae235b
{
Packit ae235b
  gpointer c_getter_name = foo_igen_naming_get_type_;
Packit ae235b
  gpointer c_setter_name = foo_igen_naming_set_type_;
Packit ae235b
  FooiGenNaming *skel;
Packit ae235b
Packit ae235b
  (void) c_getter_name;
Packit ae235b
  (void) c_setter_name;
Packit ae235b
Packit ae235b
  skel = foo_igen_naming_skeleton_new ();
Packit ae235b
  g_assert (g_object_class_find_property (G_OBJECT_GET_CLASS (skel), "type") != NULL);
Packit ae235b
  g_object_unref (skel);
Packit ae235b
}
Packit ae235b
Packit ae235b
/* ---------------------------------------------------------------------------------------------------- */
Packit ae235b
Packit ae235b
int
Packit ae235b
main (int   argc,
Packit ae235b
      char *argv[])
Packit ae235b
{
Packit ae235b
  g_test_init (&argc, &argv, NULL);
Packit ae235b
Packit ae235b
  g_test_add_func ("/gdbus/codegen/annotations", test_annotations);
Packit ae235b
  g_test_add_func ("/gdbus/codegen/interface_stability", test_interface_stability);
Packit ae235b
  g_test_add_func ("/gdbus/codegen/object-manager", test_object_manager);
Packit ae235b
  g_test_add_func ("/gdbus/codegen/property-naming", test_property_naming);
Packit ae235b
Packit ae235b
  return session_bus_run ();
Packit ae235b
}