1 /* Simple sanity-check for D-Bus syntax validation.
3 * Author: Simon McVittie <simon.mcvittie@collabora.co.uk>
4 * Copyright © 2010-2011 Nokia Corporation
6 * Permission is hereby granted, free of charge, to any person
7 * obtaining a copy of this software and associated documentation files
8 * (the "Software"), to deal in the Software without restriction,
9 * including without limitation the rights to use, copy, modify, merge,
10 * publish, distribute, sublicense, and/or sell copies of the Software,
11 * and to permit persons to whom the Software is furnished to do so,
12 * subject to the following conditions:
14 * The above copyright notice and this permission notice shall be
15 * included in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
21 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
22 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31 #include <dbus/dbus.h>
33 #include "test-utils-glib.h"
40 dbus_bool_t (*function) (const char *, DBusError *);
41 const char * const * valid;
42 const char * const * invalid;
45 Test paths, interfaces, members, errors, bus_names, signatures,
46 single_signatures, strings;
48 const char * const valid_paths[] = {
54 "/org/freedesktop/DBus",
55 "/org/freedesktop/Telepathy/AccountManager",
59 const char * const invalid_paths[] = {
65 "/com//example/MyApp",
67 "/\xa9", /* © in latin-1 */
68 "/\xc2\xa9", /* © in UTF-8 */
72 const char * const valid_interfaces[] = {
75 "org.freedesktop.DBus",
79 const char * const invalid_interfaces[] = {
87 "com.example.a\xc2\xa9",
91 const char * const valid_members[] = {
96 "BadgerMushroomSnake",
100 const char * const invalid_members[] = {
113 const char * const valid_errors[] = {
116 "org.freedesktop.DBus.NameHasNoOwner",
120 const char * const invalid_errors[] = {
128 "com.example.a\xc2\xa9",
132 const char * const valid_bus_names[] = {
139 "org.freedesktop.DBus",
143 const char * const invalid_bus_names[] = {
151 "com.example.a\xc2\xa9",
155 const char * const valid_signatures[] = {
161 const char * const invalid_signatures[] = {
167 const char * const valid_single_signatures[] = {
173 const char * const invalid_single_signatures[] = {
181 const char * const valid_strings[] = {
183 "\xc2\xa9", /* UTF-8 (c) symbol */
184 "\xef\xbf\xbe", /* U+FFFE is reserved but Corrigendum 9 says it's OK */
188 const char * const invalid_strings[] = {
189 "\xa9", /* Latin-1 (c) symbol */
190 "\xed\xa0\x80", /* UTF-16 surrogates are not valid in UTF-8 */
196 gconstpointer arg G_GNUC_UNUSED)
198 dbus_error_init (&f->e);
200 #define FILL_TEST(name, func) \
202 (name).function = (func); \
203 (name).valid = valid_ ## name; \
204 (name).invalid = invalid_ ## name; \
207 FILL_TEST (paths, dbus_validate_path);
208 FILL_TEST (interfaces, dbus_validate_interface);
209 FILL_TEST (members, dbus_validate_member);
210 FILL_TEST (errors, dbus_validate_error_name);
211 FILL_TEST (bus_names, dbus_validate_bus_name);
212 FILL_TEST (signatures, dbus_signature_validate);
213 FILL_TEST (single_signatures, dbus_signature_validate_single);
214 FILL_TEST (strings, dbus_validate_utf8);
218 test_syntax (Fixture *f,
221 const Test *test = arg;
224 g_assert (test != NULL);
225 g_assert (test->function != NULL);
226 g_assert (test->valid != NULL);
227 g_assert (test->invalid != NULL);
229 for (i = 0; test->valid[i] != NULL; i++)
231 dbus_bool_t ok = test->function (test->valid[i], &f->e);
233 if (dbus_error_is_set (&f->e))
234 g_error ("%s was considered invalid: %s: %s", test->valid[i],
235 f->e.name, f->e.message);
238 g_error ("%s was considered invalid without an error", test->valid[i]);
241 for (i = 0; test->invalid[i] != NULL; i++)
243 dbus_bool_t ok = test->function (test->invalid[i], &f->e);
246 g_error ("%s should have been considered invalid", test->invalid[i]);
248 if (!dbus_error_is_set (&f->e))
249 g_error ("%s should have an error set", test->invalid[i]);
251 if (!dbus_validate_error_name (f->e.name, NULL))
252 g_error ("%s produced an invalid error name: %s",
253 test->invalid[i], f->e.name);
255 if (!dbus_validate_utf8 (f->e.message, NULL))
256 g_error ("%s produced an invalid error message: %s",
257 test->invalid[i], f->e.message);
259 dbus_error_free (&f->e);
264 teardown (Fixture *f,
265 gconstpointer arg G_GNUC_UNUSED)
267 dbus_error_free (&f->e);
274 test_init (&argc, &argv);
276 g_test_add ("/syntax/path", Fixture, &paths, setup, test_syntax, teardown);
277 g_test_add ("/syntax/interface", Fixture, &interfaces,
278 setup, test_syntax, teardown);
279 g_test_add ("/syntax/error", Fixture, &errors,
280 setup, test_syntax, teardown);
281 g_test_add ("/syntax/member", Fixture, &members,
282 setup, test_syntax, teardown);
283 g_test_add ("/syntax/bus-name", Fixture, &bus_names,
284 setup, test_syntax, teardown);
285 g_test_add ("/syntax/signature", Fixture, &signatures,
286 setup, test_syntax, teardown);
287 g_test_add ("/syntax/single-signature", Fixture, &single_signatures,
288 setup, test_syntax, teardown);
289 g_test_add ("/syntax/utf8", Fixture, &strings,
290 setup, test_syntax, teardown);
292 return g_test_run ();