1 /* -*- mode: C; c-file-style: "gnu" -*- */
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 #ifdef DBUS_BUILD_TESTS
26 #include "dbus-internals.h"
27 #include "dbus-marshal-validate.h"
28 #include "dbus-marshal-recursive.h"
30 #include "dbus-test.h"
36 DBusValidity expected;
40 run_validity_tests (const ValidityTest *tests,
42 DBusValidity (* func) (const DBusString*,int,int))
46 for (i = 0; i < n_tests; i++)
51 _dbus_string_init_const (&str, tests[i].data);
53 v = (*func) (&str, 0, _dbus_string_get_length (&str));
55 if (v != tests[i].expected)
57 _dbus_warn ("Improper validation result %d for '%s'\n",
59 _dbus_assert_not_reached ("test failed");
66 static const ValidityTest signature_tests[] = {
70 { "(i)", DBUS_VALID },
71 { "q", DBUS_INVALID_UNKNOWN_TYPECODE },
72 { "a", DBUS_INVALID_MISSING_ARRAY_ELEMENT_TYPE },
73 { "aaaaaa", DBUS_INVALID_MISSING_ARRAY_ELEMENT_TYPE },
74 { "ii(ii)a", DBUS_INVALID_MISSING_ARRAY_ELEMENT_TYPE },
75 { "ia", DBUS_INVALID_MISSING_ARRAY_ELEMENT_TYPE },
76 /* DBUS_INVALID_SIGNATURE_TOO_LONG, */ /* too hard to test this way */
77 { "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
78 DBUS_INVALID_EXCEEDED_MAXIMUM_ARRAY_RECURSION },
79 { "((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ii))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))",
80 DBUS_INVALID_EXCEEDED_MAXIMUM_STRUCT_RECURSION },
81 { ")", DBUS_INVALID_STRUCT_ENDED_BUT_NOT_STARTED },
82 { "i)", DBUS_INVALID_STRUCT_ENDED_BUT_NOT_STARTED },
83 { "a)", DBUS_INVALID_STRUCT_ENDED_BUT_NOT_STARTED },
84 { "(", DBUS_INVALID_STRUCT_STARTED_BUT_NOT_ENDED },
85 { "(i", DBUS_INVALID_STRUCT_STARTED_BUT_NOT_ENDED },
86 { "(iiiii", DBUS_INVALID_STRUCT_STARTED_BUT_NOT_ENDED },
87 { "(ai", DBUS_INVALID_STRUCT_STARTED_BUT_NOT_ENDED },
88 { "()", DBUS_INVALID_STRUCT_HAS_NO_FIELDS },
89 { "(())", DBUS_INVALID_STRUCT_HAS_NO_FIELDS },
90 { "a()", DBUS_INVALID_STRUCT_HAS_NO_FIELDS },
91 { "i()", DBUS_INVALID_STRUCT_HAS_NO_FIELDS },
92 { "()i", DBUS_INVALID_STRUCT_HAS_NO_FIELDS }
96 _dbus_marshal_validate_test (void)
101 const char *valid_paths[] = {
107 const char *invalid_paths[] = {
123 const char *valid_interfaces[] = {
124 "org.freedesktop.Foo",
126 "Blah.Blah.Blah.Blah.Blah",
129 "a0.b1.c2.d3.e4.f5.g6",
132 const char *invalid_interfaces[] = {
160 const char *valid_unique_names[] = {
169 ":abce.freedesktop.blah"
171 const char *invalid_unique_names[] = {
185 const char *valid_members[] = {
193 const char *invalid_members[] = {
208 const char *valid_signatures[] = {
215 const char *invalid_signatures[] = {
217 "not a valid signature",
223 /* Signature with reason */
225 run_validity_tests (signature_tests, _DBUS_N_ELEMENTS (signature_tests),
226 _dbus_validate_signature_with_reason);
228 /* Path validation */
230 while (i < (int) _DBUS_N_ELEMENTS (valid_paths))
232 _dbus_string_init_const (&str, valid_paths[i]);
234 if (!_dbus_validate_path (&str, 0,
235 _dbus_string_get_length (&str)))
237 _dbus_warn ("Path \"%s\" should have been valid\n", valid_paths[i]);
238 _dbus_assert_not_reached ("invalid path");
245 while (i < (int) _DBUS_N_ELEMENTS (invalid_paths))
247 _dbus_string_init_const (&str, invalid_paths[i]);
249 if (_dbus_validate_path (&str, 0,
250 _dbus_string_get_length (&str)))
252 _dbus_warn ("Path \"%s\" should have been invalid\n", invalid_paths[i]);
253 _dbus_assert_not_reached ("valid path");
259 /* Interface validation */
261 while (i < (int) _DBUS_N_ELEMENTS (valid_interfaces))
263 _dbus_string_init_const (&str, valid_interfaces[i]);
265 if (!_dbus_validate_interface (&str, 0,
266 _dbus_string_get_length (&str)))
268 _dbus_warn ("Interface \"%s\" should have been valid\n", valid_interfaces[i]);
269 _dbus_assert_not_reached ("invalid interface");
276 while (i < (int) _DBUS_N_ELEMENTS (invalid_interfaces))
278 _dbus_string_init_const (&str, invalid_interfaces[i]);
280 if (_dbus_validate_interface (&str, 0,
281 _dbus_string_get_length (&str)))
283 _dbus_warn ("Interface \"%s\" should have been invalid\n", invalid_interfaces[i]);
284 _dbus_assert_not_reached ("valid interface");
290 /* Bus name validation (check that valid interfaces are valid bus names,
291 * and invalid interfaces are invalid services except if they start with ':')
294 while (i < (int) _DBUS_N_ELEMENTS (valid_interfaces))
296 _dbus_string_init_const (&str, valid_interfaces[i]);
298 if (!_dbus_validate_bus_name (&str, 0,
299 _dbus_string_get_length (&str)))
301 _dbus_warn ("Bus name \"%s\" should have been valid\n", valid_interfaces[i]);
302 _dbus_assert_not_reached ("invalid bus name");
309 while (i < (int) _DBUS_N_ELEMENTS (invalid_interfaces))
311 if (invalid_interfaces[i][0] != ':')
313 _dbus_string_init_const (&str, invalid_interfaces[i]);
315 if (_dbus_validate_bus_name (&str, 0,
316 _dbus_string_get_length (&str)))
318 _dbus_warn ("Bus name \"%s\" should have been invalid\n", invalid_interfaces[i]);
319 _dbus_assert_not_reached ("valid bus name");
326 /* unique name validation */
328 while (i < (int) _DBUS_N_ELEMENTS (valid_unique_names))
330 _dbus_string_init_const (&str, valid_unique_names[i]);
332 if (!_dbus_validate_bus_name (&str, 0,
333 _dbus_string_get_length (&str)))
335 _dbus_warn ("Bus name \"%s\" should have been valid\n", valid_unique_names[i]);
336 _dbus_assert_not_reached ("invalid unique name");
343 while (i < (int) _DBUS_N_ELEMENTS (invalid_unique_names))
345 _dbus_string_init_const (&str, invalid_unique_names[i]);
347 if (_dbus_validate_bus_name (&str, 0,
348 _dbus_string_get_length (&str)))
350 _dbus_warn ("Bus name \"%s\" should have been invalid\n", invalid_unique_names[i]);
351 _dbus_assert_not_reached ("valid unique name");
358 /* Error name validation (currently identical to interfaces)
361 while (i < (int) _DBUS_N_ELEMENTS (valid_interfaces))
363 _dbus_string_init_const (&str, valid_interfaces[i]);
365 if (!_dbus_validate_error_name (&str, 0,
366 _dbus_string_get_length (&str)))
368 _dbus_warn ("Error name \"%s\" should have been valid\n", valid_interfaces[i]);
369 _dbus_assert_not_reached ("invalid error name");
376 while (i < (int) _DBUS_N_ELEMENTS (invalid_interfaces))
378 if (invalid_interfaces[i][0] != ':')
380 _dbus_string_init_const (&str, invalid_interfaces[i]);
382 if (_dbus_validate_error_name (&str, 0,
383 _dbus_string_get_length (&str)))
385 _dbus_warn ("Error name \"%s\" should have been invalid\n", invalid_interfaces[i]);
386 _dbus_assert_not_reached ("valid error name");
393 /* Member validation */
395 while (i < (int) _DBUS_N_ELEMENTS (valid_members))
397 _dbus_string_init_const (&str, valid_members[i]);
399 if (!_dbus_validate_member (&str, 0,
400 _dbus_string_get_length (&str)))
402 _dbus_warn ("Member \"%s\" should have been valid\n", valid_members[i]);
403 _dbus_assert_not_reached ("invalid member");
410 while (i < (int) _DBUS_N_ELEMENTS (invalid_members))
412 _dbus_string_init_const (&str, invalid_members[i]);
414 if (_dbus_validate_member (&str, 0,
415 _dbus_string_get_length (&str)))
417 _dbus_warn ("Member \"%s\" should have been invalid\n", invalid_members[i]);
418 _dbus_assert_not_reached ("valid member");
424 /* Signature validation */
426 while (i < (int) _DBUS_N_ELEMENTS (valid_signatures))
428 _dbus_string_init_const (&str, valid_signatures[i]);
430 if (!_dbus_validate_signature (&str, 0,
431 _dbus_string_get_length (&str)))
433 _dbus_warn ("Signature \"%s\" should have been valid\n", valid_signatures[i]);
434 _dbus_assert_not_reached ("invalid signature");
441 while (i < (int) _DBUS_N_ELEMENTS (invalid_signatures))
443 _dbus_string_init_const (&str, invalid_signatures[i]);
445 if (_dbus_validate_signature (&str, 0,
446 _dbus_string_get_length (&str)))
448 _dbus_warn ("Signature \"%s\" should have been invalid\n", invalid_signatures[i]);
449 _dbus_assert_not_reached ("valid signature");
455 /* Validate claimed length longer than real length */
456 _dbus_string_init_const (&str, "abc.efg");
457 if (_dbus_validate_bus_name (&str, 0, 8))
458 _dbus_assert_not_reached ("validated too-long string");
459 if (_dbus_validate_interface (&str, 0, 8))
460 _dbus_assert_not_reached ("validated too-long string");
461 if (_dbus_validate_error_name (&str, 0, 8))
462 _dbus_assert_not_reached ("validated too-long string");
464 _dbus_string_init_const (&str, "abc");
465 if (_dbus_validate_member (&str, 0, 4))
466 _dbus_assert_not_reached ("validated too-long string");
468 _dbus_string_init_const (&str, "sss");
469 if (_dbus_validate_signature (&str, 0, 4))
470 _dbus_assert_not_reached ("validated too-long signature");
472 /* Validate string exceeding max name length */
473 if (!_dbus_string_init (&str))
474 _dbus_assert_not_reached ("no memory");
476 while (_dbus_string_get_length (&str) <= DBUS_MAXIMUM_NAME_LENGTH)
477 if (!_dbus_string_append (&str, "abc.def"))
478 _dbus_assert_not_reached ("no memory");
480 if (_dbus_validate_bus_name (&str, 0, _dbus_string_get_length (&str)))
481 _dbus_assert_not_reached ("validated overmax string");
482 if (_dbus_validate_interface (&str, 0, _dbus_string_get_length (&str)))
483 _dbus_assert_not_reached ("validated overmax string");
484 if (_dbus_validate_error_name (&str, 0, _dbus_string_get_length (&str)))
485 _dbus_assert_not_reached ("validated overmax string");
487 /* overlong member */
488 _dbus_string_set_length (&str, 0);
489 while (_dbus_string_get_length (&str) <= DBUS_MAXIMUM_NAME_LENGTH)
490 if (!_dbus_string_append (&str, "abc"))
491 _dbus_assert_not_reached ("no memory");
493 if (_dbus_validate_member (&str, 0, _dbus_string_get_length (&str)))
494 _dbus_assert_not_reached ("validated overmax string");
496 /* overlong unique name */
497 _dbus_string_set_length (&str, 0);
498 _dbus_string_append (&str, ":");
499 while (_dbus_string_get_length (&str) <= DBUS_MAXIMUM_NAME_LENGTH)
500 if (!_dbus_string_append (&str, "abc"))
501 _dbus_assert_not_reached ("no memory");
503 if (_dbus_validate_bus_name (&str, 0, _dbus_string_get_length (&str)))
504 _dbus_assert_not_reached ("validated overmax string");
506 _dbus_string_free (&str);
508 /* Body validation; test basic validation of valid bodies for both endian */
512 DBusString signature;
515 if (!_dbus_string_init (&signature) || !_dbus_string_init (&body))
516 _dbus_assert_not_reached ("oom");
519 while (dbus_internal_do_not_use_generate_bodies (sequence,
523 DBusValidity validity;
525 validity = _dbus_validate_body_with_reason (&signature, 0,
528 _dbus_string_get_length (&body));
529 if (validity != DBUS_VALID)
531 _dbus_warn ("invalid code %d expected valid on sequence %d little endian\n",
533 _dbus_verbose_bytes_of_string (&signature, 0, _dbus_string_get_length (&signature));
534 _dbus_verbose_bytes_of_string (&body, 0, _dbus_string_get_length (&body));
535 _dbus_assert_not_reached ("test failed");
538 _dbus_string_set_length (&signature, 0);
539 _dbus_string_set_length (&body, 0);
544 while (dbus_internal_do_not_use_generate_bodies (sequence,
548 DBusValidity validity;
550 validity = _dbus_validate_body_with_reason (&signature, 0,
553 _dbus_string_get_length (&body));
554 if (validity != DBUS_VALID)
556 _dbus_warn ("invalid code %d expected valid on sequence %d big endian\n",
558 _dbus_verbose_bytes_of_string (&signature, 0, _dbus_string_get_length (&signature));
559 _dbus_verbose_bytes_of_string (&body, 0, _dbus_string_get_length (&body));
560 _dbus_assert_not_reached ("test failed");
563 _dbus_string_set_length (&signature, 0);
564 _dbus_string_set_length (&body, 0);
568 _dbus_string_free (&signature);
569 _dbus_string_free (&body);
575 #endif /* DBUS_BUILD_TESTS */