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 /* ---------------------------------------------------------------------------------------------------- */
28 /* Test that registered errors are properly mapped */
29 /* ---------------------------------------------------------------------------------------------------- */
32 check_registered_error (const gchar *given_dbus_error_name,
37 gchar *dbus_error_name;
39 error = g_dbus_error_new_for_dbus_error (given_dbus_error_name, "test message");
40 g_assert_error (error, error_domain, error_code);
41 g_assert (g_dbus_error_is_remote_error (error));
42 g_assert (g_dbus_error_strip_remote_error (error));
43 g_assert_cmpstr (error->message, ==, "test message");
44 dbus_error_name = g_dbus_error_get_remote_error (error);
45 g_assert_cmpstr (dbus_error_name, ==, given_dbus_error_name);
46 g_free (dbus_error_name);
51 test_registered_errors (void)
53 /* Here we check that we are able to map to GError and back for registered
56 * For example, if "org.freedesktop.DBus.Error.AddressInUse" is
57 * associated with (G_DBUS_ERROR, G_DBUS_ERROR_DBUS_FAILED), check
60 * - Creating a GError for e.g. "org.freedesktop.DBus.Error.AddressInUse"
61 * has (error_domain, code) == (G_DBUS_ERROR, G_DBUS_ERROR_DBUS_FAILED)
63 * - That it is possible to recover e.g. "org.freedesktop.DBus.Error.AddressInUse"
64 * as the D-Bus error name when dealing with an error with (error_domain, code) ==
65 * (G_DBUS_ERROR, G_DBUS_ERROR_DBUS_FAILED)
67 * We just check a couple of well-known errors.
69 check_registered_error ("org.freedesktop.DBus.Error.Failed",
72 check_registered_error ("org.freedesktop.DBus.Error.AddressInUse",
74 G_DBUS_ERROR_ADDRESS_IN_USE);
75 check_registered_error ("org.freedesktop.DBus.Error.UnknownMethod",
77 G_DBUS_ERROR_UNKNOWN_METHOD);
80 /* ---------------------------------------------------------------------------------------------------- */
83 check_unregistered_error (const gchar *given_dbus_error_name)
86 gchar *dbus_error_name;
88 error = g_dbus_error_new_for_dbus_error (given_dbus_error_name, "test message");
89 g_assert_error (error, G_IO_ERROR, G_IO_ERROR_DBUS_ERROR);
90 g_assert (g_dbus_error_is_remote_error (error));
91 dbus_error_name = g_dbus_error_get_remote_error (error);
92 g_assert_cmpstr (dbus_error_name, ==, given_dbus_error_name);
93 g_free (dbus_error_name);
95 /* strip the message */
96 g_assert (g_dbus_error_strip_remote_error (error));
97 g_assert_cmpstr (error->message, ==, "test message");
99 /* check that we can no longer recover the D-Bus error name */
100 g_assert (g_dbus_error_get_remote_error (error) == NULL);
102 g_error_free (error);
107 test_unregistered_errors (void)
109 /* Here we check that we are able to map to GError and back for unregistered
112 * For example, if "com.example.Error.Failed" is not registered, then check
114 * - Creating a GError for e.g. "com.example.Error.Failed" has (error_domain, code) ==
115 * (G_IO_ERROR, G_IO_ERROR_DBUS_ERROR)
117 * - That it is possible to recover e.g. "com.example.Error.Failed" from that
120 * We just check a couple of random errors.
123 check_unregistered_error ("com.example.Error.Failed");
124 check_unregistered_error ("foobar.buh");
127 /* ---------------------------------------------------------------------------------------------------- */
130 check_transparent_gerror (GQuark error_domain,
134 gchar *given_dbus_error_name;
135 gchar *dbus_error_name;
137 error = g_error_new (error_domain, error_code, "test message");
138 given_dbus_error_name = g_dbus_error_encode_gerror (error);
139 g_assert (g_str_has_prefix (given_dbus_error_name, "org.gtk.GDBus.UnmappedGError.Quark"));
140 g_error_free (error);
142 error = g_dbus_error_new_for_dbus_error (given_dbus_error_name, "test message");
143 g_assert_error (error, error_domain, error_code);
144 g_assert (g_dbus_error_is_remote_error (error));
145 dbus_error_name = g_dbus_error_get_remote_error (error);
146 g_assert_cmpstr (dbus_error_name, ==, given_dbus_error_name);
147 g_free (dbus_error_name);
148 g_free (given_dbus_error_name);
150 /* strip the message */
151 g_assert (g_dbus_error_strip_remote_error (error));
152 g_assert_cmpstr (error->message, ==, "test message");
154 /* check that we can no longer recover the D-Bus error name */
155 g_assert (g_dbus_error_get_remote_error (error) == NULL);
157 g_error_free (error);
161 test_transparent_gerror (void)
163 /* Here we check that we are able to transparent pass unregistered GError's
166 * For example, if G_IO_ERROR_FAILED is not registered, then check
168 * - g_dbus_error_encode_gerror() returns something of the form
169 * org.gtk.GDBus.UnmappedGError.Quark_HEXENCODED_QUARK_NAME_.Code_ERROR_CODE
171 * - mapping back the D-Bus error name gives us G_IO_ERROR_FAILED
173 * - That it is possible to recover the D-Bus error name from the
176 * We just check a couple of random errors.
179 check_transparent_gerror (G_IO_ERROR, G_IO_ERROR_FAILED);
180 check_transparent_gerror (G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_PARSE);
189 GDBusErrorEntry test_error_entries[] =
191 { TEST_ERROR_FAILED, "org.gtk.test.Error.Failed" },
192 { TEST_ERROR_BLA, "org.gtk.test.Error.Bla" }
196 test_register_error (void)
198 gsize test_error_quark = 0;
203 g_dbus_error_register_error_domain ("test-error-quark",
206 G_N_ELEMENTS (test_error_entries));
207 g_assert_cmpint (test_error_quark, !=, 0);
209 error = g_dbus_error_new_for_dbus_error ("org.gtk.test.Error.Failed", "Failed");
210 g_assert_error (error, test_error_quark, TEST_ERROR_FAILED);
211 res = g_dbus_error_is_remote_error (error);
212 msg = g_dbus_error_get_remote_error (error);
214 g_assert_cmpstr (msg, ==, "org.gtk.test.Error.Failed");
215 res = g_dbus_error_strip_remote_error (error);
217 g_assert_cmpstr (error->message, ==, "Failed");
218 g_clear_error (&error);
221 g_dbus_error_set_dbus_error (&error, "org.gtk.test.Error.Failed", "Failed again", "Prefix %d", 1);
222 res = g_dbus_error_is_remote_error (error);
223 msg = g_dbus_error_get_remote_error (error);
225 g_assert_cmpstr (msg, ==, "org.gtk.test.Error.Failed");
226 res = g_dbus_error_strip_remote_error (error);
228 g_assert_cmpstr (error->message, ==, "Prefix 1: Failed again");
229 g_clear_error (&error);
232 error = g_error_new_literal (G_IO_ERROR, G_IO_ERROR_NOT_EMPTY, "Not Empty");
233 res = g_dbus_error_is_remote_error (error);
234 msg = g_dbus_error_get_remote_error (error);
236 g_assert_cmpstr (msg, ==, NULL);
237 res = g_dbus_error_strip_remote_error (error);
239 g_assert_cmpstr (error->message, ==, "Not Empty");
240 g_clear_error (&error);
242 error = g_error_new_literal (test_error_quark, TEST_ERROR_BLA, "Bla");
243 msg = g_dbus_error_encode_gerror (error);
244 g_assert_cmpstr (msg, ==, "org.gtk.test.Error.Bla");
246 g_clear_error (&error);
248 res = g_dbus_error_unregister_error (test_error_quark,
249 TEST_ERROR_BLA, "org.gtk.test.Error.Bla");
254 /* ---------------------------------------------------------------------------------------------------- */
260 g_test_init (&argc, &argv, NULL);
262 g_test_add_func ("/gdbus/registered-errors", test_registered_errors);
263 g_test_add_func ("/gdbus/unregistered-errors", test_unregistered_errors);
264 g_test_add_func ("/gdbus/transparent-gerror", test_transparent_gerror);
265 g_test_add_func ("/gdbus/register-error", test_register_error);