25 #ifndef DOXYGEN_SHOULD_SKIP_THIS
27 #ifdef DBUS_ENABLE_EMBEDDED_TESTS
28 #include "dbus-message-factory.h"
29 #include "dbus-message-private.h"
30 #include "dbus-signature.h"
31 #include "dbus-test.h"
40 #define BYTE_ORDER_OFFSET 0
42 #define BODY_LENGTH_OFFSET 4
43 #define FIELDS_ARRAY_LENGTH_OFFSET 12
46 iter_recurse (DBusMessageDataIter *iter)
49 _dbus_assert (iter->depth < _DBUS_MESSAGE_DATA_MAX_NESTING);
54 iter_get_sequence (DBusMessageDataIter *iter)
57 return iter->sequence_nos[iter->depth];
61 iter_set_sequence (DBusMessageDataIter *iter,
65 iter->sequence_nos[iter->depth] = sequence;
69 iter_unrecurse (DBusMessageDataIter *iter)
76 iter_next (DBusMessageDataIter *iter)
78 iter->sequence_nos[iter->depth] += 1;
82 iter_first_in_series (DBusMessageDataIter *iter)
87 while (i < _DBUS_MESSAGE_DATA_MAX_NESTING)
89 if (iter->sequence_nos[i] != 0)
96 typedef dbus_bool_t (* DBusInnerGeneratorFunc) (DBusMessageDataIter *iter,
98 typedef dbus_bool_t (* DBusMessageGeneratorFunc) (DBusMessageDataIter *iter,
112 generate_trivial_inner (DBusMessageDataIter *iter,
117 switch (iter_get_sequence (iter))
122 "org.freedesktop.DocumentFactory",
127 set_reply_serial (message);
131 "org.freedesktop.DocumentFactory",
138 "org.freedesktop.TestErrorName"))
143 const char *v_STRING =
"This is an error";
152 set_reply_serial (message);
161 *message_p = message;
167 generate_many_bodies_inner (DBusMessageDataIter *iter,
185 set_reply_serial (message);
190 if (dbus_internal_do_not_use_generate_bodies (iter_get_sequence (iter),
194 const char *v_SIGNATURE;
196 v_SIGNATURE = _dbus_string_get_const_data (&signature);
207 _dbus_string_get_length (&message->
body),
210 *message_p = message;
221 return *message_p !=
NULL;
240 data, _dbus_string_get_length (data)))
245 generate_outer (DBusMessageDataIter *iter,
248 DBusInnerGeneratorFunc func)
253 if (!(*func)(iter, &message))
260 generate_from_message (data, expected_validity, message);
268 generate_trivial (DBusMessageDataIter *iter,
272 return generate_outer (iter, data, expected_validity,
273 generate_trivial_inner);
277 generate_many_bodies (DBusMessageDataIter *iter,
281 return generate_outer (iter, data, expected_validity,
282 generate_many_bodies_inner);
286 simple_method_call (
void)
312 simple_method_return (
void)
319 set_reply_serial (message);
335 set_reply_serial (message);
341 message_with_nesting_levels (
int levels)
344 dbus_int32_t v_INT32;
359 message = simple_method_call ();
371 parents[i] = children[i-1];
388 generate_special (DBusMessageDataIter *iter,
395 dbus_int32_t v_INT32;
402 item_seq = iter_get_sequence (iter);
406 message = simple_method_call ();
417 generate_from_message (data, expected_validity, message);
420 _dbus_string_set_byte (data, pos + 1,
'$');
422 *expected_validity = DBUS_INVALID_UNKNOWN_TYPECODE;
424 else if (item_seq == 1)
427 const char *v_STRING;
430 message = simple_method_call ();
456 generate_from_message (data, expected_validity, message);
458 *expected_validity = DBUS_INVALID_EXCEEDED_MAXIMUM_ARRAY_RECURSION;
460 else if (item_seq == 2)
463 const char *v_STRING;
466 message = simple_method_call ();
501 generate_from_message (data, expected_validity, message);
503 *expected_validity = DBUS_INVALID_EXCEEDED_MAXIMUM_STRUCT_RECURSION;
505 else if (item_seq == 3)
507 message = simple_method_call ();
518 generate_from_message (data, expected_validity, message);
522 *expected_validity = DBUS_INVALID_STRUCT_STARTED_BUT_NOT_ENDED;
524 else if (item_seq == 4)
526 message = simple_method_call ();
537 generate_from_message (data, expected_validity, message);
541 *expected_validity = DBUS_INVALID_STRUCT_ENDED_BUT_NOT_STARTED;
543 else if (item_seq == 5)
545 message = simple_method_call ();
556 generate_from_message (data, expected_validity, message);
561 *expected_validity = DBUS_INVALID_STRUCT_HAS_NO_FIELDS;
563 else if (item_seq == 6)
565 message = simple_method_call ();
566 generate_from_message (data, expected_validity, message);
570 *expected_validity = DBUS_INVALID_BAD_MESSAGE_TYPE;
572 else if (item_seq == 7)
575 message = simple_method_call ();
576 generate_from_message (data, expected_validity, message);
582 else if (item_seq == 8)
586 message = simple_method_call ();
588 generate_from_message (data, expected_validity, message);
596 *expected_validity = DBUS_INVALID_MESSAGE_TOO_LONG;
598 else if (item_seq == 9)
600 const char *v_STRING =
"not a valid bus name";
601 message = simple_method_call ();
608 generate_from_message (data, expected_validity, message);
610 *expected_validity = DBUS_INVALID_BAD_SENDER;
612 else if (item_seq == 10)
614 message = simple_method_call ();
619 generate_from_message (data, expected_validity, message);
621 *expected_validity = DBUS_INVALID_USES_LOCAL_INTERFACE;
623 else if (item_seq == 11)
625 message = simple_method_call ();
630 generate_from_message (data, expected_validity, message);
632 *expected_validity = DBUS_INVALID_USES_LOCAL_PATH;
634 else if (item_seq == 12)
637 message = simple_method_call ();
642 generate_from_message (data, expected_validity, message);
646 else if (item_seq == 13)
649 message = simple_signal ();
654 generate_from_message (data, expected_validity, message);
656 *expected_validity = DBUS_INVALID_MISSING_INTERFACE;
658 else if (item_seq == 14)
660 message = simple_method_return ();
665 generate_from_message (data, expected_validity, message);
667 *expected_validity = DBUS_INVALID_MISSING_REPLY_SERIAL;
669 else if (item_seq == 15)
671 message = simple_error ();
676 generate_from_message (data, expected_validity, message);
678 *expected_validity = DBUS_INVALID_MISSING_ERROR_NAME;
680 else if (item_seq == 16)
683 const char *v_STRING;
687 message = simple_method_call ();
728 generate_from_message (data, expected_validity, message);
730 *expected_validity = DBUS_INVALID_EXCEEDED_MAXIMUM_DICT_ENTRY_RECURSION;
732 else if (item_seq == 17)
734 message = simple_method_call ();
745 generate_from_message (data, expected_validity, message);
750 *expected_validity = DBUS_INVALID_DICT_ENTRY_STARTED_BUT_NOT_ENDED;
752 else if (item_seq == 18)
754 message = simple_method_call ();
765 generate_from_message (data, expected_validity, message);
769 *expected_validity = DBUS_INVALID_DICT_ENTRY_ENDED_BUT_NOT_STARTED;
771 else if (item_seq == 19)
773 message = simple_method_call ();
784 generate_from_message (data, expected_validity, message);
790 *expected_validity = DBUS_INVALID_DICT_ENTRY_HAS_NO_FIELDS;
792 else if (item_seq == 20)
795 message = message_with_nesting_levels(64);
797 generate_from_message (data, expected_validity, message);
801 else if (item_seq == 21)
804 message = message_with_nesting_levels(65);
806 generate_from_message (data, expected_validity, message);
808 *expected_validity = DBUS_INVALID_NESTED_TOO_DEEPLY;
823 generate_wrong_length (DBusMessageDataIter *iter,
827 int lengths[] = { -42, -17, -16, -15, -9, -8, -7, -6, -5, -4, -3, -2, -1,
828 1, 2, 3, 4, 5, 6, 7, 8, 9, 15, 16, 30 };
833 len_seq = iter_get_sequence (iter);
840 if (!generate_many_bodies (iter, data, expected_validity))
842 iter_set_sequence (iter, 0);
843 iter_unrecurse (iter);
847 iter_unrecurse (iter);
849 adjust = lengths[len_seq];
857 *expected_validity = DBUS_INVALID_FOR_UNKNOWN_REASON;
879 _dbus_assert (old_body_len < _dbus_string_get_length (data));
880 new_body_len = old_body_len + adjust;
881 if (new_body_len < 0)
885 *expected_validity = DBUS_VALIDITY_UNKNOWN;
888 _dbus_verbose (
"changing body len from %u to %u by adjust %d\n",
889 old_body_len, new_body_len, adjust);
900 generate_byte_changed (DBusMessageDataIter *iter,
913 if (!generate_many_bodies (iter, data, expected_validity))
917 byte_seq = iter_get_sequence (iter);
919 iter_unrecurse (iter);
921 if (byte_seq == _dbus_string_get_length (data))
926 iter_set_sequence (iter, 0);
927 iter_unrecurse (iter);
933 iter_set_sequence (iter, iter_get_sequence (iter) - 1);
936 _dbus_assert (byte_seq < _dbus_string_get_length (data));
937 v_BYTE = _dbus_string_get_byte (data, byte_seq);
939 _dbus_string_set_byte (data, byte_seq, v_BYTE);
940 *expected_validity = DBUS_VALIDITY_UNKNOWN;
949 find_next_typecode (DBusMessageDataIter *iter,
957 base_depth = iter->depth;
963 body_seq = iter_get_sequence (iter);
965 if (!generate_many_bodies (iter, data, expected_validity))
968 iter_set_sequence (iter, body_seq);
975 byte_seq = iter_get_sequence (iter);
977 _dbus_assert (byte_seq <= _dbus_string_get_length (data));
979 if (byte_seq == _dbus_string_get_length (data))
982 iter_set_sequence (iter, 0);
983 iter_unrecurse (iter);
989 _dbus_assert (byte_seq < _dbus_string_get_length (data));
998 _dbus_assert (byte_seq < _dbus_string_get_length (data));
1000 iter_unrecurse (iter);
1007 static const int typecodes[] = {
1032 generate_typecode_changed (DBusMessageDataIter *iter,
1040 base_depth = iter->depth;
1046 if (!find_next_typecode (iter, data, expected_validity))
1049 iter_recurse (iter);
1050 byte_seq = iter_get_sequence (iter);
1052 _dbus_assert (byte_seq < _dbus_string_get_length (data));
1054 iter_recurse (iter);
1055 typecode_seq = iter_get_sequence (iter);
1063 iter_set_sequence (iter, 0);
1064 iter_unrecurse (iter);
1067 iter_unrecurse (iter);
1073 iter_unrecurse (iter);
1075 iter_unrecurse (iter);
1079 printf (
"Changing byte %d in message %d to %c\n",
1080 byte_seq, iter_get_sequence (iter), typecodes[typecode_seq]);
1083 _dbus_string_set_byte (data, byte_seq, typecodes[typecode_seq]);
1084 *expected_validity = DBUS_VALIDITY_UNKNOWN;
1092 dbus_uint32_t value;
1095 static const UIntChange uint32_changes[] = {
1096 { CHANGE_TYPE_ADJUST, (dbus_uint32_t) -1 },
1097 { CHANGE_TYPE_ADJUST, (dbus_uint32_t) -2 },
1098 { CHANGE_TYPE_ADJUST, (dbus_uint32_t) -3 },
1099 { CHANGE_TYPE_ADJUST, (dbus_uint32_t) 1 },
1100 { CHANGE_TYPE_ADJUST, (dbus_uint32_t) 2 },
1101 { CHANGE_TYPE_ADJUST, (dbus_uint32_t) 3 },
1103 { CHANGE_TYPE_ABSOLUTE, 0 },
1104 { CHANGE_TYPE_ABSOLUTE, 1 },
1110 generate_uint32_changed (DBusMessageDataIter *iter,
1117 dbus_uint32_t v_UINT32;
1119 const UIntChange *change;
1126 base_depth = iter->depth;
1131 body_seq = iter_get_sequence (iter);
1133 if (!generate_many_bodies (iter, data, expected_validity))
1138 iter_set_sequence (iter, body_seq);
1139 iter_recurse (iter);
1142 change_seq = iter_get_sequence (iter);
1147 iter_set_sequence (iter, 0);
1148 iter_unrecurse (iter);
1155 iter_recurse (iter);
1157 byte_seq = iter_get_sequence (iter);
1163 iter_unrecurse (iter);
1165 _dbus_assert (_DBUS_ALIGN_VALUE (byte_seq, 4) == (
unsigned) byte_seq);
1166 if (byte_seq >= (_dbus_string_get_length (data) - 4))
1170 iter_recurse (iter);
1172 iter_set_sequence (iter, 0);
1173 iter_unrecurse (iter);
1179 _dbus_assert (byte_seq <= (_dbus_string_get_length (data) - 4));
1185 change = &uint32_changes[change_seq];
1187 if (change->type == CHANGE_TYPE_ADJUST)
1189 v_UINT32 += (int) change->value;
1193 v_UINT32 = change->value;
1197 printf (
"body %d change %d pos %d ",
1198 body_seq, change_seq, byte_seq);
1200 if (change->type == CHANGE_TYPE_ADJUST)
1201 printf (
"adjust by %d", (
int) change->value);
1203 printf (
"set to %u", change->value);
1205 printf (
" \t%u -> %u\n",
1211 *expected_validity = DBUS_VALIDITY_UNKNOWN;
1214 iter_unrecurse (iter);
1223 DBusMessageGeneratorFunc func;
1224 } DBusMessageGenerator;
1226 static const DBusMessageGenerator generators[] = {
1227 {
"trivial example of each message type", generate_trivial },
1228 {
"assorted arguments", generate_many_bodies },
1229 {
"assorted special cases", generate_special },
1230 {
"each uint32 modified", generate_uint32_changed },
1231 {
"wrong body lengths", generate_wrong_length },
1232 {
"each byte modified", generate_byte_changed },
1235 {
"change each typecode", generate_typecode_changed }
1240 _dbus_message_data_free (DBusMessageData *data)
1246 _dbus_message_data_iter_init (DBusMessageDataIter *iter)
1252 while (i < _DBUS_MESSAGE_DATA_MAX_NESTING)
1254 iter->sequence_nos[i] = 0;
1261 _dbus_message_data_iter_get_and_next (DBusMessageDataIter *iter,
1262 DBusMessageData *data)
1264 DBusMessageGeneratorFunc func;
1268 generator = iter_get_sequence (iter);
1273 iter_recurse (iter);
1275 if (iter_first_in_series (iter))
1277 printf (
" testing message loading: %s ", generators[generator].name);
1281 func = generators[generator].func;
1286 if ((*func)(iter, &data->data, &data->expected_validity))
1290 iter_set_sequence (iter, 0);
1291 iter_unrecurse (iter);
1294 printf (
"%d test loads cumulative\n", iter->count);
1297 iter_unrecurse (iter);