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;
1048 #ifdef HAVE_UNIX_FD_PASSING 1052 DBusInitialFDs *initial_fds;
1054 initial_fds = _dbus_check_fdleaks_enter ();
1059 if (!dbus_message_iter_get_args (&iter, &error,
1062 &our_string_array1, &our_string_array_len1,
1063 #ifdef HAVE_UNIX_FD_PASSING
1067 DBUS_TYPE_UINT32, &our_uint3,
1070 _dbus_verbose (
"expected error: %s - %s\n", error.
name,
1074 #ifdef HAVE_UNIX_FD_PASSING 1080 _dbus_warn (
"error: parse with wrong signature: 'uashuu'.\n");
1086 if (!dbus_message_iter_get_args (&iter, &error,
1087 DBUS_TYPE_UINT32, &our_uint1,
1089 &our_string_array1, &our_string_array_len1,
1090 #ifdef HAVE_UNIX_FD_PASSING
1091 DBUS_TYPE_UNIX_FD, &our_unix_fd1,
1093 DBUS_TYPE_UINT32, &our_uint2,
1095 &our_string_array2, &our_string_array_len2,
1096 #ifdef HAVE_UNIX_FD_PASSING
1097 DBUS_TYPE_UNIX_FD, &our_unix_fd2,
1099 DBUS_TYPE_UINT32, &our_uint3,
1102 _dbus_verbose (
"expected error: %s - %s\n", error.
name,
1107 #ifdef HAVE_UNIX_FD_PASSING 1114 _dbus_warn (
"error: parse with wrong signature: 'uashuashu'.\n");
1120 if (!dbus_message_iter_get_args (&iter, &error,
1121 DBUS_TYPE_UINT32, &our_uint1,
1123 &our_string_array1, &our_string_array_len1,
1124 #ifdef HAVE_UNIX_FD_PASSING
1125 DBUS_TYPE_UNIX_FD, &our_unix_fd1,
1127 DBUS_TYPE_UINT32, &our_uint2,
1129 &our_string_array2, &our_string_array_len2,
1130 #ifdef HAVE_UNIX_FD_PASSING
1131 DBUS_TYPE_UNIX_FD, &our_unix_fd2,
1143 #ifdef HAVE_UNIX_FD_PASSING 1148 _dbus_check_fdleaks_leave (initial_fds);
1158 _dbus_message_test (
const char *test_data_dir)
1167 const dbus_uint32_t our_uint32_array[] =
1168 { 0x12345678, 0x23456781, 0x34567812, 0x45678123 };
1169 const dbus_int32_t our_int32_array[] =
1170 { 0x12345678, -0x23456781, 0x34567812, -0x45678123 };
1171 const dbus_uint32_t *v_ARRAY_UINT32 = our_uint32_array;
1172 const dbus_int32_t *v_ARRAY_INT32 = our_int32_array;
1173 const dbus_uint64_t our_uint64_array[] =
1174 { 0x12345678, 0x23456781, 0x34567812, 0x45678123 };
1175 const dbus_int64_t our_int64_array[] =
1176 { 0x12345678, -0x23456781, 0x34567812, -0x45678123 };
1177 const dbus_uint64_t *v_ARRAY_UINT64 = our_uint64_array;
1178 const dbus_int64_t *v_ARRAY_INT64 = our_int64_array;
1179 const char *our_string_array[] = {
"Foo",
"bar",
"",
"woo woo woo woo" };
1180 const char *our_string_array1[] = {
"foo",
"Bar",
"",
"Woo woo Woo woo" };
1181 const char **v_ARRAY_STRING = our_string_array;
1182 const char **v1_ARRAY_STRING = our_string_array1;
1183 const double our_double_array[] = { 0.1234, 9876.54321, -300.0 };
1184 const double *v_ARRAY_DOUBLE = our_double_array;
1185 const unsigned char our_byte_array[] = {
'a',
'b',
'c', 234 };
1186 const unsigned char *v_ARRAY_BYTE = our_byte_array;
1188 const dbus_bool_t *v_ARRAY_BOOLEAN = our_boolean_array;
1191 const char *v_STRING;
1193 dbus_int16_t v_INT16;
1194 dbus_uint16_t v_UINT16;
1195 dbus_int32_t v_INT32;
1196 dbus_uint32_t v_UINT32;
1197 dbus_uint32_t v1_UINT32;
1198 dbus_int64_t v_INT64;
1199 dbus_uint64_t v_UINT64;
1200 unsigned char v_BYTE;
1201 unsigned char v2_BYTE;
1204 #ifdef HAVE_UNIX_FD_PASSING 1209 DBusInitialFDs *initial_fds;
1222 initial_fds = _dbus_check_fdleaks_enter ();
1225 "/org/freedesktop/TestPath",
1226 "Foo.TestInterface",
1232 "/org/freedesktop/TestPath") == 0);
1243 _dbus_string_get_length (&message->
header.
data));
1245 _dbus_string_get_length (&message->
body));
1252 _dbus_string_get_length (&message->
header.
data));
1254 _dbus_string_get_length (&message->
body));
1294 "org.Foo.Bar") == 0);
1350 "/org/freedesktop/TestPath",
1351 "Foo.TestInterface",
1358 v_INT32 = -0x12345678;
1359 v_UINT32 = 0x12300042;
1360 v_INT64 = DBUS_INT64_CONSTANT (-0x123456789abcd);
1361 v_UINT64 = DBUS_UINT64_CONSTANT (0x123456789abcd);
1362 v_STRING =
"Test string";
1367 #ifdef HAVE_UNIX_FD_PASSING 1376 DBUS_TYPE_UINT32, &v_UINT32,
1434 #ifdef HAVE_UNIX_FD_PASSING 1436 DBUS_TYPE_UNIX_FD, &v_UNIX_FD,
1444 _dbus_verbose (
"HEADER\n");
1446 _dbus_string_get_length (&message->
header.
data));
1447 _dbus_verbose (
"BODY\n");
1449 _dbus_string_get_length (&message->
body));
1451 _dbus_verbose (
"Signature expected \"%s\" actual \"%s\"\n",
1459 verify_test_message (message);
1468 _dbus_string_get_length (©->
header.
data));
1471 _dbus_string_get_length (©->
body));
1473 verify_test_message (copy);
1496 data = _dbus_string_get_const_data (&message->
header.
data);
1497 for (i = 0; i < _dbus_string_get_length (&message->
header.
data); i++)
1507 data = _dbus_string_get_const_data (&message->
body);
1508 for (i = 0; i < _dbus_string_get_length (&message->
body); i++)
1517 #ifdef HAVE_UNIX_FD_PASSING 1520 unsigned n_unix_fds;
1554 verify_test_message (message_without_unix_fds);
1561 char *marshalled =
NULL;
1576 verify_test_message (message2);
1608 _dbus_check_fdleaks_leave (initial_fds);
1609 initial_fds = _dbus_check_fdleaks_enter ();
1612 for (i = strlen (basic_types) - 1; i > 0; i--)
1618 signature[0] = basic_types[i];
1619 s =
"SomeThingToSay";
1620 memset (&val,
'\0',
sizeof (val));
1623 "/de/ende/test",
"de.ende.Test",
"ArtistName");
1627 signature, &array_iter);
1628 for (some = 0; some < 3; some++)
1643 "/de/ende/test",
"de.ende.Test",
"ArtistName");
1651 NULL, &struct_iter);
1663 "/org/freedesktop/TestPath",
1664 "Foo.TestInterface",
1677 NULL, &struct_iter);