1 /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
2 /* dbus-marshal-validate-util.c Would be in dbus-marshal-validate.c, but only used by tests/bus
4 * Copyright (C) 2005 Red Hat, Inc.
6 * Licensed under the Academic Free License version 2.1
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 #ifdef DBUS_ENABLE_EMBEDDED_TESTS
27 #ifndef DOXYGEN_SHOULD_SKIP_THIS
29 #include "dbus-internals.h"
30 #include "dbus-marshal-validate.h"
31 #include "dbus-marshal-recursive.h"
33 #include "dbus-test.h"
39 DBusValidity expected;
43 run_validity_tests (const ValidityTest *tests,
45 DBusValidity (* func) (const DBusString*,int,int))
49 for (i = 0; i < n_tests; i++)
54 _dbus_string_init_const (&str, tests[i].data);
56 v = (*func) (&str, 0, _dbus_string_get_length (&str));
58 if (v != tests[i].expected)
60 _dbus_warn ("Improper validation result %d for '%s'",
62 _dbus_assert_not_reached ("test failed");
67 static const ValidityTest signature_tests[] = {
69 { "sss", DBUS_VALID },
73 { "(i)", DBUS_VALID },
74 { "w", DBUS_INVALID_UNKNOWN_TYPECODE },
75 { "a", DBUS_INVALID_MISSING_ARRAY_ELEMENT_TYPE },
76 { "aaaaaa", DBUS_INVALID_MISSING_ARRAY_ELEMENT_TYPE },
77 { "ii(ii)a", DBUS_INVALID_MISSING_ARRAY_ELEMENT_TYPE },
78 { "ia", DBUS_INVALID_MISSING_ARRAY_ELEMENT_TYPE },
79 /* DBUS_INVALID_SIGNATURE_TOO_LONG, */ /* too hard to test this way */
80 { "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
81 DBUS_INVALID_EXCEEDED_MAXIMUM_ARRAY_RECURSION },
82 { "((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ii))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))",
83 DBUS_INVALID_EXCEEDED_MAXIMUM_STRUCT_RECURSION },
84 { ")", DBUS_INVALID_STRUCT_ENDED_BUT_NOT_STARTED },
85 { "i)", DBUS_INVALID_STRUCT_ENDED_BUT_NOT_STARTED },
86 { "a)", DBUS_INVALID_MISSING_ARRAY_ELEMENT_TYPE },
87 { "(", DBUS_INVALID_STRUCT_STARTED_BUT_NOT_ENDED },
88 { "(i", DBUS_INVALID_STRUCT_STARTED_BUT_NOT_ENDED },
89 { "(iiiii", DBUS_INVALID_STRUCT_STARTED_BUT_NOT_ENDED },
90 { "(ai", DBUS_INVALID_STRUCT_STARTED_BUT_NOT_ENDED },
91 { "()", DBUS_INVALID_STRUCT_HAS_NO_FIELDS },
92 { "(())", DBUS_INVALID_STRUCT_HAS_NO_FIELDS },
93 { "a()", DBUS_INVALID_STRUCT_HAS_NO_FIELDS },
94 { "i()", DBUS_INVALID_STRUCT_HAS_NO_FIELDS },
95 { "()i", DBUS_INVALID_STRUCT_HAS_NO_FIELDS },
96 { "(a)", DBUS_INVALID_MISSING_ARRAY_ELEMENT_TYPE },
97 { "a{ia}", DBUS_INVALID_MISSING_ARRAY_ELEMENT_TYPE },
98 { "a{}", DBUS_INVALID_DICT_ENTRY_HAS_NO_FIELDS },
99 { "a{aii}", DBUS_INVALID_DICT_KEY_MUST_BE_BASIC_TYPE },
100 { " ", DBUS_INVALID_UNKNOWN_TYPECODE },
101 { "not a valid signature", DBUS_INVALID_UNKNOWN_TYPECODE },
102 { "123", DBUS_INVALID_UNKNOWN_TYPECODE },
103 { ".", DBUS_INVALID_UNKNOWN_TYPECODE },
104 /* https://bugs.freedesktop.org/show_bug.cgi?id=17803 */
105 { "a{(ii)i}", DBUS_INVALID_DICT_KEY_MUST_BE_BASIC_TYPE },
107 /* { "a{i}", DBUS_INVALID_DICT_ENTRY_HAS_ONLY_ONE_FIELD }, */
108 /* { "{is}", DBUS_INVALID_DICT_ENTRY_NOT_INSIDE_ARRAY }, */
109 /* { "a{isi}", DBUS_INVALID_DICT_ENTRY_HAS_TOO_MANY_FIELDS }, */
113 _dbus_marshal_validate_test (void)
118 const char *valid_paths[] = {
124 const char *invalid_paths[] = {
140 const char *valid_interfaces[] = {
141 "org.freedesktop.Foo",
143 "Blah.Blah.Blah.Blah.Blah",
146 "a0.b1.c2.d3.e4.f5.g6",
149 const char *invalid_interfaces[] = {
177 const char *valid_unique_names[] = {
186 ":abce.freedesktop.blah"
188 const char *invalid_unique_names[] = {
202 const char *valid_members[] = {
210 const char *invalid_members[] = {
225 /* Signature with reason */
227 run_validity_tests (signature_tests, _DBUS_N_ELEMENTS (signature_tests),
228 _dbus_validate_signature_with_reason);
230 /* Path validation */
232 while (i < (int) _DBUS_N_ELEMENTS (valid_paths))
234 _dbus_string_init_const (&str, valid_paths[i]);
236 if (!_dbus_validate_path (&str, 0,
237 _dbus_string_get_length (&str)))
239 _dbus_warn ("Path \"%s\" should have been valid", valid_paths[i]);
240 _dbus_assert_not_reached ("invalid path");
247 while (i < (int) _DBUS_N_ELEMENTS (invalid_paths))
249 _dbus_string_init_const (&str, invalid_paths[i]);
251 if (_dbus_validate_path (&str, 0,
252 _dbus_string_get_length (&str)))
254 _dbus_warn ("Path \"%s\" should have been invalid", invalid_paths[i]);
255 _dbus_assert_not_reached ("valid path");
261 /* Interface validation */
263 while (i < (int) _DBUS_N_ELEMENTS (valid_interfaces))
265 _dbus_string_init_const (&str, valid_interfaces[i]);
267 if (!_dbus_validate_interface (&str, 0,
268 _dbus_string_get_length (&str)))
270 _dbus_warn ("Interface \"%s\" should have been valid", valid_interfaces[i]);
271 _dbus_assert_not_reached ("invalid interface");
278 while (i < (int) _DBUS_N_ELEMENTS (invalid_interfaces))
280 _dbus_string_init_const (&str, invalid_interfaces[i]);
282 if (_dbus_validate_interface (&str, 0,
283 _dbus_string_get_length (&str)))
285 _dbus_warn ("Interface \"%s\" should have been invalid", invalid_interfaces[i]);
286 _dbus_assert_not_reached ("valid interface");
292 /* Bus name validation (check that valid interfaces are valid bus names,
293 * and invalid interfaces are invalid services except if they start with ':')
296 while (i < (int) _DBUS_N_ELEMENTS (valid_interfaces))
298 _dbus_string_init_const (&str, valid_interfaces[i]);
300 if (!_dbus_validate_bus_name (&str, 0,
301 _dbus_string_get_length (&str)))
303 _dbus_warn ("Bus name \"%s\" should have been valid", valid_interfaces[i]);
304 _dbus_assert_not_reached ("invalid bus name");
311 while (i < (int) _DBUS_N_ELEMENTS (invalid_interfaces))
313 if (invalid_interfaces[i][0] != ':')
315 _dbus_string_init_const (&str, invalid_interfaces[i]);
317 if (_dbus_validate_bus_name (&str, 0,
318 _dbus_string_get_length (&str)))
320 _dbus_warn ("Bus name \"%s\" should have been invalid", invalid_interfaces[i]);
321 _dbus_assert_not_reached ("valid bus name");
328 /* unique name validation */
330 while (i < (int) _DBUS_N_ELEMENTS (valid_unique_names))
332 _dbus_string_init_const (&str, valid_unique_names[i]);
334 if (!_dbus_validate_bus_name (&str, 0,
335 _dbus_string_get_length (&str)))
337 _dbus_warn ("Bus name \"%s\" should have been valid", valid_unique_names[i]);
338 _dbus_assert_not_reached ("invalid unique name");
345 while (i < (int) _DBUS_N_ELEMENTS (invalid_unique_names))
347 _dbus_string_init_const (&str, invalid_unique_names[i]);
349 if (_dbus_validate_bus_name (&str, 0,
350 _dbus_string_get_length (&str)))
352 _dbus_warn ("Bus name \"%s\" should have been invalid", invalid_unique_names[i]);
353 _dbus_assert_not_reached ("valid unique name");
360 /* Error name validation (currently identical to interfaces)
363 while (i < (int) _DBUS_N_ELEMENTS (valid_interfaces))
365 _dbus_string_init_const (&str, valid_interfaces[i]);
367 if (!_dbus_validate_error_name (&str, 0,
368 _dbus_string_get_length (&str)))
370 _dbus_warn ("Error name \"%s\" should have been valid", valid_interfaces[i]);
371 _dbus_assert_not_reached ("invalid error name");
378 while (i < (int) _DBUS_N_ELEMENTS (invalid_interfaces))
380 if (invalid_interfaces[i][0] != ':')
382 _dbus_string_init_const (&str, invalid_interfaces[i]);
384 if (_dbus_validate_error_name (&str, 0,
385 _dbus_string_get_length (&str)))
387 _dbus_warn ("Error name \"%s\" should have been invalid", invalid_interfaces[i]);
388 _dbus_assert_not_reached ("valid error name");
395 /* Member validation */
397 while (i < (int) _DBUS_N_ELEMENTS (valid_members))
399 _dbus_string_init_const (&str, valid_members[i]);
401 if (!_dbus_validate_member (&str, 0,
402 _dbus_string_get_length (&str)))
404 _dbus_warn ("Member \"%s\" should have been valid", valid_members[i]);
405 _dbus_assert_not_reached ("invalid member");
412 while (i < (int) _DBUS_N_ELEMENTS (invalid_members))
414 _dbus_string_init_const (&str, invalid_members[i]);
416 if (_dbus_validate_member (&str, 0,
417 _dbus_string_get_length (&str)))
419 _dbus_warn ("Member \"%s\" should have been invalid", invalid_members[i]);
420 _dbus_assert_not_reached ("valid member");
426 /* Validate claimed length longer than real length */
427 _dbus_string_init_const (&str, "abc.efg");
428 if (_dbus_validate_bus_name (&str, 0, 8))
429 _dbus_assert_not_reached ("validated too-long string");
430 if (_dbus_validate_interface (&str, 0, 8))
431 _dbus_assert_not_reached ("validated too-long string");
432 if (_dbus_validate_error_name (&str, 0, 8))
433 _dbus_assert_not_reached ("validated too-long string");
435 _dbus_string_init_const (&str, "abc");
436 if (_dbus_validate_member (&str, 0, 4))
437 _dbus_assert_not_reached ("validated too-long string");
439 /* Validate string exceeding max name length */
440 if (!_dbus_string_init (&str))
441 _dbus_assert_not_reached ("no memory");
443 while (_dbus_string_get_length (&str) <= DBUS_MAXIMUM_NAME_LENGTH)
444 if (!_dbus_string_append (&str, "abc.def"))
445 _dbus_assert_not_reached ("no memory");
447 if (_dbus_validate_bus_name (&str, 0, _dbus_string_get_length (&str)))
448 _dbus_assert_not_reached ("validated overmax string");
449 if (_dbus_validate_interface (&str, 0, _dbus_string_get_length (&str)))
450 _dbus_assert_not_reached ("validated overmax string");
451 if (_dbus_validate_error_name (&str, 0, _dbus_string_get_length (&str)))
452 _dbus_assert_not_reached ("validated overmax string");
454 /* overlong member */
455 _dbus_string_set_length (&str, 0);
456 while (_dbus_string_get_length (&str) <= DBUS_MAXIMUM_NAME_LENGTH)
457 if (!_dbus_string_append (&str, "abc"))
458 _dbus_assert_not_reached ("no memory");
460 if (_dbus_validate_member (&str, 0, _dbus_string_get_length (&str)))
461 _dbus_assert_not_reached ("validated overmax string");
463 /* overlong unique name */
464 _dbus_string_set_length (&str, 0);
465 _dbus_string_append (&str, ":");
466 while (_dbus_string_get_length (&str) <= DBUS_MAXIMUM_NAME_LENGTH)
467 if (!_dbus_string_append (&str, "abc"))
468 _dbus_assert_not_reached ("no memory");
470 if (_dbus_validate_bus_name (&str, 0, _dbus_string_get_length (&str)))
471 _dbus_assert_not_reached ("validated overmax string");
473 _dbus_string_free (&str);
475 /* Body validation; test basic validation of valid bodies for both endian */
479 DBusString signature;
482 if (!_dbus_string_init (&signature) || !_dbus_string_init (&body))
483 _dbus_assert_not_reached ("oom");
486 while (dbus_internal_do_not_use_generate_bodies (sequence,
490 DBusValidity validity;
492 validity = _dbus_validate_body_with_reason (&signature, 0,
495 _dbus_string_get_length (&body));
496 if (validity != DBUS_VALID)
498 _dbus_warn ("invalid code %d expected valid on sequence %d little endian",
500 _dbus_verbose_bytes_of_string (&signature, 0, _dbus_string_get_length (&signature));
501 _dbus_verbose_bytes_of_string (&body, 0, _dbus_string_get_length (&body));
502 _dbus_assert_not_reached ("test failed");
505 _dbus_string_set_length (&signature, 0);
506 _dbus_string_set_length (&body, 0);
511 while (dbus_internal_do_not_use_generate_bodies (sequence,
515 DBusValidity validity;
517 validity = _dbus_validate_body_with_reason (&signature, 0,
520 _dbus_string_get_length (&body));
521 if (validity != DBUS_VALID)
523 _dbus_warn ("invalid code %d expected valid on sequence %d big endian",
525 _dbus_verbose_bytes_of_string (&signature, 0, _dbus_string_get_length (&signature));
526 _dbus_verbose_bytes_of_string (&body, 0, _dbus_string_get_length (&body));
527 _dbus_assert_not_reached ("test failed");
530 _dbus_string_set_length (&signature, 0);
531 _dbus_string_set_length (&body, 0);
535 _dbus_string_free (&signature);
536 _dbus_string_free (&body);
542 #endif /* !DOXYGEN_SHOULD_SKIP_THIS */
544 #endif /* DBUS_ENABLE_EMBEDDED_TESTS */