1 /* GLib testing framework examples and tests
3 * Copyright (C) 2008-2010 Red Hat, Inc.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General
16 * Public License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18 * Boston, MA 02111-1307, USA.
20 * Author: David Zeuthen <davidz@redhat.com>
27 #include "gdbus-tests.h"
29 /* all tests rely on a shared mainloop */
30 static GMainLoop *loop = NULL;
32 /* ---------------------------------------------------------------------------------------------------- */
33 /* Test introspection parser */
34 /* ---------------------------------------------------------------------------------------------------- */
37 introspection_on_proxy_appeared (GDBusConnection *connection,
39 const gchar *name_owner,
44 const gchar *xml_data;
45 GDBusNodeInfo *node_info;
46 const GDBusInterfaceInfo *interface_info;
47 const GDBusMethodInfo *method_info;
48 const GDBusSignalInfo *signal_info;
54 * Invoke Introspect(), then parse the output.
56 result = g_dbus_proxy_call_sync (proxy,
57 "org.freedesktop.DBus.Introspectable.Introspect",
59 G_DBUS_CALL_FLAGS_NONE,
63 g_assert_no_error (error);
64 g_assert (result != NULL);
65 g_variant_get (result, "(&s)", &xml_data);
67 node_info = g_dbus_node_info_new_for_xml (xml_data, &error);
68 g_assert_no_error (error);
69 g_assert (node_info != NULL);
71 /* for now we only check a couple of things. TODO: check more things */
73 interface_info = g_dbus_node_info_lookup_interface (node_info, "com.example.NonExistantInterface");
74 g_assert (interface_info == NULL);
76 interface_info = g_dbus_node_info_lookup_interface (node_info, "org.freedesktop.DBus.Introspectable");
77 g_assert (interface_info != NULL);
78 method_info = g_dbus_interface_info_lookup_method (interface_info, "NonExistantMethod");
79 g_assert (method_info == NULL);
80 method_info = g_dbus_interface_info_lookup_method (interface_info, "Introspect");
81 g_assert (method_info != NULL);
82 g_assert (method_info->in_args == NULL);
83 g_assert (method_info->out_args != NULL);
84 g_assert (method_info->out_args[0] != NULL);
85 g_assert (method_info->out_args[1] == NULL);
86 g_assert_cmpstr (method_info->out_args[0]->signature, ==, "s");
88 interface_info = g_dbus_node_info_lookup_interface (node_info, "com.example.Frob");
89 g_assert (interface_info != NULL);
90 signal_info = g_dbus_interface_info_lookup_signal (interface_info, "TestSignal");
91 g_assert (signal_info != NULL);
92 g_assert (signal_info->args != NULL);
93 g_assert (signal_info->args[0] != NULL);
94 g_assert_cmpstr (signal_info->args[0]->signature, ==, "s");
95 g_assert (signal_info->args[1] != NULL);
96 g_assert_cmpstr (signal_info->args[1]->signature, ==, "o");
97 g_assert (signal_info->args[2] != NULL);
98 g_assert_cmpstr (signal_info->args[2]->signature, ==, "v");
99 g_assert (signal_info->args[3] == NULL);
101 g_dbus_node_info_unref (node_info);
102 g_variant_unref (result);
104 g_main_loop_quit (loop);
108 introspection_on_proxy_vanished (GDBusConnection *connection,
115 test_introspection_parser (void)
121 watcher_id = g_bus_watch_proxy (G_BUS_TYPE_SESSION,
122 "com.example.TestService",
123 G_BUS_NAME_WATCHER_FLAGS_NONE,
124 "/com/example/TestObject",
127 G_DBUS_PROXY_FLAGS_NONE,
128 introspection_on_proxy_appeared,
129 introspection_on_proxy_vanished,
133 /* TODO: wait a bit for the bus to come up.. ideally session_bus_up() won't return
134 * until one can connect to the bus but that's not how things work right now
137 /* this is safe; testserver will exit once the bus goes away */
138 g_assert (g_spawn_command_line_async (SRCDIR "/gdbus-testserver.py", NULL));
140 g_main_loop_run (loop);
142 g_bus_unwatch_proxy (watcher_id);
149 /* ---------------------------------------------------------------------------------------------------- */
156 g_test_init (&argc, &argv, NULL);
158 /* all the tests rely on a shared main loop */
159 loop = g_main_loop_new (NULL, FALSE);
161 /* all the tests use a session bus with a well-known address that we can bring up and down
162 * using session_bus_up() and session_bus_down().
164 g_unsetenv ("DISPLAY");
165 g_setenv ("DBUS_SESSION_BUS_ADDRESS", session_bus_get_temporary_address (), TRUE);
167 g_test_add_func ("/gdbus/introspection-parser", test_introspection_parser);