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)
1001 _dbus_message_test (
const char *test_data_dir)
1010 const dbus_uint32_t our_uint32_array[] =
1011 { 0x12345678, 0x23456781, 0x34567812, 0x45678123 };
1012 const dbus_int32_t our_int32_array[] =
1013 { 0x12345678, -0x23456781, 0x34567812, -0x45678123 };
1014 const dbus_uint32_t *v_ARRAY_UINT32 = our_uint32_array;
1015 const dbus_int32_t *v_ARRAY_INT32 = our_int32_array;
1016 const dbus_uint64_t our_uint64_array[] =
1017 { 0x12345678, 0x23456781, 0x34567812, 0x45678123 };
1018 const dbus_int64_t our_int64_array[] =
1019 { 0x12345678, -0x23456781, 0x34567812, -0x45678123 };
1020 const dbus_uint64_t *v_ARRAY_UINT64 = our_uint64_array;
1021 const dbus_int64_t *v_ARRAY_INT64 = our_int64_array;
1022 const char *our_string_array[] = {
"Foo",
"bar",
"",
"woo woo woo woo" };
1023 const char **v_ARRAY_STRING = our_string_array;
1024 const double our_double_array[] = { 0.1234, 9876.54321, -300.0 };
1025 const double *v_ARRAY_DOUBLE = our_double_array;
1026 const unsigned char our_byte_array[] = {
'a',
'b',
'c', 234 };
1027 const unsigned char *v_ARRAY_BYTE = our_byte_array;
1029 const dbus_bool_t *v_ARRAY_BOOLEAN = our_boolean_array;
1032 const char *v_STRING;
1034 dbus_int16_t v_INT16;
1035 dbus_uint16_t v_UINT16;
1036 dbus_int32_t v_INT32;
1037 dbus_uint32_t v_UINT32;
1038 dbus_int64_t v_INT64;
1039 dbus_uint64_t v_UINT64;
1040 unsigned char v_BYTE;
1041 unsigned char v2_BYTE;
1044 #ifdef HAVE_UNIX_FD_PASSING
1048 DBusInitialFDs *initial_fds;
1050 initial_fds = _dbus_check_fdleaks_enter ();
1053 "/org/freedesktop/TestPath",
1054 "Foo.TestInterface",
1060 "/org/freedesktop/TestPath") == 0);
1071 _dbus_string_get_length (&message->
header.
data));
1073 _dbus_string_get_length (&message->
body));
1080 _dbus_string_get_length (&message->
header.
data));
1082 _dbus_string_get_length (&message->
body));
1122 "org.Foo.Bar") == 0);
1178 "/org/freedesktop/TestPath",
1179 "Foo.TestInterface",
1186 v_INT32 = -0x12345678;
1187 v_UINT32 = 0x12300042;
1188 v_INT64 = DBUS_INT64_CONSTANT (-0x123456789abcd);
1189 v_UINT64 = DBUS_UINT64_CONSTANT (0x123456789abcd);
1190 v_STRING =
"Test string";
1195 #ifdef HAVE_UNIX_FD_PASSING
1261 #ifdef HAVE_UNIX_FD_PASSING
1271 _dbus_verbose (
"HEADER\n");
1273 _dbus_string_get_length (&message->
header.
data));
1274 _dbus_verbose (
"BODY\n");
1276 _dbus_string_get_length (&message->
body));
1278 _dbus_verbose (
"Signature expected \"%s\" actual \"%s\"\n",
1286 verify_test_message (message);
1295 _dbus_string_get_length (©->
header.
data));
1298 _dbus_string_get_length (©->
body));
1300 verify_test_message (copy);
1323 data = _dbus_string_get_const_data (&message->
header.
data);
1324 for (i = 0; i < _dbus_string_get_length (&message->
header.
data); i++)
1334 data = _dbus_string_get_const_data (&message->
body);
1335 for (i = 0; i < _dbus_string_get_length (&message->
body); i++)
1344 #ifdef HAVE_UNIX_FD_PASSING
1347 unsigned n_unix_fds;
1381 verify_test_message (message_without_unix_fds);
1388 char *marshalled =
NULL;
1403 verify_test_message (message2);
1435 _dbus_check_fdleaks_leave (initial_fds);
1436 initial_fds = _dbus_check_fdleaks_enter ();
1440 "/org/freedesktop/TestPath",
1441 "Foo.TestInterface",
1453 NULL, &struct_iter));
1468 DBusMessageDataIter diter;
1469 DBusMessageData mdata;
1472 reset_validities_seen ();
1475 _dbus_message_data_iter_init (&diter);
1477 while (_dbus_message_data_iter_get_and_next (&diter,
1480 if (!dbus_internal_do_not_use_try_message_data (&mdata.data,
1481 mdata.expected_validity))
1483 _dbus_warn (
"expected validity %d and did not get it\n",
1484 mdata.expected_validity);
1488 _dbus_message_data_free (&mdata);
1493 printf (
"%d sample messages tested\n", count);
1495 print_validities_seen (
FALSE);
1496 print_validities_seen (
TRUE);
1500 _dbus_check_fdleaks_leave (initial_fds);
1503 if (test_data_dir ==
NULL)
1506 initial_fds = _dbus_check_fdleaks_enter ();
1508 if (!dbus_internal_do_not_use_foreach_message_file (test_data_dir,
1509 (DBusForeachMessageFileFunc)
1510 dbus_internal_do_not_use_try_message_file,
1514 _dbus_check_fdleaks_leave (initial_fds);