25 #ifndef DOXYGEN_SHOULD_SKIP_THIS
27 #ifdef DBUS_BUILD_TESTS
28 #include "dbus-message-factory.h"
29 #include "dbus-message-private.h"
30 #include "dbus-test.h"
39 #define BYTE_ORDER_OFFSET 0
41 #define BODY_LENGTH_OFFSET 4
42 #define FIELDS_ARRAY_LENGTH_OFFSET 12
45 iter_recurse (DBusMessageDataIter *iter)
48 _dbus_assert (iter->depth < _DBUS_MESSAGE_DATA_MAX_NESTING);
53 iter_get_sequence (DBusMessageDataIter *iter)
56 return iter->sequence_nos[iter->depth];
60 iter_set_sequence (DBusMessageDataIter *iter,
64 iter->sequence_nos[iter->depth] = sequence;
68 iter_unrecurse (DBusMessageDataIter *iter)
75 iter_next (DBusMessageDataIter *iter)
77 iter->sequence_nos[iter->depth] += 1;
81 iter_first_in_series (DBusMessageDataIter *iter)
86 while (i < _DBUS_MESSAGE_DATA_MAX_NESTING)
88 if (iter->sequence_nos[i] != 0)
95 typedef dbus_bool_t (* DBusInnerGeneratorFunc) (DBusMessageDataIter *iter,
97 typedef dbus_bool_t (* DBusMessageGeneratorFunc) (DBusMessageDataIter *iter,
111 generate_trivial_inner (DBusMessageDataIter *iter,
116 switch (iter_get_sequence (iter))
121 "org.freedesktop.DocumentFactory",
126 set_reply_serial (message);
130 "org.freedesktop.DocumentFactory",
137 "org.freedesktop.TestErrorName"))
142 const char *v_STRING =
"This is an error";
151 set_reply_serial (message);
160 *message_p = message;
166 generate_many_bodies_inner (DBusMessageDataIter *iter,
181 set_reply_serial (message);
186 if (dbus_internal_do_not_use_generate_bodies (iter_get_sequence (iter),
190 const char *v_SIGNATURE;
206 *message_p = message;
217 return *message_p !=
NULL;
241 generate_outer (DBusMessageDataIter *iter,
244 DBusInnerGeneratorFunc func)
249 if (!(*func)(iter, &message))
256 generate_from_message (data, expected_validity, message);
264 generate_trivial (DBusMessageDataIter *iter,
268 return generate_outer (iter, data, expected_validity,
269 generate_trivial_inner);
273 generate_many_bodies (DBusMessageDataIter *iter,
277 return generate_outer (iter, data, expected_validity,
278 generate_many_bodies_inner);
282 simple_method_call (
void)
308 simple_method_return (
void)
315 set_reply_serial (message);
331 set_reply_serial (message);
337 message_with_nesting_levels (
int levels)
355 message = simple_method_call ();
367 parents[i] = children[i-1];
384 generate_special (DBusMessageDataIter *iter,
398 item_seq = iter_get_sequence (iter);
402 message = simple_method_call ();
413 generate_from_message (data, expected_validity, message);
418 *expected_validity = DBUS_INVALID_UNKNOWN_TYPECODE;
420 else if (item_seq == 1)
423 const char *v_STRING;
426 message = simple_method_call ();
452 generate_from_message (data, expected_validity, message);
454 *expected_validity = DBUS_INVALID_EXCEEDED_MAXIMUM_ARRAY_RECURSION;
456 else if (item_seq == 2)
459 const char *v_STRING;
462 message = simple_method_call ();
497 generate_from_message (data, expected_validity, message);
499 *expected_validity = DBUS_INVALID_EXCEEDED_MAXIMUM_STRUCT_RECURSION;
501 else if (item_seq == 3)
503 message = simple_method_call ();
514 generate_from_message (data, expected_validity, message);
518 *expected_validity = DBUS_INVALID_STRUCT_STARTED_BUT_NOT_ENDED;
520 else if (item_seq == 4)
522 message = simple_method_call ();
533 generate_from_message (data, expected_validity, message);
537 *expected_validity = DBUS_INVALID_STRUCT_ENDED_BUT_NOT_STARTED;
539 else if (item_seq == 5)
541 message = simple_method_call ();
552 generate_from_message (data, expected_validity, message);
557 *expected_validity = DBUS_INVALID_STRUCT_HAS_NO_FIELDS;
559 else if (item_seq == 6)
561 message = simple_method_call ();
562 generate_from_message (data, expected_validity, message);
566 *expected_validity = DBUS_INVALID_BAD_MESSAGE_TYPE;
568 else if (item_seq == 7)
571 message = simple_method_call ();
572 generate_from_message (data, expected_validity, message);
578 else if (item_seq == 8)
580 message = simple_method_call ();
581 generate_from_message (data, expected_validity, message);
589 *expected_validity = DBUS_INVALID_MESSAGE_TOO_LONG;
591 else if (item_seq == 9)
593 const char *v_STRING =
"not a valid bus name";
594 message = simple_method_call ();
601 generate_from_message (data, expected_validity, message);
603 *expected_validity = DBUS_INVALID_BAD_SENDER;
605 else if (item_seq == 10)
607 message = simple_method_call ();
612 generate_from_message (data, expected_validity, message);
614 *expected_validity = DBUS_INVALID_USES_LOCAL_INTERFACE;
616 else if (item_seq == 11)
618 message = simple_method_call ();
623 generate_from_message (data, expected_validity, message);
625 *expected_validity = DBUS_INVALID_USES_LOCAL_PATH;
627 else if (item_seq == 12)
630 message = simple_method_call ();
635 generate_from_message (data, expected_validity, message);
639 else if (item_seq == 13)
642 message = simple_signal ();
647 generate_from_message (data, expected_validity, message);
649 *expected_validity = DBUS_INVALID_MISSING_INTERFACE;
651 else if (item_seq == 14)
653 message = simple_method_return ();
658 generate_from_message (data, expected_validity, message);
660 *expected_validity = DBUS_INVALID_MISSING_REPLY_SERIAL;
662 else if (item_seq == 15)
664 message = simple_error ();
669 generate_from_message (data, expected_validity, message);
671 *expected_validity = DBUS_INVALID_MISSING_ERROR_NAME;
673 else if (item_seq == 16)
676 const char *v_STRING;
680 message = simple_method_call ();
721 generate_from_message (data, expected_validity, message);
723 *expected_validity = DBUS_INVALID_EXCEEDED_MAXIMUM_DICT_ENTRY_RECURSION;
725 else if (item_seq == 17)
727 message = simple_method_call ();
738 generate_from_message (data, expected_validity, message);
743 *expected_validity = DBUS_INVALID_DICT_ENTRY_STARTED_BUT_NOT_ENDED;
745 else if (item_seq == 18)
747 message = simple_method_call ();
758 generate_from_message (data, expected_validity, message);
762 *expected_validity = DBUS_INVALID_DICT_ENTRY_ENDED_BUT_NOT_STARTED;
764 else if (item_seq == 19)
766 message = simple_method_call ();
777 generate_from_message (data, expected_validity, message);
783 *expected_validity = DBUS_INVALID_DICT_ENTRY_HAS_NO_FIELDS;
785 else if (item_seq == 20)
788 message = message_with_nesting_levels(64);
790 generate_from_message (data, expected_validity, message);
794 else if (item_seq == 21)
797 message = message_with_nesting_levels(65);
799 generate_from_message (data, expected_validity, message);
801 *expected_validity = DBUS_INVALID_NESTED_TOO_DEEPLY;
816 generate_wrong_length (DBusMessageDataIter *iter,
820 int lengths[] = { -42, -17, -16, -15, -9, -8, -7, -6, -5, -4, -3, -2, -1,
821 1, 2, 3, 4, 5, 6, 7, 8, 9, 15, 16, 30 };
826 len_seq = iter_get_sequence (iter);
833 if (!generate_many_bodies (iter, data, expected_validity))
835 iter_set_sequence (iter, 0);
836 iter_unrecurse (iter);
840 iter_unrecurse (iter);
842 adjust = lengths[len_seq];
850 *expected_validity = DBUS_INVALID_FOR_UNKNOWN_REASON;
873 new_body_len = old_body_len + adjust;
874 if (new_body_len < 0)
878 *expected_validity = DBUS_VALIDITY_UNKNOWN;
881 _dbus_verbose (
"changing body len from %u to %u by adjust %d\n",
882 old_body_len, new_body_len, adjust);
893 generate_byte_changed (DBusMessageDataIter *iter,
906 if (!generate_many_bodies (iter, data, expected_validity))
910 byte_seq = iter_get_sequence (iter);
912 iter_unrecurse (iter);
919 iter_set_sequence (iter, 0);
920 iter_unrecurse (iter);
926 iter_set_sequence (iter, iter_get_sequence (iter) - 1);
933 *expected_validity = DBUS_VALIDITY_UNKNOWN;
939 find_next_typecode (DBusMessageDataIter *iter,
947 base_depth = iter->depth;
953 body_seq = iter_get_sequence (iter);
955 if (!generate_many_bodies (iter, data, expected_validity))
958 iter_set_sequence (iter, body_seq);
965 byte_seq = iter_get_sequence (iter);
972 iter_set_sequence (iter, 0);
973 iter_unrecurse (iter);
990 iter_unrecurse (iter);
997 static const int typecodes[] = {
1022 generate_typecode_changed (DBusMessageDataIter *iter,
1030 base_depth = iter->depth;
1036 if (!find_next_typecode (iter, data, expected_validity))
1039 iter_recurse (iter);
1040 byte_seq = iter_get_sequence (iter);
1044 iter_recurse (iter);
1045 typecode_seq = iter_get_sequence (iter);
1053 iter_set_sequence (iter, 0);
1054 iter_unrecurse (iter);
1057 iter_unrecurse (iter);
1063 iter_unrecurse (iter);
1065 iter_unrecurse (iter);
1069 printf (
"Changing byte %d in message %d to %c\n",
1070 byte_seq, iter_get_sequence (iter), typecodes[typecode_seq]);
1074 *expected_validity = DBUS_VALIDITY_UNKNOWN;
1084 static const UIntChange uint32_changes[] = {
1092 { CHANGE_TYPE_ABSOLUTE, 0 },
1093 { CHANGE_TYPE_ABSOLUTE, 1 },
1099 generate_uint32_changed (DBusMessageDataIter *iter,
1108 const UIntChange *change;
1115 base_depth = iter->depth;
1120 body_seq = iter_get_sequence (iter);
1122 if (!generate_many_bodies (iter, data, expected_validity))
1127 iter_set_sequence (iter, body_seq);
1128 iter_recurse (iter);
1131 change_seq = iter_get_sequence (iter);
1136 iter_set_sequence (iter, 0);
1137 iter_unrecurse (iter);
1144 iter_recurse (iter);
1146 byte_seq = iter_get_sequence (iter);
1152 iter_unrecurse (iter);
1154 _dbus_assert (_DBUS_ALIGN_VALUE (byte_seq, 4) == (
unsigned) byte_seq);
1159 iter_recurse (iter);
1161 iter_set_sequence (iter, 0);
1162 iter_unrecurse (iter);
1174 change = &uint32_changes[change_seq];
1176 if (change->type == CHANGE_TYPE_ADJUST)
1178 v_UINT32 += (int) change->value;
1182 v_UINT32 = change->value;
1186 printf (
"body %d change %d pos %d ",
1187 body_seq, change_seq, byte_seq);
1189 if (change->type == CHANGE_TYPE_ADJUST)
1190 printf (
"adjust by %d", (
int) change->value);
1192 printf (
"set to %u", change->value);
1194 printf (
" \t%u -> %u\n",
1200 *expected_validity = DBUS_VALIDITY_UNKNOWN;
1203 iter_unrecurse (iter);
1212 DBusMessageGeneratorFunc func;
1213 } DBusMessageGenerator;
1215 static const DBusMessageGenerator generators[] = {
1216 {
"trivial example of each message type", generate_trivial },
1217 {
"assorted arguments", generate_many_bodies },
1218 {
"assorted special cases", generate_special },
1219 {
"each uint32 modified", generate_uint32_changed },
1220 {
"wrong body lengths", generate_wrong_length },
1221 {
"each byte modified", generate_byte_changed },
1224 {
"change each typecode", generate_typecode_changed }
1229 _dbus_message_data_free (DBusMessageData *data)
1235 _dbus_message_data_iter_init (DBusMessageDataIter *iter)
1241 while (i < _DBUS_MESSAGE_DATA_MAX_NESTING)
1243 iter->sequence_nos[i] = 0;
1250 _dbus_message_data_iter_get_and_next (DBusMessageDataIter *iter,
1251 DBusMessageData *data)
1253 DBusMessageGeneratorFunc func;
1257 generator = iter_get_sequence (iter);
1262 iter_recurse (iter);
1264 if (iter_first_in_series (iter))
1266 printf (
" testing message loading: %s ", generators[generator].name);
1270 func = generators[generator].func;
1275 if ((*func)(iter, &data->data, &data->expected_validity))
1279 iter_set_sequence (iter, 0);
1280 iter_unrecurse (iter);
1283 printf (
"%d test loads cumulative\n", iter->count);
1286 iter_unrecurse (iter);