26 #include "dbus-internals.h"
27 #include "dbus-test.h"
28 #include "dbus-message-private.h"
29 #include "dbus-marshal-recursive.h"
30 #include "dbus-string.h"
31 #ifdef HAVE_UNIX_FD_PASSING
32 #include "dbus-sysdeps-unix.h"
37 #include <sys/types.h>
48 #ifdef DBUS_ENABLE_EMBEDDED_TESTS
70 _dbus_return_val_if_fail (iter !=
NULL,
FALSE);
71 _dbus_return_val_if_error_is_set (error,
FALSE);
73 va_start (var_args, first_arg_type);
83 #ifdef DBUS_ENABLE_EMBEDDED_TESTS
84 #include "dbus-test.h"
85 #include "dbus-message-factory.h"
89 static int validities_seen[DBUS_VALIDITY_LAST + _DBUS_NEGATIVE_VALIDITY_COUNT];
92 reset_validities_seen (
void)
98 validities_seen[i] = 0;
106 validities_seen[validity + _DBUS_NEGATIVE_VALIDITY_COUNT] += 1;
116 if ((i - _DBUS_NEGATIVE_VALIDITY_COUNT) == DBUS_VALIDITY_UNKNOWN ||
117 (i - _DBUS_NEGATIVE_VALIDITY_COUNT) == DBUS_INVALID_FOR_UNKNOWN_REASON)
119 else if ((not_seen && validities_seen[i] == 0) ||
120 (!not_seen && validities_seen[i] > 0))
121 printf (
"validity %3d seen %d times\n",
122 i - _DBUS_NEGATIVE_VALIDITY_COUNT,
129 check_memleaks (
void)
133 if (_dbus_get_malloc_blocks_outstanding () != 0)
135 _dbus_warn (
"%d dbus_malloc blocks were not freed in %s\n",
136 _dbus_get_malloc_blocks_outstanding (), __FILE__);
142 struct DBusInitialFDs {
148 _dbus_check_fdleaks_enter (
void)
155 fds = malloc (
sizeof (DBusInitialFDs));
160 if ((d = opendir (
"/proc/self/fd")))
164 while ((de = readdir(d)))
170 if (de->d_name[0] ==
'.')
174 l = strtol (de->d_name, &e, 10);
185 FD_SET (fd, &fds->set);
198 _dbus_check_fdleaks_leave (DBusInitialFDs *fds)
205 if ((d = opendir (
"/proc/self/fd")))
209 while ((de = readdir(d)))
215 if (de->d_name[0] ==
'.')
219 l = strtol (de->d_name, &e, 10);
230 if (FD_ISSET (fd, &fds->set))
233 _dbus_warn (
"file descriptor %i leaked in %s.\n", fd, __FILE__);
257 _dbus_warn (
"loader corrupted on message that was expected to be valid; invalid reason %d\n",
265 _dbus_warn (
"didn't load message that was expected to be valid (message not popped)\n");
269 if (_dbus_string_get_length (&loader->
data) > 0)
271 _dbus_warn (
"had leftover bytes from expected-to-be-valid single message\n");
281 if (!check_message_handling (message))
306 _dbus_warn (
"loader not corrupted on message that was expected to be invalid\n");
312 if (expected_validity != DBUS_INVALID_FOR_UNKNOWN_REASON &&
315 _dbus_warn (
"expected message to be corrupted for reason %d and was corrupted for %d instead\n",
337 _dbus_warn (
"loader corrupted on message that was expected to be valid (but incomplete), corruption reason %d\n",
345 _dbus_warn (
"loaded message that was expected to be incomplete\n");
349 record_validity_seen (DBUS_VALID_BUT_INCOMPLETE);
366 return check_have_valid_message (loader);
367 else if (expected_validity == DBUS_VALID_BUT_INCOMPLETE)
368 return check_incomplete_message (loader);
369 else if (expected_validity == DBUS_VALIDITY_UNKNOWN)
381 return check_invalid_message (loader, expected_validity);
392 dbus_internal_do_not_use_load_message_file (
const DBusString *filename,
400 _dbus_verbose (
"Loading raw %s\n", _dbus_string_get_const_data (filename));
403 _dbus_warn (
"Could not load message file %s: %s\n",
404 _dbus_string_get_const_data (filename),
426 dbus_internal_do_not_use_try_message_file (
const DBusString *filename,
437 if (!dbus_internal_do_not_use_load_message_file (filename, &data))
440 retval = dbus_internal_do_not_use_try_message_data (&data, expected_validity);
446 if (_dbus_string_get_length (&data) > 0)
448 _dbus_string_get_length (&data));
450 _dbus_warn (
"Failed message loader test on %s\n",
451 _dbus_string_get_const_data (filename));
468 dbus_internal_do_not_use_try_message_data (
const DBusString *data,
488 len = _dbus_string_get_length (data);
489 for (i = 0; i < len; i++)
495 _dbus_string_get_byte (data, i));
499 if (!check_loader_results (loader, expected_validity))
514 _dbus_string_get_length (buffer));
518 if (!check_loader_results (loader, expected_validity))
528 len = _dbus_string_get_length (data);
529 for (i = 0; i < len; i += 2)
535 _dbus_string_get_byte (data, i));
538 _dbus_string_get_byte (data, i+1));
542 if (!check_loader_results (loader, expected_validity))
559 process_test_subdir (
const DBusString *test_base_dir,
562 DBusForeachMessageFileFunc
function,
594 _dbus_string_get_const_data (&test_directory),
600 printf (
"Testing %s:\n", subdir);
622 printf (
"SKIP: Could not load %s, message builder language no longer supported\n",
623 _dbus_string_get_const_data (&filename));
626 _dbus_verbose (
"Skipping non-.message file %s\n",
627 _dbus_string_get_const_data (&filename));
633 _dbus_string_get_const_data (&filename));
635 if (! (*
function) (&full_path,
636 expected_validity, user_data))
647 _dbus_warn (
"Could not get next file in %s: %s\n",
648 _dbus_string_get_const_data (&test_directory),
676 dbus_internal_do_not_use_foreach_message_file (
const char *test_data_dir,
677 DBusForeachMessageFileFunc func,
687 if (!process_test_subdir (&test_directory,
"valid-messages",
693 if (!process_test_subdir (&test_directory,
"invalid-messages",
694 DBUS_INVALID_FOR_UNKNOWN_REASON, func, user_data))
699 if (!process_test_subdir (&test_directory,
"incomplete-messages",
700 DBUS_VALID_BUT_INCOMPLETE, func, user_data))
715 #define GET_AND_CHECK(iter, typename, literal) \
717 if (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_##typename) \
718 _dbus_assert_not_reached ("got wrong argument type from message iter"); \
719 dbus_message_iter_get_basic (&iter, &v_##typename); \
720 if (v_##typename != literal) \
721 _dbus_assert_not_reached ("got wrong value from message iter"); \
724 #define GET_AND_CHECK_STRCMP(iter, typename, literal) \
726 if (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_##typename) \
727 _dbus_assert_not_reached ("got wrong argument type from message iter"); \
728 dbus_message_iter_get_basic (&iter, &v_##typename); \
729 if (strcmp (v_##typename, literal) != 0) \
730 _dbus_assert_not_reached ("got wrong value from message iter"); \
733 #define GET_AND_CHECK_AND_NEXT(iter, typename, literal) \
735 GET_AND_CHECK(iter, typename, literal); \
736 if (!dbus_message_iter_next (&iter)) \
737 _dbus_assert_not_reached ("failed to move iter to next"); \
740 #define GET_AND_CHECK_STRCMP_AND_NEXT(iter, typename, literal) \
742 GET_AND_CHECK_STRCMP(iter, typename, literal); \
743 if (!dbus_message_iter_next (&iter)) \
744 _dbus_assert_not_reached ("failed to move iter to next"); \
751 const char *v_STRING;
753 dbus_int16_t v_INT16;
754 dbus_uint16_t v_UINT16;
755 dbus_int32_t v_INT32;
756 dbus_uint32_t v_UINT32;
757 dbus_int64_t v_INT64;
758 dbus_uint64_t v_UINT64;
759 unsigned char v_BYTE;
762 const dbus_int32_t *our_int_array;
767 GET_AND_CHECK_STRCMP_AND_NEXT (iter, STRING,
"Test string");
768 GET_AND_CHECK_AND_NEXT (iter, INT32, -0x12345678);
769 GET_AND_CHECK_AND_NEXT (iter, UINT32, 0xedd1e);
770 GET_AND_CHECK_AND_NEXT (iter, DOUBLE, 3.14159);
780 GET_AND_CHECK_AND_NEXT (array, DOUBLE, 1.5);
781 GET_AND_CHECK (array, DOUBLE, 2.5);
789 GET_AND_CHECK_AND_NEXT (iter, BYTE, 0xF0);
806 GET_AND_CHECK (iter, BYTE, 0xF0);
818 dbus_int16_t our_int16;
819 dbus_uint16_t our_uint16;
820 dbus_int32_t our_int;
821 dbus_uint32_t our_uint;
826 unsigned char our_byte_1, our_byte_2;
827 const dbus_uint32_t *our_uint32_array = (
void*)0xdeadbeef;
828 int our_uint32_array_len;
829 dbus_int32_t *our_int32_array = (
void*)0xdeadbeef;
830 int our_int32_array_len;
831 dbus_int64_t our_int64;
832 dbus_uint64_t our_uint64;
833 dbus_int64_t *our_uint64_array = (
void*)0xdeadbeef;
834 int our_uint64_array_len;
835 const dbus_int64_t *our_int64_array = (
void*)0xdeadbeef;
836 int our_int64_array_len;
837 const double *our_double_array = (
void*)0xdeadbeef;
838 int our_double_array_len;
839 const unsigned char *our_byte_array = (
void*)0xdeadbeef;
840 int our_byte_array_len;
841 const dbus_bool_t *our_boolean_array = (
void*)0xdeadbeef;
842 int our_boolean_array_len;
843 char **our_string_array;
844 int our_string_array_len;
848 if (!dbus_message_iter_get_args (&iter, &error,
861 &our_uint32_array, &our_uint32_array_len,
863 &our_int32_array, &our_int32_array_len,
865 &our_uint64_array, &our_uint64_array_len,
867 &our_int64_array, &our_int64_array_len,
869 &our_double_array, &our_double_array_len,
871 &our_byte_array, &our_byte_array_len,
873 &our_boolean_array, &our_boolean_array_len,
875 &our_string_array, &our_string_array_len,
883 if (our_int16 != -0x123)
886 if (our_uint16 != 0x123)
889 if (our_int != -0x12345678)
892 if (our_uint != 0x12300042)
895 if (our_int64 != DBUS_INT64_CONSTANT (-0x123456789abcd))
897 if (our_uint64 != DBUS_UINT64_CONSTANT (0x123456789abcd))
904 if (strcmp (our_str,
"Test string") != 0)
910 if (our_byte_1 != 42)
913 if (our_byte_2 != 24)
916 if (our_uint32_array_len != 4 ||
917 our_uint32_array[0] != 0x12345678 ||
918 our_uint32_array[1] != 0x23456781 ||
919 our_uint32_array[2] != 0x34567812 ||
920 our_uint32_array[3] != 0x45678123)
923 if (our_int32_array_len != 4 ||
924 our_int32_array[0] != 0x12345678 ||
925 our_int32_array[1] != -0x23456781 ||
926 our_int32_array[2] != 0x34567812 ||
927 our_int32_array[3] != -0x45678123)
930 if (our_uint64_array_len != 4 ||
931 our_uint64_array[0] != 0x12345678 ||
932 our_uint64_array[1] != 0x23456781 ||
933 our_uint64_array[2] != 0x34567812 ||
934 our_uint64_array[3] != 0x45678123)
937 if (our_int64_array_len != 4 ||
938 our_int64_array[0] != 0x12345678 ||
939 our_int64_array[1] != -0x23456781 ||
940 our_int64_array[2] != 0x34567812 ||
941 our_int64_array[3] != -0x45678123)
944 if (our_double_array_len != 3)
953 v_DOUBLE = 9876.54321;
960 if (our_byte_array_len != 4)
963 if (our_byte_array[0] !=
'a' ||
964 our_byte_array[1] !=
'b' ||
965 our_byte_array[2] !=
'c' ||
966 our_byte_array[3] != 234)
969 if (our_boolean_array_len != 5)
972 if (our_boolean_array[0] !=
TRUE ||
973 our_boolean_array[1] !=
FALSE ||
974 our_boolean_array[2] !=
TRUE ||
975 our_boolean_array[3] !=
TRUE ||
976 our_boolean_array[4] !=
FALSE)
979 if (our_string_array_len != 4)
982 if (strcmp (our_string_array[0],
"Foo") != 0 ||
983 strcmp (our_string_array[1],
"bar") != 0 ||
984 strcmp (our_string_array[2],
"") != 0 ||
985 strcmp (our_string_array[3],
"woo woo woo woo") != 0)
995 verify_test_message_args_ignored (
DBusMessage *message)
999 dbus_uint32_t our_uint;
1000 DBusInitialFDs *initial_fds;
1002 initial_fds = _dbus_check_fdleaks_enter ();
1006 if (!dbus_message_iter_get_args (&iter, &error,
1015 _dbus_verbose (
"arguments ignored.\n");
1020 if (!dbus_message_iter_get_args (&iter, &error,
1030 _dbus_verbose (
"arguments ignored.\n");
1033 _dbus_check_fdleaks_leave (initial_fds);
1037 verify_test_message_memleak (
DBusMessage *message)
1041 dbus_uint32_t our_uint1;
1042 dbus_uint32_t our_uint2;
1043 dbus_uint32_t our_uint3;
1044 char **our_string_array1;
1045 int our_string_array_len1;
1046 char **our_string_array2;
1047 int our_string_array_len2;
1050 DBusInitialFDs *initial_fds;
1052 initial_fds = _dbus_check_fdleaks_enter ();
1057 if (!dbus_message_iter_get_args (&iter, &error,
1060 &our_string_array1, &our_string_array_len1,
1061 #ifdef HAVE_UNIX_FD_PASSING
1065 DBUS_TYPE_UINT32, &our_uint3,
1068 _dbus_verbose (
"expected error: %s - %s\n", error.
name,
1072 #ifdef HAVE_UNIX_FD_PASSING
1078 _dbus_warn (
"error: parse with wrong signature: 'uashuu'.\n");
1084 if (!dbus_message_iter_get_args (&iter, &error,
1085 DBUS_TYPE_UINT32, &our_uint1,
1087 &our_string_array1, &our_string_array_len1,
1088 #ifdef HAVE_UNIX_FD_PASSING
1089 DBUS_TYPE_UNIX_FD, &our_unix_fd1,
1091 DBUS_TYPE_UINT32, &our_uint2,
1093 &our_string_array2, &our_string_array_len2,
1094 #ifdef HAVE_UNIX_FD_PASSING
1095 DBUS_TYPE_UNIX_FD, &our_unix_fd2,
1097 DBUS_TYPE_UINT32, &our_uint3,
1100 _dbus_verbose (
"expected error: %s - %s\n", error.
name,
1105 #ifdef HAVE_UNIX_FD_PASSING
1112 _dbus_warn (
"error: parse with wrong signature: 'uashuashu'.\n");
1118 if (!dbus_message_iter_get_args (&iter, &error,
1119 DBUS_TYPE_UINT32, &our_uint1,
1121 &our_string_array1, &our_string_array_len1,
1122 #ifdef HAVE_UNIX_FD_PASSING
1123 DBUS_TYPE_UNIX_FD, &our_unix_fd1,
1125 DBUS_TYPE_UINT32, &our_uint2,
1127 &our_string_array2, &our_string_array_len2,
1128 #ifdef HAVE_UNIX_FD_PASSING
1129 DBUS_TYPE_UNIX_FD, &our_unix_fd2,
1141 #ifdef HAVE_UNIX_FD_PASSING
1146 _dbus_check_fdleaks_leave (initial_fds);
1156 _dbus_message_test (
const char *test_data_dir)
1165 const dbus_uint32_t our_uint32_array[] =
1166 { 0x12345678, 0x23456781, 0x34567812, 0x45678123 };
1167 const dbus_int32_t our_int32_array[] =
1168 { 0x12345678, -0x23456781, 0x34567812, -0x45678123 };
1169 const dbus_uint32_t *v_ARRAY_UINT32 = our_uint32_array;
1170 const dbus_int32_t *v_ARRAY_INT32 = our_int32_array;
1171 const dbus_uint64_t our_uint64_array[] =
1172 { 0x12345678, 0x23456781, 0x34567812, 0x45678123 };
1173 const dbus_int64_t our_int64_array[] =
1174 { 0x12345678, -0x23456781, 0x34567812, -0x45678123 };
1175 const dbus_uint64_t *v_ARRAY_UINT64 = our_uint64_array;
1176 const dbus_int64_t *v_ARRAY_INT64 = our_int64_array;
1177 const char *our_string_array[] = {
"Foo",
"bar",
"",
"woo woo woo woo" };
1178 const char *our_string_array1[] = {
"foo",
"Bar",
"",
"Woo woo Woo woo" };
1179 const char **v_ARRAY_STRING = our_string_array;
1180 const char **v1_ARRAY_STRING = our_string_array1;
1181 const double our_double_array[] = { 0.1234, 9876.54321, -300.0 };
1182 const double *v_ARRAY_DOUBLE = our_double_array;
1183 const unsigned char our_byte_array[] = {
'a',
'b',
'c', 234 };
1184 const unsigned char *v_ARRAY_BYTE = our_byte_array;
1186 const dbus_bool_t *v_ARRAY_BOOLEAN = our_boolean_array;
1189 const char *v_STRING;
1191 dbus_int16_t v_INT16;
1192 dbus_uint16_t v_UINT16;
1193 dbus_int32_t v_INT32;
1194 dbus_uint32_t v_UINT32;
1195 dbus_uint32_t v1_UINT32;
1196 dbus_int64_t v_INT64;
1197 dbus_uint64_t v_UINT64;
1198 unsigned char v_BYTE;
1199 unsigned char v2_BYTE;
1202 #ifdef HAVE_UNIX_FD_PASSING
1207 DBusInitialFDs *initial_fds;
1209 initial_fds = _dbus_check_fdleaks_enter ();
1212 "/org/freedesktop/TestPath",
1213 "Foo.TestInterface",
1219 "/org/freedesktop/TestPath") == 0);
1230 _dbus_string_get_length (&message->
header.
data));
1232 _dbus_string_get_length (&message->
body));
1239 _dbus_string_get_length (&message->
header.
data));
1241 _dbus_string_get_length (&message->
body));
1281 "org.Foo.Bar") == 0);
1337 "/org/freedesktop/TestPath",
1338 "Foo.TestInterface",
1345 v_INT32 = -0x12345678;
1346 v_UINT32 = 0x12300042;
1347 v_INT64 = DBUS_INT64_CONSTANT (-0x123456789abcd);
1348 v_UINT64 = DBUS_UINT64_CONSTANT (0x123456789abcd);
1349 v_STRING =
"Test string";
1354 #ifdef HAVE_UNIX_FD_PASSING
1363 DBUS_TYPE_UINT32, &v_UINT32,
1421 #ifdef HAVE_UNIX_FD_PASSING
1423 DBUS_TYPE_UNIX_FD, &v_UNIX_FD,
1431 _dbus_verbose (
"HEADER\n");
1433 _dbus_string_get_length (&message->
header.
data));
1434 _dbus_verbose (
"BODY\n");
1436 _dbus_string_get_length (&message->
body));
1438 _dbus_verbose (
"Signature expected \"%s\" actual \"%s\"\n",
1446 verify_test_message (message);
1455 _dbus_string_get_length (©->
header.
data));
1458 _dbus_string_get_length (©->
body));
1460 verify_test_message (copy);
1483 data = _dbus_string_get_const_data (&message->
header.
data);
1484 for (i = 0; i < _dbus_string_get_length (&message->
header.
data); i++)
1494 data = _dbus_string_get_const_data (&message->
body);
1495 for (i = 0; i < _dbus_string_get_length (&message->
body); i++)
1504 #ifdef HAVE_UNIX_FD_PASSING
1507 unsigned n_unix_fds;
1541 verify_test_message (message_without_unix_fds);
1548 char *marshalled =
NULL;
1563 verify_test_message (message2);
1595 _dbus_check_fdleaks_leave (initial_fds);
1596 initial_fds = _dbus_check_fdleaks_enter ();
1600 "/org/freedesktop/TestPath",
1601 "Foo.TestInterface",
1613 NULL, &struct_iter));
1628 "/org/freedesktop/TestPath",
1629 "Foo.TestInterface",
1634 DBUS_TYPE_UINT32, &v_UINT32,
1637 #ifdef HAVE_UNIX_FD_PASSING
1638 DBUS_TYPE_UNIX_FD, &v_UNIX_FD,
1640 DBUS_TYPE_UINT32, &v1_UINT32,
1643 #ifdef HAVE_UNIX_FD_PASSING
1644 DBUS_TYPE_UNIX_FD, &v1_UNIX_FD,
1653 #ifdef HAVE_UNIX_FD_PASSING
1659 #ifdef HAVE_UNIX_FD_PASSING
1666 verify_test_message_args_ignored (message);
1667 verify_test_message_memleak (message);
1673 DBusMessageDataIter diter;
1674 DBusMessageData mdata;
1677 reset_validities_seen ();
1680 _dbus_message_data_iter_init (&diter);
1682 while (_dbus_message_data_iter_get_and_next (&diter,
1685 if (!dbus_internal_do_not_use_try_message_data (&mdata.data,
1686 mdata.expected_validity))
1688 _dbus_warn (
"expected validity %d and did not get it\n",
1689 mdata.expected_validity);
1693 _dbus_message_data_free (&mdata);
1698 printf (
"%d sample messages tested\n", count);
1700 print_validities_seen (
FALSE);
1701 print_validities_seen (
TRUE);
1705 _dbus_check_fdleaks_leave (initial_fds);
1708 if (test_data_dir ==
NULL)
1711 initial_fds = _dbus_check_fdleaks_enter ();
1713 if (!dbus_internal_do_not_use_foreach_message_file (test_data_dir,
1714 (DBusForeachMessageFileFunc)
1715 dbus_internal_do_not_use_try_message_file,
1719 _dbus_check_fdleaks_leave (initial_fds);