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_BUILD_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_BUILD_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 #ifdef DBUS_HAVE_INT64
758 dbus_int64_t v_INT64;
759 dbus_uint64_t v_UINT64;
761 unsigned char v_BYTE;
764 const dbus_int32_t *our_int_array;
769 GET_AND_CHECK_STRCMP_AND_NEXT (iter, STRING,
"Test string");
770 GET_AND_CHECK_AND_NEXT (iter, INT32, -0x12345678);
771 GET_AND_CHECK_AND_NEXT (iter, UINT32, 0xedd1e);
772 GET_AND_CHECK_AND_NEXT (iter, DOUBLE, 3.14159);
782 GET_AND_CHECK_AND_NEXT (array, DOUBLE, 1.5);
783 GET_AND_CHECK (array, DOUBLE, 2.5);
791 GET_AND_CHECK_AND_NEXT (iter, BYTE, 0xF0);
808 GET_AND_CHECK (iter, BYTE, 0xF0);
820 dbus_int16_t our_int16;
821 dbus_uint16_t our_uint16;
822 dbus_int32_t our_int;
823 dbus_uint32_t our_uint;
828 unsigned char our_byte_1, our_byte_2;
829 const dbus_uint32_t *our_uint32_array = (
void*)0xdeadbeef;
830 int our_uint32_array_len;
831 dbus_int32_t *our_int32_array = (
void*)0xdeadbeef;
832 int our_int32_array_len;
833 #ifdef DBUS_HAVE_INT64
834 dbus_int64_t our_int64;
835 dbus_uint64_t our_uint64;
836 dbus_int64_t *our_uint64_array = (
void*)0xdeadbeef;
837 int our_uint64_array_len;
838 const dbus_int64_t *our_int64_array = (
void*)0xdeadbeef;
839 int our_int64_array_len;
841 const double *our_double_array = (
void*)0xdeadbeef;
842 int our_double_array_len;
843 const unsigned char *our_byte_array = (
void*)0xdeadbeef;
844 int our_byte_array_len;
845 const dbus_bool_t *our_boolean_array = (
void*)0xdeadbeef;
846 int our_boolean_array_len;
847 char **our_string_array;
848 int our_string_array_len;
852 if (!dbus_message_iter_get_args (&iter, &error,
857 #ifdef DBUS_HAVE_INT64
867 &our_uint32_array, &our_uint32_array_len,
869 &our_int32_array, &our_int32_array_len,
870 #ifdef DBUS_HAVE_INT64
872 &our_uint64_array, &our_uint64_array_len,
873 DBUS_TYPE_ARRAY, DBUS_TYPE_INT64,
874 &our_int64_array, &our_int64_array_len,
877 &our_double_array, &our_double_array_len,
879 &our_byte_array, &our_byte_array_len,
881 &our_boolean_array, &our_boolean_array_len,
882 DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
883 &our_string_array, &our_string_array_len,
891 if (our_int16 != -0x123)
894 if (our_uint16 != 0x123)
897 if (our_int != -0x12345678)
900 if (our_uint != 0x12300042)
903 #ifdef DBUS_HAVE_INT64
904 if (our_int64 != DBUS_INT64_CONSTANT (-0x123456789abcd))
906 if (our_uint64 != DBUS_UINT64_CONSTANT (0x123456789abcd))
914 if (strcmp (our_str,
"Test string") != 0)
920 if (our_byte_1 != 42)
923 if (our_byte_2 != 24)
926 if (our_uint32_array_len != 4 ||
927 our_uint32_array[0] != 0x12345678 ||
928 our_uint32_array[1] != 0x23456781 ||
929 our_uint32_array[2] != 0x34567812 ||
930 our_uint32_array[3] != 0x45678123)
933 if (our_int32_array_len != 4 ||
934 our_int32_array[0] != 0x12345678 ||
935 our_int32_array[1] != -0x23456781 ||
936 our_int32_array[2] != 0x34567812 ||
937 our_int32_array[3] != -0x45678123)
940 #ifdef DBUS_HAVE_INT64
941 if (our_uint64_array_len != 4 ||
942 our_uint64_array[0] != 0x12345678 ||
943 our_uint64_array[1] != 0x23456781 ||
944 our_uint64_array[2] != 0x34567812 ||
945 our_uint64_array[3] != 0x45678123)
948 if (our_int64_array_len != 4 ||
949 our_int64_array[0] != 0x12345678 ||
950 our_int64_array[1] != -0x23456781 ||
951 our_int64_array[2] != 0x34567812 ||
952 our_int64_array[3] != -0x45678123)
956 if (our_double_array_len != 3)
965 v_DOUBLE = 9876.54321;
972 if (our_byte_array_len != 4)
975 if (our_byte_array[0] !=
'a' ||
976 our_byte_array[1] !=
'b' ||
977 our_byte_array[2] !=
'c' ||
978 our_byte_array[3] != 234)
981 if (our_boolean_array_len != 5)
984 if (our_boolean_array[0] !=
TRUE ||
985 our_boolean_array[1] !=
FALSE ||
986 our_boolean_array[2] !=
TRUE ||
987 our_boolean_array[3] !=
TRUE ||
988 our_boolean_array[4] !=
FALSE)
991 if (our_string_array_len != 4)
994 if (strcmp (our_string_array[0],
"Foo") != 0 ||
995 strcmp (our_string_array[1],
"bar") != 0 ||
996 strcmp (our_string_array[2],
"") != 0 ||
997 strcmp (our_string_array[3],
"woo woo woo woo") != 0)
1013 _dbus_message_test (
const char *test_data_dir)
1022 const dbus_uint32_t our_uint32_array[] =
1023 { 0x12345678, 0x23456781, 0x34567812, 0x45678123 };
1024 const dbus_int32_t our_int32_array[] =
1025 { 0x12345678, -0x23456781, 0x34567812, -0x45678123 };
1026 const dbus_uint32_t *v_ARRAY_UINT32 = our_uint32_array;
1027 const dbus_int32_t *v_ARRAY_INT32 = our_int32_array;
1028 #ifdef DBUS_HAVE_INT64
1029 const dbus_uint64_t our_uint64_array[] =
1030 { 0x12345678, 0x23456781, 0x34567812, 0x45678123 };
1031 const dbus_int64_t our_int64_array[] =
1032 { 0x12345678, -0x23456781, 0x34567812, -0x45678123 };
1033 const dbus_uint64_t *v_ARRAY_UINT64 = our_uint64_array;
1034 const dbus_int64_t *v_ARRAY_INT64 = our_int64_array;
1036 const char *our_string_array[] = {
"Foo",
"bar",
"",
"woo woo woo woo" };
1037 const char **v_ARRAY_STRING = our_string_array;
1038 const double our_double_array[] = { 0.1234, 9876.54321, -300.0 };
1039 const double *v_ARRAY_DOUBLE = our_double_array;
1040 const unsigned char our_byte_array[] = {
'a',
'b',
'c', 234 };
1041 const unsigned char *v_ARRAY_BYTE = our_byte_array;
1043 const dbus_bool_t *v_ARRAY_BOOLEAN = our_boolean_array;
1046 const char *v_STRING;
1048 dbus_int16_t v_INT16;
1049 dbus_uint16_t v_UINT16;
1050 dbus_int32_t v_INT32;
1051 dbus_uint32_t v_UINT32;
1052 #ifdef DBUS_HAVE_INT64
1053 dbus_int64_t v_INT64;
1054 dbus_uint64_t v_UINT64;
1056 unsigned char v_BYTE;
1057 unsigned char v2_BYTE;
1060 #ifdef HAVE_UNIX_FD_PASSING
1064 DBusInitialFDs *initial_fds;
1066 initial_fds = _dbus_check_fdleaks_enter ();
1069 "/org/freedesktop/TestPath",
1070 "Foo.TestInterface",
1076 "/org/freedesktop/TestPath") == 0);
1087 _dbus_string_get_length (&message->
header.
data));
1089 _dbus_string_get_length (&message->
body));
1096 _dbus_string_get_length (&message->
header.
data));
1098 _dbus_string_get_length (&message->
body));
1138 "org.Foo.Bar") == 0);
1194 "/org/freedesktop/TestPath",
1195 "Foo.TestInterface",
1202 v_INT32 = -0x12345678;
1203 v_UINT32 = 0x12300042;
1204 #ifdef DBUS_HAVE_INT64
1205 v_INT64 = DBUS_INT64_CONSTANT (-0x123456789abcd);
1206 v_UINT64 = DBUS_UINT64_CONSTANT (0x123456789abcd);
1208 v_STRING =
"Test string";
1213 #ifdef HAVE_UNIX_FD_PASSING
1222 #ifdef DBUS_HAVE_INT64
1223 DBUS_TYPE_INT64, &v_INT64,
1226 DBUS_TYPE_STRING, &v_STRING,
1235 #ifdef DBUS_HAVE_INT64
1238 DBUS_TYPE_ARRAY, DBUS_TYPE_INT64, &v_ARRAY_INT64,
1247 DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &v_ARRAY_STRING,
1257 #ifdef DBUS_HAVE_INT64
1270 #ifdef DBUS_HAVE_INT64
1287 #ifdef HAVE_UNIX_FD_PASSING
1297 _dbus_verbose (
"HEADER\n");
1299 _dbus_string_get_length (&message->
header.
data));
1300 _dbus_verbose (
"BODY\n");
1302 _dbus_string_get_length (&message->
body));
1304 _dbus_verbose (
"Signature expected \"%s\" actual \"%s\"\n",
1312 verify_test_message (message);
1321 _dbus_string_get_length (©->
header.
data));
1324 _dbus_string_get_length (©->
body));
1326 verify_test_message (copy);
1349 data = _dbus_string_get_const_data (&message->
header.
data);
1350 for (i = 0; i < _dbus_string_get_length (&message->
header.
data); i++)
1360 data = _dbus_string_get_const_data (&message->
body);
1361 for (i = 0; i < _dbus_string_get_length (&message->
body); i++)
1370 #ifdef HAVE_UNIX_FD_PASSING
1373 unsigned n_unix_fds;
1407 verify_test_message (message_without_unix_fds);
1414 char *marshalled =
NULL;
1429 verify_test_message (message2);
1461 _dbus_check_fdleaks_leave (initial_fds);
1462 initial_fds = _dbus_check_fdleaks_enter ();
1466 "/org/freedesktop/TestPath",
1467 "Foo.TestInterface",
1479 NULL, &struct_iter));
1494 DBusMessageDataIter diter;
1495 DBusMessageData mdata;
1498 reset_validities_seen ();
1501 _dbus_message_data_iter_init (&diter);
1503 while (_dbus_message_data_iter_get_and_next (&diter,
1506 if (!dbus_internal_do_not_use_try_message_data (&mdata.data,
1507 mdata.expected_validity))
1509 _dbus_warn (
"expected validity %d and did not get it\n",
1510 mdata.expected_validity);
1514 _dbus_message_data_free (&mdata);
1519 printf (
"%d sample messages tested\n", count);
1521 print_validities_seen (
FALSE);
1522 print_validities_seen (
TRUE);
1526 _dbus_check_fdleaks_leave (initial_fds);
1529 if (test_data_dir ==
NULL)
1532 initial_fds = _dbus_check_fdleaks_enter ();
1534 if (!dbus_internal_do_not_use_foreach_message_file (test_data_dir,
1535 (DBusForeachMessageFileFunc)
1536 dbus_internal_do_not_use_try_message_file,
1540 _dbus_check_fdleaks_leave (initial_fds);