~ubuntu-branches/debian/sid/glib2.0/sid

« back to all changes in this revision

Viewing changes to gio/tests/gdbus-test-codegen.c

  • Committer: Package Import Robot
  • Author(s): Martin Pitt
  • Date: 2013-05-08 06:25:57 UTC
  • mfrom: (1.27.14) (3.1.181 experimental)
  • Revision ID: package-import@ubuntu.com-20130508062557-i7gbku66mls70gi2
Tags: 2.36.1-2
Merge experimental branch, upload to unstable.

Show diffs side-by-side

added added

removed removed

Lines of Context:
420
420
static FooiGenMethodThreads *exported_thread_object_2 = NULL;
421
421
 
422
422
static void
 
423
unexport_objects (void)
 
424
{
 
425
  g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_bar_object));
 
426
  g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_bat_object));
 
427
  g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_authorize_object));
 
428
  g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_thread_object_1));
 
429
  g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_thread_object_2));
 
430
}
 
431
 
 
432
static void
423
433
on_bus_acquired (GDBusConnection *connection,
424
434
                 const gchar     *name,
425
435
                 gpointer         user_data)
689
699
check_bar_proxy (FooiGenBar *proxy,
690
700
                 GMainLoop  *thread_loop)
691
701
{
 
702
  const gchar *array_of_strings[3] = {"one", "two", NULL};
 
703
  const gchar *array_of_strings_2[3] = {"one2", "two2", NULL};
 
704
  const gchar *array_of_objpaths[3] = {"/one", "/one/two", NULL};
 
705
  const gchar *array_of_bytestrings[3] = {"one\xff", "two\xff", NULL};
692
706
  guchar ret_val_byte;
693
707
  gboolean ret_val_boolean;
694
708
  gint16 ret_val_int16;
734
748
  gchar *val_finally_normal_name;
735
749
  GVariant *v;
736
750
  gchar *s;
 
751
  const gchar *const *read_as;
 
752
  const gchar *const *read_as2;
 
753
  const gchar *const *read_as3;
737
754
 
738
755
  data = g_new0 (ClientData, 1);
739
756
  data->thread_loop = thread_loop;
828
845
  /* Try setting properties that requires memory management. This
829
846
   * is to exercise the paths that frees the references.
830
847
   */
831
 
  const gchar *array_of_strings[3] = {"one", "two", NULL};
832
 
  const gchar *array_of_strings_2[3] = {"one2", "two2", NULL};
833
 
  const gchar *array_of_objpaths[3] = {"/one", "/one/two", NULL};
834
 
  const gchar *array_of_bytestrings[3] = {"one\xff", "two\xff", NULL};
835
848
 
836
849
  g_object_set (proxy,
837
850
                "s", "a string",
929
942
   * updates on them works as well (See comment for "property vfuncs"
930
943
   * in gio/gdbus-codegen/codegen.py for details)
931
944
   */
932
 
  const gchar *const *read_as;
933
 
  const gchar *const *read_as2;
934
 
  const gchar *const *read_as3;
935
945
  read_as = foo_igen_bar_get_as (proxy);
936
946
  read_as2 = foo_igen_bar_get_as (proxy);
937
947
  g_assert_cmpint (g_strv_length ((gchar **) read_as), ==, 2);
954
964
   * properties.
955
965
   *
956
966
   * On the first reception, y and i should both be increased by
957
 
   * two. On the the second reception, only by one. The signal handler
 
967
   * two. On the second reception, only by one. The signal handler
958
968
   * checks this.
959
969
   *
960
970
   * This also checks that _drain_notify() works.
1771
1781
static void
1772
1782
check_object_manager (void)
1773
1783
{
1774
 
  FooiGenObjectSkeleton *o;
1775
 
  FooiGenObjectSkeleton *o2;
1776
 
  FooiGenObjectSkeleton *o3;
 
1784
  FooiGenObjectSkeleton *o = NULL;
 
1785
  FooiGenObjectSkeleton *o2 = NULL;
 
1786
  FooiGenObjectSkeleton *o3 = NULL;
1777
1787
  GDBusInterfaceSkeleton *i;
1778
1788
  GDBusConnection *c;
1779
 
  GDBusObjectManagerServer *manager;
 
1789
  GDBusObjectManagerServer *manager = NULL;
1780
1790
  GDBusNodeInfo *info;
1781
1791
  GError *error;
1782
1792
  GMainLoop *loop;
1783
 
  OMData *om_data;
1784
 
  guint om_signal_id;
1785
 
  GDBusObjectManager *pm;
 
1793
  OMData *om_data = NULL;
 
1794
  guint om_signal_id = -1;
 
1795
  GDBusObjectManager *pm = NULL;
1786
1796
  GList *object_proxies;
1787
1797
  GList *proxies;
1788
1798
  GDBusObject *op;
1845
1855
  g_assert_cmpstr (path, ==, "/managed");
1846
1856
  g_assert (c2 == c);
1847
1857
  g_free (path);
1848
 
  g_object_unref (c2);
 
1858
  g_clear_object (&c2);
1849
1859
 
1850
1860
  /* Check that the manager object is visible */
1851
1861
  info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed", loop);
1858
1868
  om_check_get_all (c, loop,
1859
1869
                    "(@a{oa{sa{sv}}} {},)");
1860
1870
 
1861
 
  /* Now try to create the the proxy manager again - this time it should work */
 
1871
  /* Now try to create the proxy manager again - this time it should work */
1862
1872
  error = NULL;
1863
1873
  foo_igen_object_manager_client_new (c,
1864
1874
                                      G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
1870
1880
  g_main_loop_run (loop);
1871
1881
  error = NULL;
1872
1882
  pm = foo_igen_object_manager_client_new_finish (om_res, &error);
1873
 
  g_object_unref (om_res);
 
1883
  g_clear_object (&om_res);
1874
1884
  g_assert_no_error (error);
1875
1885
  g_assert (pm != NULL);
1876
1886
  g_signal_connect (pm,
1896
1906
  g_assert_cmpint (flags, ==, G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE);
1897
1907
  g_assert (c2 == c);
1898
1908
  g_free (path);
1899
 
  g_object_unref (c2);
 
1909
  g_clear_object (&c2);
1900
1910
  g_free (name);
1901
1911
  g_free (name_owner);
1902
1912
 
1925
1935
  o2 = FOO_IGEN_OBJECT_SKELETON (g_dbus_interface_dup_object (G_DBUS_INTERFACE (i)));
1926
1936
  g_assert (G_DBUS_OBJECT (o2) == G_DBUS_OBJECT (o));
1927
1937
  g_assert_cmpint (G_OBJECT (o2)->ref_count, ==, 2);
1928
 
  g_object_unref (o2);
 
1938
  g_clear_object (&o2);
1929
1939
 
1930
1940
  g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (o));
1931
1941
 
1932
1942
  /* ... check we get the InterfacesAdded signal */
1933
1943
  om_data->state = 1;
 
1944
 
1934
1945
  g_main_loop_run (om_data->loop);
 
1946
 
1935
1947
  g_assert_cmpint (om_data->state, ==, 2);
1936
1948
  g_assert_cmpint (om_data->num_object_proxy_added_signals, ==, 1);
1937
1949
  g_assert_cmpint (om_data->num_object_proxy_removed_signals, ==, 0);
1946
1958
  /* Also check g_dbus_object_manager_get_interface */
1947
1959
  iface = g_dbus_object_manager_get_interface (G_DBUS_OBJECT_MANAGER (manager), "/managed/first", "org.project.Bar");
1948
1960
  g_assert (iface != NULL);
1949
 
  g_object_unref (iface);
 
1961
  g_clear_object (&iface);
1950
1962
  iface = g_dbus_object_manager_get_interface (G_DBUS_OBJECT_MANAGER (manager), "/managed/first", "org.project.Bat");
1951
1963
  g_assert (iface == NULL);
1952
1964
  iface = g_dbus_object_manager_get_interface (G_DBUS_OBJECT_MANAGER (pm), "/managed/first", "org.project.Bar");
1953
1965
  g_assert (iface != NULL);
1954
 
  g_object_unref (iface);
 
1966
  g_clear_object (&iface);
1955
1967
  iface = g_dbus_object_manager_get_interface (G_DBUS_OBJECT_MANAGER (pm), "/managed/first", "org.project.Bat");
1956
1968
  g_assert (iface == NULL);
1957
1969
 
1971
1983
  g_assert_cmpint (count_interfaces (info), ==, 4); /* Bar + Properties,Introspectable,Peer */
1972
1984
  g_assert (has_interface (info, "org.project.Bar"));
1973
1985
  g_dbus_node_info_unref (info);
1974
 
  g_object_unref (i);
 
1986
  g_clear_object (&i);
1975
1987
 
1976
1988
  /* check adding an interface of same type (but not same object) replaces the existing one */
1977
1989
  i = G_DBUS_INTERFACE_SKELETON (foo_igen_bar_skeleton_new ());
1989
2001
  g_assert_cmpint (count_interfaces (info), ==, 4); /* Bar + Properties,Introspectable,Peer */
1990
2002
  g_assert (has_interface (info, "org.project.Bar"));
1991
2003
  g_dbus_node_info_unref (info);
1992
 
  g_object_unref (i);
 
2004
  g_clear_object (&i);
1993
2005
 
1994
2006
  /* check adding an interface of another type doesn't replace the existing one */
1995
2007
  i = G_DBUS_INTERFACE_SKELETON (foo_igen_bat_skeleton_new ());
1996
2008
  foo_igen_object_skeleton_set_bat (o, FOO_IGEN_BAT (i));
1997
 
  g_object_unref (i);
 
2009
  g_clear_object (&i);
1998
2010
  /* ... check we get the InterfacesAdded */
1999
2011
  om_data->state = 11;
2000
2012
  g_main_loop_run (om_data->loop);
2055
2067
  /* and add an interface again */
2056
2068
  i = G_DBUS_INTERFACE_SKELETON (foo_igen_com_acme_coyote_skeleton_new ());
2057
2069
  foo_igen_object_skeleton_set_com_acme_coyote (o, FOO_IGEN_COM_ACME_COYOTE (i));
2058
 
  g_object_unref (i);
 
2070
  g_clear_object (&i);
2059
2071
  /* ... check we get the InterfacesAdded */
2060
2072
  om_data->state = 17;
2061
2073
  g_main_loop_run (om_data->loop);
2081
2093
  i = G_DBUS_INTERFACE_SKELETON (foo_igen_bar_skeleton_new ());
2082
2094
  bar_skeleton = FOO_IGEN_BAR (i); /* save for later test */
2083
2095
  foo_igen_object_skeleton_set_bar (o2, FOO_IGEN_BAR (i));
2084
 
  g_object_unref (i);
 
2096
  g_clear_object (&i);
2085
2097
  i = G_DBUS_INTERFACE_SKELETON (foo_igen_bat_skeleton_new ());
2086
2098
  foo_igen_object_skeleton_set_bat (o2, FOO_IGEN_BAT (i));
2087
 
  g_object_unref (i);
 
2099
  g_clear_object (&i);
2088
2100
  /* ... add it */
2089
2101
  g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (o2));
2090
2102
  /* ... check we get the InterfacesAdded with _two_ interfaces */
2111
2123
  info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed", loop);
2112
2124
  g_assert_cmpint (count_interfaces (info), ==, 0); /* nothing */
2113
2125
  g_dbus_node_info_unref (info);
 
2126
 
2114
2127
  g_dbus_object_manager_server_set_connection (manager, c);
2115
2128
  om_check_get_all (c, loop,
2116
2129
                    "({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,)>}}},)");
2133
2146
  g_assert (p != NULL);
2134
2147
  g_assert_cmpint (G_TYPE_FROM_INSTANCE (p), ==, FOO_IGEN_TYPE_COM_ACME_COYOTE_PROXY);
2135
2148
  g_assert (g_type_is_a (G_TYPE_FROM_INSTANCE (p), FOO_IGEN_TYPE_COM_ACME_COYOTE));
2136
 
  g_object_unref (p);
 
2149
  g_clear_object (&p);
2137
2150
  p = (GDBusProxy *) g_dbus_object_get_interface (op, "org.project.NonExisting");
2138
2151
  g_assert (p == NULL);
2139
 
  g_object_unref (op);
 
2152
  g_clear_object (&op);
 
2153
 
2140
2154
  /* -- */
2141
2155
  op = g_dbus_object_manager_get_object (pm, "/managed/second");
2142
2156
  g_assert (op != NULL);
2149
2163
  g_assert (p != NULL);
2150
2164
  g_assert_cmpint (G_TYPE_FROM_INSTANCE (p), ==, FOO_IGEN_TYPE_BAT_PROXY);
2151
2165
  g_assert (g_type_is_a (G_TYPE_FROM_INSTANCE (p), FOO_IGEN_TYPE_BAT));
2152
 
  g_object_unref (p);
 
2166
  g_clear_object (&p);
2153
2167
  p = G_DBUS_PROXY (foo_igen_object_get_bar (FOO_IGEN_OBJECT (op)));
2154
2168
  g_assert (p != NULL);
2155
2169
  g_assert_cmpint (G_TYPE_FROM_INSTANCE (p), ==, FOO_IGEN_TYPE_BAR_PROXY);
2158
2172
   *     and property changes...
2159
2173
   */
2160
2174
  om_check_property_and_signal_emission (loop, bar_skeleton, FOO_IGEN_BAR (p));
2161
 
  g_object_unref (p);
 
2175
  g_clear_object (&p);
2162
2176
  p = (GDBusProxy *) g_dbus_object_get_interface (op, "org.project.NonExisting");
2163
2177
  g_assert (p == NULL);
2164
 
  g_object_unref (op);
 
2178
  g_clear_object (&op);
2165
2179
 
2166
2180
  /* -------------------------------------------------- */
2167
2181
 
2184
2198
  /* Check GetManagedObjects() again */
2185
2199
  om_check_get_all (c, loop,
2186
2200
                    "({objectpath '/managed/first': {'com.acme.Coyote': {'Mood': <''>}}},)");
2187
 
 
2188
2201
  /* -------------------------------------------------- */
2189
2202
 
2190
2203
  /* Check that export_uniquely() works */
2193
2206
  i = G_DBUS_INTERFACE_SKELETON (foo_igen_com_acme_coyote_skeleton_new ());
2194
2207
  foo_igen_com_acme_coyote_set_mood (FOO_IGEN_COM_ACME_COYOTE (i), "indifferent");
2195
2208
  foo_igen_object_skeleton_set_com_acme_coyote (o3, FOO_IGEN_COM_ACME_COYOTE (i));
2196
 
  g_object_unref (i);
 
2209
  g_clear_object (&i);
2197
2210
  g_dbus_object_manager_server_export_uniquely (manager, G_DBUS_OBJECT_SKELETON (o3));
2198
2211
  /* ... check we get the InterfacesAdded signal */
2199
2212
  om_data->state = 200;
2205
2218
 
2206
2219
  //g_main_loop_run (loop); /* TODO: tmp */
2207
2220
 
2208
 
  g_main_loop_unref (loop);
2209
 
 
2210
 
  g_dbus_connection_signal_unsubscribe (c, om_signal_id);
2211
 
  g_object_unref (o3);
2212
 
  g_object_unref (o2);
2213
 
  g_object_unref (o);
2214
 
  g_object_unref (manager);
2215
 
  g_assert_cmpint (g_signal_handlers_disconnect_by_func (pm,
2216
 
                                                         G_CALLBACK (on_object_proxy_added),
2217
 
                                                         om_data), ==, 1);
2218
 
  g_assert_cmpint (g_signal_handlers_disconnect_by_func (pm,
2219
 
                                                         G_CALLBACK (on_object_proxy_removed),
2220
 
                                                         om_data), ==, 1);
2221
 
  g_object_unref (pm);
2222
 
  g_object_unref (c);
 
2221
  /* Clean up objects */
 
2222
  g_assert (g_dbus_object_manager_server_unexport (manager, "/managed/first_1"));
 
2223
  //g_assert (g_dbus_object_manager_server_unexport (manager, "/managed/second"));
 
2224
  g_assert (g_dbus_object_manager_server_unexport (manager, "/managed/first"));
 
2225
  g_assert_cmpint (g_list_length (g_dbus_object_manager_get_objects (G_DBUS_OBJECT_MANAGER (manager))), ==, 0);
 
2226
 
 
2227
  if (loop != NULL)
 
2228
    g_main_loop_unref (loop);
 
2229
 
 
2230
  if (om_signal_id != -1)
 
2231
    g_dbus_connection_signal_unsubscribe (c, om_signal_id);
 
2232
  g_clear_object (&o3);
 
2233
  g_clear_object (&o2);
 
2234
  g_clear_object (&o);
 
2235
  g_clear_object (&manager);
 
2236
  if (pm != NULL)
 
2237
    {
 
2238
      g_assert_cmpint (g_signal_handlers_disconnect_by_func (pm,
 
2239
                                                             G_CALLBACK (on_object_proxy_added),
 
2240
                                                             om_data), ==, 1);
 
2241
      g_assert_cmpint (g_signal_handlers_disconnect_by_func (pm,
 
2242
                                                             G_CALLBACK (on_object_proxy_removed),
 
2243
                                                             om_data), ==, 1);
 
2244
      g_clear_object (&pm);
 
2245
    }
 
2246
  g_clear_object (&c);
2223
2247
 
2224
2248
  g_free (om_data);
2225
2249
}
2250
2274
  /* uncomment to keep the service around (to e.g. introspect it) */
2251
2275
  /* g_main_loop_run (loop); */
2252
2276
 
 
2277
  unexport_objects ();
 
2278
 
2253
2279
  g_bus_unown_name (id);
2254
2280
  g_main_loop_unref (loop);
2255
2281
}
2295
2321
 
2296
2322
/* ---------------------------------------------------------------------------------------------------- */
2297
2323
 
 
2324
/* property naming
 
2325
 *
 
2326
 * - check that a property with name "Type" is mapped into g-name "type"
 
2327
 *   with C accessors get_type_ (to avoid clashing with the GType accessor)
 
2328
 *   and set_type_ (for symmetri)
 
2329
 *   (see https://bugzilla.gnome.org/show_bug.cgi?id=679473 for details)
 
2330
 *
 
2331
 * - (could add more tests here)
 
2332
 */
 
2333
 
 
2334
static void
 
2335
test_property_naming (void)
 
2336
{
 
2337
  gpointer c_getter_name = foo_igen_naming_get_type_;
 
2338
  gpointer c_setter_name = foo_igen_naming_set_type_;
 
2339
  FooiGenNaming *skel;
 
2340
 
 
2341
  (void) c_getter_name;
 
2342
  (void) c_setter_name;
 
2343
 
 
2344
  skel = foo_igen_naming_skeleton_new ();
 
2345
  g_assert (g_object_class_find_property (G_OBJECT_GET_CLASS (skel), "type") != NULL);
 
2346
  g_object_unref (skel);
 
2347
}
 
2348
 
 
2349
/* ---------------------------------------------------------------------------------------------------- */
 
2350
 
2298
2351
int
2299
2352
main (int   argc,
2300
2353
      char *argv[])
2301
2354
{
2302
2355
  gint ret;
2303
2356
 
2304
 
  g_type_init ();
2305
2357
  g_test_init (&argc, &argv, NULL);
2306
2358
 
2307
 
  /* all the tests use a session bus with a well-known address that we can bring up and down
2308
 
   * using session_bus_up() and session_bus_down().
2309
 
   */
2310
 
  g_unsetenv ("DISPLAY");
2311
 
  g_setenv ("DBUS_SESSION_BUS_ADDRESS", session_bus_get_temporary_address (), TRUE);
2312
 
 
2313
2359
  session_bus_up ();
2314
2360
 
2315
 
  /* TODO: wait a bit for the bus to come up.. ideally session_bus_up() won't return
2316
 
   * until one can connect to the bus but that's not how things work right now
2317
 
   */
2318
 
  usleep (500 * 1000);
2319
 
 
2320
2361
  g_test_add_func ("/gdbus/codegen/annotations", test_annotations);
2321
2362
  g_test_add_func ("/gdbus/codegen/interface_stability", test_interface_stability);
2322
2363
  g_test_add_func ("/gdbus/codegen/object-manager", test_object_manager);
 
2364
  g_test_add_func ("/gdbus/codegen/property-naming", test_property_naming);
2323
2365
 
2324
2366
  ret = g_test_run();
2325
2367