1 /* -*- mode: C; c-file-style: "gnu" -*- */
2 /* dispatch.c Message dispatcher
4 * Copyright (C) 2003 CodeFactory AB
5 * Copyright (C) 2003 Red Hat, Inc.
6 * Copyright (C) 2004 Imendio HB
8 * Licensed under the Academic Free License version 2.0
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #include "connection.h"
30 #include "activation.h"
35 #include <dbus/dbus-internals.h>
39 send_one_message (DBusConnection *connection,
41 DBusConnection *sender,
42 DBusConnection *addressed_recipient,
44 BusTransaction *transaction,
47 if (!bus_context_check_security_policy (context, transaction,
53 return TRUE; /* silently don't send it */
55 if (!bus_transaction_send (transaction,
67 bus_dispatch_matches (BusTransaction *transaction,
68 DBusConnection *sender,
69 DBusConnection *addressed_recipient,
74 BusConnections *connections;
76 BusMatchmaker *matchmaker;
80 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
82 /* sender and recipient can both be NULL for the bus driver,
83 * or for signals with no particular recipient
86 _dbus_assert (sender == NULL || bus_connection_is_active (sender));
87 _dbus_assert (dbus_message_get_sender (message) != NULL);
89 connections = bus_transaction_get_connections (transaction);
91 dbus_error_init (&tmp_error);
92 context = bus_transaction_get_context (transaction);
93 matchmaker = bus_context_get_matchmaker (context);
96 if (!bus_matchmaker_get_recipients (matchmaker,
97 bus_context_get_connections (context),
98 sender, addressed_recipient, message,
105 link = _dbus_list_get_first_link (&recipients);
108 DBusConnection *dest;
112 if (!send_one_message (dest, context, sender, addressed_recipient,
113 message, transaction, &tmp_error))
116 link = _dbus_list_get_next_link (&recipients, link);
119 _dbus_list_clear (&recipients);
121 if (dbus_error_is_set (&tmp_error))
123 dbus_move_error (&tmp_error, error);
130 static DBusHandlerResult
131 bus_dispatch (DBusConnection *connection,
132 DBusMessage *message)
134 const char *sender, *service_name;
136 BusTransaction *transaction;
138 DBusHandlerResult result;
139 DBusConnection *addressed_recipient;
141 result = DBUS_HANDLER_RESULT_HANDLED;
144 addressed_recipient = NULL;
145 dbus_error_init (&error);
147 context = bus_connection_get_context (connection);
148 _dbus_assert (context != NULL);
150 /* If we can't even allocate an OOM error, we just go to sleep
153 while (!bus_connection_preallocate_oom_error (connection))
154 _dbus_wait_for_memory ();
156 /* Ref connection in case we disconnect it at some point in here */
157 dbus_connection_ref (connection);
159 service_name = dbus_message_get_destination (message);
161 #ifdef DBUS_ENABLE_VERBOSE_MODE
163 const char *interface_name, *member_name, *error_name;
165 interface_name = dbus_message_get_interface (message);
166 member_name = dbus_message_get_member (message);
167 error_name = dbus_message_get_error_name (message);
169 _dbus_verbose ("DISPATCH: %s %s %s to %s\n",
170 interface_name ? interface_name : "(no interface)",
171 member_name ? member_name : "(no member)",
172 error_name ? error_name : "(no error name)",
173 service_name ? service_name : "peer");
175 #endif /* DBUS_ENABLE_VERBOSE_MODE */
177 /* If service_name is NULL, if it's a signal we send it to all
178 * connections with a match rule. If it's not a signal, there
179 * are some special cases here but mostly we just bail out.
181 if (service_name == NULL)
183 if (dbus_message_is_signal (message,
184 DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL,
187 bus_connection_disconnected (connection);
191 if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL)
193 /* DBusConnection also handles some of these automatically, we leave
196 result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
201 /* Create our transaction */
202 transaction = bus_transaction_new (context);
203 if (transaction == NULL)
205 BUS_SET_OOM (&error);
209 /* Assign a sender to the message */
210 if (bus_connection_is_active (connection))
212 sender = bus_connection_get_name (connection);
213 _dbus_assert (sender != NULL);
215 if (!dbus_message_set_sender (message, sender))
217 BUS_SET_OOM (&error);
221 /* We need to refetch the service name here, because
222 * dbus_message_set_sender can cause the header to be
223 * reallocated, and thus the service_name pointer will become
226 service_name = dbus_message_get_destination (message);
230 strcmp (service_name, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS) == 0) /* to bus driver */
232 if (!bus_context_check_security_policy (context, transaction,
233 connection, NULL, NULL, message, &error))
235 _dbus_verbose ("Security policy rejected message\n");
239 _dbus_verbose ("Giving message to %s\n", DBUS_SERVICE_ORG_FREEDESKTOP_DBUS);
240 if (!bus_driver_handle_message (connection, transaction, message, &error))
243 else if (!bus_connection_is_active (connection)) /* clients must talk to bus driver first */
245 _dbus_verbose ("Received message from non-registered client. Disconnecting.\n");
246 dbus_connection_disconnect (connection);
249 else if (service_name != NULL) /* route to named service */
251 DBusString service_string;
253 BusRegistry *registry;
255 _dbus_assert (service_name != NULL);
257 registry = bus_connection_get_registry (connection);
259 _dbus_string_init_const (&service_string, service_name);
260 service = bus_registry_lookup (registry, &service_string);
262 if (service == NULL && dbus_message_get_auto_activation (message))
264 BusActivation *activation;
266 /* We can't do the security policy check here, since the addressed
267 * recipient service doesn't exist yet. We do it before sending the
268 * message after the service has been created.
270 activation = bus_connection_get_activation (connection);
272 if (!bus_activation_activate_service (activation, connection, transaction, TRUE,
273 message, service_name, &error))
275 _DBUS_ASSERT_ERROR_IS_SET (&error);
276 _dbus_verbose ("bus_activation_activate_service() failed\n");
282 else if (service == NULL)
284 dbus_set_error (&error,
285 DBUS_ERROR_SERVICE_DOES_NOT_EXIST,
286 "Service \"%s\" does not exist",
292 addressed_recipient = bus_service_get_primary_owner (service);
293 _dbus_assert (addressed_recipient != NULL);
295 if (!bus_context_check_security_policy (context, transaction,
296 connection, addressed_recipient,
301 /* Dispatch the message */
302 if (!bus_transaction_send (transaction, addressed_recipient, message))
304 BUS_SET_OOM (&error);
310 /* Now match the messages against any match rules, which will send
311 * out signals and such. addressed_recipient may == NULL.
313 if (!bus_dispatch_matches (transaction, connection, addressed_recipient, message, &error))
317 if (dbus_error_is_set (&error))
319 if (!dbus_connection_get_is_connected (connection))
321 /* If we disconnected it, we won't bother to send it any error
324 _dbus_verbose ("Not sending error to connection we disconnected\n");
326 else if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
328 bus_connection_send_oom_error (connection, message);
330 /* cancel transaction due to OOM */
331 if (transaction != NULL)
333 bus_transaction_cancel_and_free (transaction);
339 /* Try to send the real error, if no mem to do that, send
342 _dbus_assert (transaction != NULL);
344 if (!bus_transaction_send_error_reply (transaction, connection,
347 bus_connection_send_oom_error (connection, message);
349 /* cancel transaction due to OOM */
350 if (transaction != NULL)
352 bus_transaction_cancel_and_free (transaction);
358 dbus_error_free (&error);
361 if (transaction != NULL)
363 bus_transaction_execute_and_free (transaction);
366 dbus_connection_unref (connection);
371 static DBusHandlerResult
372 bus_dispatch_message_filter (DBusConnection *connection,
373 DBusMessage *message,
376 return bus_dispatch (connection, message);
380 bus_dispatch_add_connection (DBusConnection *connection)
382 if (!dbus_connection_add_filter (connection,
383 bus_dispatch_message_filter,
391 bus_dispatch_remove_connection (DBusConnection *connection)
393 /* Here we tell the bus driver that we want to get off. */
394 bus_driver_remove_connection (connection);
396 dbus_connection_remove_filter (connection,
397 bus_dispatch_message_filter,
401 #ifdef DBUS_BUILD_TESTS
405 typedef dbus_bool_t (* Check1Func) (BusContext *context);
406 typedef dbus_bool_t (* Check2Func) (BusContext *context,
407 DBusConnection *connection);
409 static dbus_bool_t check_no_leftovers (BusContext *context);
412 block_connection_until_message_from_bus (BusContext *context,
413 DBusConnection *connection)
415 while (dbus_connection_get_dispatch_status (connection) ==
416 DBUS_DISPATCH_COMPLETE &&
417 dbus_connection_get_is_connected (connection))
419 bus_test_run_bus_loop (context, TRUE);
420 bus_test_run_clients_loop (FALSE);
424 /* compensate for fact that pop_message() can return #NULL due to OOM */
426 pop_message_waiting_for_memory (DBusConnection *connection)
428 while (dbus_connection_get_dispatch_status (connection) ==
429 DBUS_DISPATCH_NEED_MEMORY)
430 _dbus_wait_for_memory ();
432 return dbus_connection_pop_message (connection);
436 warn_unexpected_real (DBusConnection *connection,
437 DBusMessage *message,
438 const char *expected,
439 const char *function,
443 _dbus_warn ("%s:%d received message interface \"%s\" member \"%s\" error name \"%s\" on %p, expecting %s\n",
445 dbus_message_get_interface (message) ?
446 dbus_message_get_interface (message) : "(unset)",
447 dbus_message_get_member (message) ?
448 dbus_message_get_member (message) : "(unset)",
449 dbus_message_get_error_name (message) ?
450 dbus_message_get_error_name (message) : "(unset)",
454 _dbus_warn ("%s:%d received no message on %p, expecting %s\n",
455 function, line, connection, expected);
458 #define warn_unexpected(connection, message, expected) \
459 warn_unexpected_real (connection, message, expected, _DBUS_FUNCTION_NAME, __LINE__)
462 verbose_message_received (DBusConnection *connection,
463 DBusMessage *message)
465 _dbus_verbose ("Received message interface \"%s\" member \"%s\" error name \"%s\" on %p\n",
466 dbus_message_get_interface (message) ?
467 dbus_message_get_interface (message) : "(unset)",
468 dbus_message_get_member (message) ?
469 dbus_message_get_member (message) : "(unset)",
470 dbus_message_get_error_name (message) ?
471 dbus_message_get_error_name (message) : "(unset)",
477 const char *expected_service_name;
479 } CheckServiceDeletedData;
482 check_service_deleted_foreach (DBusConnection *connection,
485 CheckServiceDeletedData *d = data;
486 DBusMessage *message;
490 dbus_error_init (&error);
494 message = pop_message_waiting_for_memory (connection);
497 _dbus_warn ("Did not receive a message on %p, expecting %s\n",
498 connection, "ServiceDeleted");
501 else if (!dbus_message_is_signal (message,
502 DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
505 warn_unexpected (connection, message, "ServiceDeleted");
511 if (!dbus_message_get_args (message, &error,
512 DBUS_TYPE_STRING, &service_name,
515 if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
517 _dbus_verbose ("no memory to get service name arg\n");
521 _dbus_assert (dbus_error_is_set (&error));
522 _dbus_warn ("Did not get the expected single string argument\n");
526 else if (strcmp (service_name, d->expected_service_name) != 0)
528 _dbus_warn ("expected deletion of service %s, got deletion of %s\n",
529 d->expected_service_name,
538 dbus_free (service_name);
539 dbus_error_free (&error);
542 dbus_message_unref (message);
548 kill_client_connection (BusContext *context,
549 DBusConnection *connection)
553 CheckServiceDeletedData csdd;
555 _dbus_verbose ("killing connection %p\n", connection);
557 s = dbus_bus_get_base_service (connection);
558 _dbus_assert (s != NULL);
560 while ((base_service = _dbus_strdup (s)) == NULL)
561 _dbus_wait_for_memory ();
563 dbus_connection_ref (connection);
565 /* kick in the disconnect handler that unrefs the connection */
566 dbus_connection_disconnect (connection);
568 bus_test_run_everything (context);
570 _dbus_assert (bus_test_client_listed (connection));
572 /* Run disconnect handler in test.c */
573 if (bus_connection_dispatch_one_message (connection))
574 _dbus_assert_not_reached ("something received on connection being killed other than the disconnect");
576 _dbus_assert (!dbus_connection_get_is_connected (connection));
577 dbus_connection_unref (connection);
579 _dbus_assert (!bus_test_client_listed (connection));
581 csdd.expected_service_name = base_service;
584 bus_test_clients_foreach (check_service_deleted_foreach,
587 dbus_free (base_service);
590 _dbus_assert_not_reached ("didn't get the expected ServiceDeleted messages");
592 if (!check_no_leftovers (context))
593 _dbus_assert_not_reached ("stuff left in message queues after disconnecting a client");
597 kill_client_connection_unchecked (DBusConnection *connection)
599 /* This kills the connection without expecting it to affect
600 * the rest of the bus.
602 _dbus_verbose ("Unchecked kill of connection %p\n", connection);
604 dbus_connection_ref (connection);
605 dbus_connection_disconnect (connection);
606 /* dispatching disconnect handler will unref once */
607 if (bus_connection_dispatch_one_message (connection))
608 _dbus_assert_not_reached ("message other than disconnect dispatched after failure to register");
610 _dbus_assert (!bus_test_client_listed (connection));
611 dbus_connection_unref (connection);
617 } CheckNoMessagesData;
620 check_no_messages_foreach (DBusConnection *connection,
623 CheckNoMessagesData *d = data;
624 DBusMessage *message;
626 message = pop_message_waiting_for_memory (connection);
629 warn_unexpected (connection, message, "no messages");
635 dbus_message_unref (message);
641 DBusConnection *skip_connection;
642 const char *expected_service_name;
644 } CheckServiceCreatedData;
647 check_service_created_foreach (DBusConnection *connection,
650 CheckServiceCreatedData *d = data;
651 DBusMessage *message;
655 if (connection == d->skip_connection)
658 dbus_error_init (&error);
662 message = pop_message_waiting_for_memory (connection);
665 _dbus_warn ("Did not receive a message on %p, expecting %s\n",
666 connection, "ServiceCreated");
669 else if (!dbus_message_is_signal (message,
670 DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
673 warn_unexpected (connection, message, "ServiceCreated");
678 if (!dbus_message_get_args (message, &error,
679 DBUS_TYPE_STRING, &service_name,
682 if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
684 _dbus_verbose ("no memory to get service name arg\n");
688 _dbus_assert (dbus_error_is_set (&error));
689 _dbus_warn ("Did not get the expected single string argument\n");
693 else if (strcmp (service_name, d->expected_service_name) != 0)
695 _dbus_warn ("expected creation of service %s, got creation of %s\n",
696 d->expected_service_name,
705 dbus_free (service_name);
706 dbus_error_free (&error);
709 dbus_message_unref (message);
715 check_no_leftovers (BusContext *context)
717 CheckNoMessagesData nmd;
720 bus_test_clients_foreach (check_no_messages_foreach,
729 /* returns TRUE if the correct thing happens,
730 * but the correct thing may include OOM errors.
733 check_hello_message (BusContext *context,
734 DBusConnection *connection)
736 DBusMessage *message;
737 dbus_uint32_t serial;
744 dbus_error_init (&error);
749 _dbus_verbose ("check_hello_message for %p\n", connection);
751 message = dbus_message_new_method_call (DBUS_SERVICE_ORG_FREEDESKTOP_DBUS,
752 DBUS_PATH_ORG_FREEDESKTOP_DBUS,
753 DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
759 if (!dbus_connection_send (connection, message, &serial))
761 dbus_message_unref (message);
765 dbus_message_unref (message);
768 /* send our message */
769 bus_test_run_clients_loop (TRUE);
771 dbus_connection_ref (connection); /* because we may get disconnected */
772 block_connection_until_message_from_bus (context, connection);
774 if (!dbus_connection_get_is_connected (connection))
776 _dbus_verbose ("connection was disconnected\n");
778 dbus_connection_unref (connection);
783 dbus_connection_unref (connection);
785 message = pop_message_waiting_for_memory (connection);
788 _dbus_warn ("Did not receive a reply to %s %d on %p\n",
789 "Hello", serial, connection);
793 verbose_message_received (connection, message);
795 if (!dbus_message_has_sender (message, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS))
797 _dbus_warn ("Message has wrong sender %s\n",
798 dbus_message_get_sender (message) ?
799 dbus_message_get_sender (message) : "(none)");
803 if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
805 if (dbus_message_is_error (message,
806 DBUS_ERROR_NO_MEMORY))
808 ; /* good, this is a valid response */
812 warn_unexpected (connection, message, "not this error");
819 CheckServiceCreatedData scd;
821 if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN)
823 ; /* good, expected */
827 warn_unexpected (connection, message, "method return for Hello");
832 retry_get_hello_name:
833 if (!dbus_message_get_args (message, &error,
834 DBUS_TYPE_STRING, &name,
837 if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
839 _dbus_verbose ("no memory to get service name arg from hello\n");
840 dbus_error_free (&error);
841 _dbus_wait_for_memory ();
842 goto retry_get_hello_name;
846 _dbus_assert (dbus_error_is_set (&error));
847 _dbus_warn ("Did not get the expected single string argument to hello\n");
852 _dbus_verbose ("Got hello name: %s\n", name);
854 while (!dbus_bus_set_base_service (connection, name))
855 _dbus_wait_for_memory ();
857 scd.skip_connection = connection; /* we haven't done AddMatch so won't get it ourselves */
859 scd.expected_service_name = name;
860 bus_test_clients_foreach (check_service_created_foreach,
866 /* Client should also have gotten ServiceAcquired */
867 dbus_message_unref (message);
868 message = pop_message_waiting_for_memory (connection);
871 _dbus_warn ("Expecting %s, got nothing\n",
876 retry_get_acquired_name:
877 if (!dbus_message_get_args (message, &error,
878 DBUS_TYPE_STRING, &acquired,
881 if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
883 _dbus_verbose ("no memory to get service name arg from acquired\n");
884 dbus_error_free (&error);
885 _dbus_wait_for_memory ();
886 goto retry_get_acquired_name;
890 _dbus_assert (dbus_error_is_set (&error));
891 _dbus_warn ("Did not get the expected single string argument to ServiceAcquired\n");
896 _dbus_verbose ("Got acquired name: %s\n", acquired);
898 if (strcmp (acquired, name) != 0)
900 _dbus_warn ("Acquired name is %s but expected %s\n",
906 if (!check_no_leftovers (context))
912 dbus_error_free (&error);
915 dbus_free (acquired);
918 dbus_message_unref (message);
923 /* returns TRUE if the correct thing happens,
924 * but the correct thing may include OOM errors.
927 check_get_connection_unix_user (BusContext *context,
928 DBusConnection *connection)
930 DBusMessage *message;
931 dbus_uint32_t serial;
934 const char *base_service_name;
938 dbus_error_init (&error);
941 _dbus_verbose ("check_get_connection_unix_user for %p\n", connection);
943 message = dbus_message_new_method_call (DBUS_SERVICE_ORG_FREEDESKTOP_DBUS,
944 DBUS_PATH_ORG_FREEDESKTOP_DBUS,
945 DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
946 "GetConnectionUnixUser");
951 base_service_name = dbus_bus_get_base_service (connection);
953 if (!dbus_message_append_args (message,
954 DBUS_TYPE_STRING, base_service_name,
957 dbus_message_unref (message);
961 if (!dbus_connection_send (connection, message, &serial))
963 dbus_message_unref (message);
967 /* send our message */
968 bus_test_run_clients_loop (TRUE);
970 dbus_message_unref (message);
973 dbus_connection_ref (connection); /* because we may get disconnected */
974 block_connection_until_message_from_bus (context, connection);
976 if (!dbus_connection_get_is_connected (connection))
978 _dbus_verbose ("connection was disconnected\n");
980 dbus_connection_unref (connection);
985 dbus_connection_unref (connection);
987 message = pop_message_waiting_for_memory (connection);
990 _dbus_warn ("Did not receive a reply to %s %d on %p\n",
991 "GetConnectionUnixUser", serial, connection);
995 verbose_message_received (connection, message);
997 if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
999 if (dbus_message_is_error (message, DBUS_ERROR_NO_MEMORY))
1001 ; /* good, this is a valid response */
1005 warn_unexpected (connection, message, "not this error");
1012 if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN)
1014 ; /* good, expected */
1018 warn_unexpected (connection, message,
1019 "method_return for GetConnectionUnixUser");
1026 if (!dbus_message_get_args (message, &error,
1027 DBUS_TYPE_UINT32, &uid,
1030 if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
1032 _dbus_verbose ("no memory to get uid by GetProperty\n");
1033 dbus_error_free (&error);
1034 _dbus_wait_for_memory ();
1035 goto retry_get_property;
1039 _dbus_assert (dbus_error_is_set (&error));
1040 _dbus_warn ("Did not get the expected DBUS_TYPE_UINT32 from GetProperty\n");
1046 if (!check_no_leftovers (context))
1052 dbus_error_free (&error);
1055 dbus_message_unref (message);
1059 /* returns TRUE if the correct thing happens,
1060 * but the correct thing may include OOM errors.
1063 check_add_match_all (BusContext *context,
1064 DBusConnection *connection)
1066 DBusMessage *message;
1068 dbus_uint32_t serial;
1072 dbus_error_init (&error);
1075 _dbus_verbose ("check_add_match_all for %p\n", connection);
1077 message = dbus_message_new_method_call (DBUS_SERVICE_ORG_FREEDESKTOP_DBUS,
1078 DBUS_PATH_ORG_FREEDESKTOP_DBUS,
1079 DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
1082 if (message == NULL)
1085 /* empty string match rule matches everything */
1086 if (!dbus_message_append_args (message, DBUS_TYPE_STRING, "",
1089 dbus_message_unref (message);
1093 if (!dbus_connection_send (connection, message, &serial))
1095 dbus_message_unref (message);
1099 dbus_message_unref (message);
1102 /* send our message */
1103 bus_test_run_clients_loop (TRUE);
1105 dbus_connection_ref (connection); /* because we may get disconnected */
1106 block_connection_until_message_from_bus (context, connection);
1108 if (!dbus_connection_get_is_connected (connection))
1110 _dbus_verbose ("connection was disconnected\n");
1112 dbus_connection_unref (connection);
1117 dbus_connection_unref (connection);
1119 message = pop_message_waiting_for_memory (connection);
1120 if (message == NULL)
1122 _dbus_warn ("Did not receive a reply to %s %d on %p\n",
1123 "AddMatch", serial, connection);
1127 verbose_message_received (connection, message);
1129 if (!dbus_message_has_sender (message, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS))
1131 _dbus_warn ("Message has wrong sender %s\n",
1132 dbus_message_get_sender (message) ?
1133 dbus_message_get_sender (message) : "(none)");
1137 if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
1139 if (dbus_message_is_error (message,
1140 DBUS_ERROR_NO_MEMORY))
1142 ; /* good, this is a valid response */
1146 warn_unexpected (connection, message, "not this error");
1153 if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN)
1155 ; /* good, expected */
1156 _dbus_assert (dbus_message_get_reply_serial (message) == serial);
1160 warn_unexpected (connection, message, "method return for AddMatch");
1166 if (!check_no_leftovers (context))
1172 dbus_error_free (&error);
1175 dbus_message_unref (message);
1180 /* returns TRUE if the correct thing happens,
1181 * but the correct thing may include OOM errors.
1184 check_hello_connection (BusContext *context)
1186 DBusConnection *connection;
1189 dbus_error_init (&error);
1191 connection = dbus_connection_open ("debug-pipe:name=test-server", &error);
1192 if (connection == NULL)
1194 _DBUS_ASSERT_ERROR_IS_SET (&error);
1195 dbus_error_free (&error);
1199 if (!bus_setup_debug_client (connection))
1201 dbus_connection_disconnect (connection);
1202 dbus_connection_unref (connection);
1206 if (!check_hello_message (context, connection))
1209 if (dbus_bus_get_base_service (connection) == NULL)
1211 /* We didn't successfully register, so we can't
1212 * do the usual kill_client_connection() checks
1214 kill_client_connection_unchecked (connection);
1218 if (!check_add_match_all (context, connection))
1221 kill_client_connection (context, connection);
1227 #define NONEXISTENT_SERVICE_NAME "test.this.service.does.not.exist.ewuoiurjdfxcvn"
1229 /* returns TRUE if the correct thing happens,
1230 * but the correct thing may include OOM errors.
1233 check_nonexistent_service_activation (BusContext *context,
1234 DBusConnection *connection)
1236 DBusMessage *message;
1237 dbus_uint32_t serial;
1241 dbus_error_init (&error);
1243 message = dbus_message_new_method_call (DBUS_SERVICE_ORG_FREEDESKTOP_DBUS,
1244 DBUS_PATH_ORG_FREEDESKTOP_DBUS,
1245 DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
1248 if (message == NULL)
1251 if (!dbus_message_append_args (message,
1252 DBUS_TYPE_STRING, NONEXISTENT_SERVICE_NAME,
1253 DBUS_TYPE_UINT32, 0,
1256 dbus_message_unref (message);
1260 if (!dbus_connection_send (connection, message, &serial))
1262 dbus_message_unref (message);
1266 dbus_message_unref (message);
1269 bus_test_run_everything (context);
1270 block_connection_until_message_from_bus (context, connection);
1271 bus_test_run_everything (context);
1273 if (!dbus_connection_get_is_connected (connection))
1275 _dbus_verbose ("connection was disconnected\n");
1281 message = pop_message_waiting_for_memory (connection);
1282 if (message == NULL)
1284 _dbus_warn ("Did not receive a reply to %s %d on %p\n",
1285 "ActivateService", serial, connection);
1289 verbose_message_received (connection, message);
1291 if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
1293 if (!dbus_message_has_sender (message, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS))
1295 _dbus_warn ("Message has wrong sender %s\n",
1296 dbus_message_get_sender (message) ?
1297 dbus_message_get_sender (message) : "(none)");
1301 if (dbus_message_is_error (message,
1302 DBUS_ERROR_NO_MEMORY))
1304 ; /* good, this is a valid response */
1306 else if (dbus_message_is_error (message,
1307 DBUS_ERROR_ACTIVATE_SERVICE_NOT_FOUND))
1309 ; /* good, this is expected also */
1313 warn_unexpected (connection, message, "not this error");
1319 _dbus_warn ("Did not expect to successfully activate %s\n",
1320 NONEXISTENT_SERVICE_NAME);
1328 dbus_message_unref (message);
1333 /* returns TRUE if the correct thing happens,
1334 * but the correct thing may include OOM errors.
1337 check_nonexistent_service_auto_activation (BusContext *context,
1338 DBusConnection *connection)
1340 DBusMessage *message;
1341 dbus_uint32_t serial;
1345 dbus_error_init (&error);
1347 message = dbus_message_new_method_call (NONEXISTENT_SERVICE_NAME,
1348 "/org/freedesktop/TestSuite",
1349 "org.freedesktop.TestSuite",
1352 if (message == NULL)
1355 dbus_message_set_auto_activation (message, TRUE);
1357 if (!dbus_connection_send (connection, message, &serial))
1359 dbus_message_unref (message);
1363 dbus_message_unref (message);
1366 bus_test_run_everything (context);
1367 block_connection_until_message_from_bus (context, connection);
1368 bus_test_run_everything (context);
1370 if (!dbus_connection_get_is_connected (connection))
1372 _dbus_verbose ("connection was disconnected\n");
1378 message = pop_message_waiting_for_memory (connection);
1380 if (message == NULL)
1382 _dbus_warn ("Did not receive a reply to %s %d on %p\n",
1383 "Echo message (auto activation)", serial, connection);
1387 verbose_message_received (connection, message);
1389 if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
1391 if (!dbus_message_has_sender (message, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS))
1393 _dbus_warn ("Message has wrong sender %s\n",
1394 dbus_message_get_sender (message) ?
1395 dbus_message_get_sender (message) : "(none)");
1399 if (dbus_message_is_error (message,
1400 DBUS_ERROR_NO_MEMORY))
1402 ; /* good, this is a valid response */
1404 else if (dbus_message_is_error (message,
1405 DBUS_ERROR_ACTIVATE_SERVICE_NOT_FOUND))
1407 ; /* good, this is expected also */
1411 warn_unexpected (connection, message, "not this error");
1417 _dbus_warn ("Did not expect to successfully activate %s\n",
1418 NONEXISTENT_SERVICE_NAME);
1426 dbus_message_unref (message);
1432 check_base_service_activated (BusContext *context,
1433 DBusConnection *connection,
1434 DBusMessage *initial_message,
1435 char **base_service_p)
1437 DBusMessage *message;
1442 base_service = NULL;
1445 dbus_error_init (&error);
1447 message = initial_message;
1448 dbus_message_ref (message);
1450 if (dbus_message_is_signal (message,
1451 DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
1455 CheckServiceCreatedData scd;
1457 reget_service_name_arg:
1458 if (!dbus_message_get_args (message, &error,
1459 DBUS_TYPE_STRING, &service_name,
1462 if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
1464 dbus_error_free (&error);
1465 _dbus_wait_for_memory ();
1466 goto reget_service_name_arg;
1470 _dbus_warn ("Message %s doesn't have a service name: %s\n",
1473 dbus_error_free (&error);
1478 if (*service_name != ':')
1480 _dbus_warn ("Expected base service activation, got \"%s\" instead\n",
1485 base_service = service_name;
1486 service_name = NULL;
1488 scd.skip_connection = connection;
1490 scd.expected_service_name = base_service;
1491 bus_test_clients_foreach (check_service_created_foreach,
1499 warn_unexpected (connection, message, "ServiceCreated for base service");
1508 *base_service_p = base_service;
1509 base_service = NULL;
1514 dbus_message_unref (message);
1517 dbus_free (base_service);
1523 check_service_activated (BusContext *context,
1524 DBusConnection *connection,
1525 const char *activated_name,
1526 const char *base_service_name,
1527 DBusMessage *initial_message)
1529 DBusMessage *message;
1532 dbus_uint32_t activation_result;
1536 dbus_error_init (&error);
1538 message = initial_message;
1539 dbus_message_ref (message);
1541 if (dbus_message_is_signal (message,
1542 DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
1546 CheckServiceCreatedData scd;
1548 reget_service_name_arg:
1549 if (!dbus_message_get_args (message, &error,
1550 DBUS_TYPE_STRING, &service_name,
1553 if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
1555 dbus_error_free (&error);
1556 _dbus_wait_for_memory ();
1557 goto reget_service_name_arg;
1561 _dbus_warn ("Message %s doesn't have a service name: %s\n",
1564 dbus_error_free (&error);
1569 if (strcmp (service_name, activated_name) != 0)
1571 _dbus_warn ("Expected to see service %s created, saw %s instead\n",
1572 activated_name, service_name);
1573 dbus_free (service_name);
1577 scd.skip_connection = connection;
1579 scd.expected_service_name = service_name;
1580 bus_test_clients_foreach (check_service_created_foreach,
1583 dbus_free (service_name);
1588 dbus_message_unref (message);
1589 message = pop_message_waiting_for_memory (connection);
1590 if (message == NULL)
1592 _dbus_warn ("Expected a reply to %s, got nothing\n",
1599 warn_unexpected (connection, message, "ServiceCreated for the activated name");
1604 if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_RETURN)
1606 warn_unexpected (connection, message, "reply to ActivateService");
1611 activation_result = 0;
1612 if (!dbus_message_get_args (message, &error,
1613 DBUS_TYPE_UINT32, &activation_result,
1616 if (!dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
1618 _dbus_warn ("Did not have activation result first argument to %s: %s\n",
1619 "ActivateService", error.message);
1620 dbus_error_free (&error);
1624 dbus_error_free (&error);
1628 if (activation_result == DBUS_ACTIVATION_REPLY_ACTIVATED)
1630 else if (activation_result == DBUS_ACTIVATION_REPLY_ALREADY_ACTIVE)
1634 _dbus_warn ("Activation result was 0x%x, no good.\n",
1640 dbus_message_unref (message);
1643 if (!check_no_leftovers (context))
1645 _dbus_warn ("Messages were left over after verifying existent activation results\n");
1653 dbus_message_unref (message);
1659 check_service_auto_activated (BusContext *context,
1660 DBusConnection *connection,
1661 const char *activated_name,
1662 const char *base_service_name,
1663 DBusMessage *initial_message)
1665 DBusMessage *message;
1671 dbus_error_init (&error);
1673 message = initial_message;
1674 dbus_message_ref (message);
1676 if (dbus_message_is_signal (message,
1677 DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
1681 CheckServiceCreatedData scd;
1683 reget_service_name_arg:
1684 if (!dbus_message_get_args (message, &error,
1685 DBUS_TYPE_STRING, &service_name,
1688 if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
1690 dbus_error_free (&error);
1691 _dbus_wait_for_memory ();
1692 goto reget_service_name_arg;
1696 _dbus_warn ("Message %s doesn't have a service name: %s\n",
1699 dbus_error_free (&error);
1704 if (strcmp (service_name, activated_name) != 0)
1706 _dbus_warn ("Expected to see service %s created, saw %s instead\n",
1707 activated_name, service_name);
1708 dbus_free (service_name);
1712 scd.skip_connection = connection;
1714 scd.expected_service_name = service_name;
1715 bus_test_clients_foreach (check_service_created_foreach,
1718 dbus_free (service_name);
1723 /* Note that this differs from regular activation in that we don't get a
1724 * reply to ActivateService here.
1727 dbus_message_unref (message);
1732 warn_unexpected (connection, message, "ServiceCreated for the activated name");
1741 dbus_message_unref (message);
1747 check_service_deactivated (BusContext *context,
1748 DBusConnection *connection,
1749 const char *activated_name,
1750 const char *base_service)
1752 DBusMessage *message;
1755 CheckServiceDeletedData csdd;
1760 dbus_error_init (&error);
1762 /* Now we are expecting ServiceDeleted messages for the base
1763 * service and the activated_name. The base service
1764 * notification is required to come last.
1766 csdd.expected_service_name = activated_name;
1767 csdd.failed = FALSE;
1768 bus_test_clients_foreach (check_service_deleted_foreach,
1774 csdd.expected_service_name = base_service;
1775 csdd.failed = FALSE;
1776 bus_test_clients_foreach (check_service_deleted_foreach,
1786 dbus_message_unref (message);
1792 check_send_exit_to_service (BusContext *context,
1793 DBusConnection *connection,
1794 const char *service_name,
1795 const char *base_service)
1797 dbus_bool_t got_error;
1798 DBusMessage *message;
1799 dbus_uint32_t serial;
1802 _dbus_verbose ("Sending exit message to the test service\n");
1806 /* Kill off the test service by sending it a quit message */
1807 message = dbus_message_new_method_call (service_name,
1808 "/org/freedesktop/TestSuite",
1809 "org.freedesktop.TestSuite",
1812 if (message == NULL)
1814 /* Do this again; we still need the service to exit... */
1815 if (!check_send_exit_to_service (context, connection,
1816 service_name, base_service))
1822 if (!dbus_connection_send (connection, message, &serial))
1824 dbus_message_unref (message);
1826 /* Do this again; we still need the service to exit... */
1827 if (!check_send_exit_to_service (context, connection,
1828 service_name, base_service))
1834 dbus_message_unref (message);
1838 bus_test_run_clients_loop (TRUE);
1840 /* read it in and write it out to test service */
1841 bus_test_run_bus_loop (context, FALSE);
1843 /* see if we got an error during message bus dispatching */
1844 bus_test_run_clients_loop (FALSE);
1845 message = dbus_connection_borrow_message (connection);
1846 got_error = message != NULL && dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR;
1849 dbus_connection_return_message (connection, message);
1855 /* If no error, wait for the test service to exit */
1856 block_connection_until_message_from_bus (context, connection);
1858 bus_test_run_everything (context);
1863 message = pop_message_waiting_for_memory (connection);
1864 _dbus_assert (message != NULL);
1866 if (dbus_message_get_reply_serial (message) != serial)
1868 warn_unexpected (connection, message,
1869 "error with the correct reply serial");
1873 if (!dbus_message_is_error (message,
1874 DBUS_ERROR_NO_MEMORY))
1876 warn_unexpected (connection, message,
1877 "a no memory error from asking test service to exit");
1881 _dbus_verbose ("Got error %s when asking test service to exit\n",
1882 dbus_message_get_error_name (message));
1884 /* Do this again; we still need the service to exit... */
1885 if (!check_send_exit_to_service (context, connection,
1886 service_name, base_service))
1891 if (!check_service_deactivated (context, connection,
1892 service_name, base_service))
1895 /* Should now have a NoReply error from the Exit() method
1896 * call; it should have come after all the deactivation
1899 message = pop_message_waiting_for_memory (connection);
1901 if (message == NULL)
1903 warn_unexpected (connection, NULL,
1904 "reply to Exit() method call");
1907 if (!dbus_message_is_error (message,
1908 DBUS_ERROR_NO_REPLY))
1910 warn_unexpected (connection, NULL,
1911 "NoReply error from Exit() method call");
1915 if (dbus_message_get_reply_serial (message) != serial)
1917 warn_unexpected (connection, message,
1918 "error with the correct reply serial");
1922 _dbus_verbose ("Got error %s after test service exited\n",
1923 dbus_message_get_error_name (message));
1925 if (!check_no_leftovers (context))
1927 _dbus_warn ("Messages were left over after %s\n",
1928 _DBUS_FUNCTION_NAME);
1937 dbus_message_unref (message);
1943 check_got_error (BusContext *context,
1944 DBusConnection *connection,
1945 const char *first_error_name,
1948 DBusMessage *message;
1951 dbus_bool_t error_found;
1952 const char *error_name;
1956 message = pop_message_waiting_for_memory (connection);
1957 if (message == NULL)
1959 _dbus_warn ("Did not get an expected error\n");
1963 if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_ERROR)
1965 warn_unexpected (connection, message, "an error");
1970 error_found = FALSE;
1972 va_start (ap, first_error_name);
1973 error_name = first_error_name;
1974 while (error_name != NULL)
1976 if (dbus_message_is_error (message, error_name))
1981 error_name = va_arg (ap, char*);
1987 _dbus_warn ("Expected error %s or other, got %s instead\n",
1989 dbus_message_get_error_name (message));
1997 dbus_message_unref (message);
2002 #define EXISTENT_SERVICE_NAME "org.freedesktop.DBus.TestSuiteEchoService"
2004 /* returns TRUE if the correct thing happens,
2005 * but the correct thing may include OOM errors.
2008 check_existent_service_activation (BusContext *context,
2009 DBusConnection *connection)
2011 DBusMessage *message;
2012 dbus_uint32_t serial;
2017 base_service = NULL;
2019 dbus_error_init (&error);
2021 message = dbus_message_new_method_call (DBUS_SERVICE_ORG_FREEDESKTOP_DBUS,
2022 DBUS_PATH_ORG_FREEDESKTOP_DBUS,
2023 DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
2026 if (message == NULL)
2029 if (!dbus_message_append_args (message,
2030 DBUS_TYPE_STRING, EXISTENT_SERVICE_NAME,
2031 DBUS_TYPE_UINT32, 0,
2034 dbus_message_unref (message);
2038 if (!dbus_connection_send (connection, message, &serial))
2040 dbus_message_unref (message);
2044 dbus_message_unref (message);
2047 bus_test_run_everything (context);
2049 /* now wait for the message bus to hear back from the activated
2052 block_connection_until_message_from_bus (context, connection);
2054 bus_test_run_everything (context);
2056 if (!dbus_connection_get_is_connected (connection))
2058 _dbus_verbose ("connection was disconnected\n");
2064 message = pop_message_waiting_for_memory (connection);
2065 if (message == NULL)
2067 _dbus_warn ("Did not receive any messages after %s %d on %p\n",
2068 "ActivateService", serial, connection);
2072 verbose_message_received (connection, message);
2073 _dbus_verbose (" (after sending %s)\n", "ActivateService");
2075 if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
2077 if (!dbus_message_has_sender (message, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS))
2079 _dbus_warn ("Message has wrong sender %s\n",
2080 dbus_message_get_sender (message) ?
2081 dbus_message_get_sender (message) : "(none)");
2085 if (dbus_message_is_error (message,
2086 DBUS_ERROR_NO_MEMORY))
2088 ; /* good, this is a valid response */
2090 else if (dbus_message_is_error (message,
2091 DBUS_ERROR_SPAWN_CHILD_EXITED))
2093 ; /* good, this is expected also */
2097 _dbus_warn ("Did not expect error %s\n",
2098 dbus_message_get_error_name (message));
2104 dbus_bool_t got_service_deleted;
2105 dbus_bool_t got_error;
2107 if (!check_base_service_activated (context, connection,
2108 message, &base_service))
2111 dbus_message_unref (message);
2114 /* We may need to block here for the test service to exit or finish up */
2115 block_connection_until_message_from_bus (context, connection);
2117 message = dbus_connection_borrow_message (connection);
2118 if (message == NULL)
2120 _dbus_warn ("Did not receive any messages after base service creation notification\n");
2124 got_service_deleted = dbus_message_is_signal (message,
2125 DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
2127 got_error = dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR;
2129 dbus_connection_return_message (connection, message);
2134 if (!check_got_error (context, connection,
2135 DBUS_ERROR_SPAWN_CHILD_EXITED,
2136 DBUS_ERROR_NO_MEMORY,
2140 /* A service deleted should be coming along now after this error.
2141 * We can also get the error *after* the service deleted.
2143 got_service_deleted = TRUE;
2146 if (got_service_deleted)
2148 /* The service started up and got a base address, but then
2149 * failed to register under EXISTENT_SERVICE_NAME
2151 CheckServiceDeletedData csdd;
2153 csdd.expected_service_name = base_service;
2154 csdd.failed = FALSE;
2155 bus_test_clients_foreach (check_service_deleted_foreach,
2161 /* Now we should get an error about the service exiting
2162 * if we didn't get it before.
2166 block_connection_until_message_from_bus (context, connection);
2168 /* and process everything again */
2169 bus_test_run_everything (context);
2171 if (!check_got_error (context, connection,
2172 DBUS_ERROR_SPAWN_CHILD_EXITED,
2179 message = pop_message_waiting_for_memory (connection);
2180 if (message == NULL)
2182 _dbus_warn ("Failed to pop message we just put back! should have been a ServiceCreated\n");
2186 if (!check_service_activated (context, connection, EXISTENT_SERVICE_NAME,
2187 base_service, message))
2190 dbus_message_unref (message);
2194 if (!check_no_leftovers (context))
2196 _dbus_warn ("Messages were left over after successful activation\n");
2200 if (!check_send_exit_to_service (context, connection,
2201 EXISTENT_SERVICE_NAME, base_service))
2210 dbus_message_unref (message);
2213 dbus_free (base_service);
2218 /* returns TRUE if the correct thing happens,
2219 * but the correct thing may include OOM errors.
2222 check_segfault_service_activation (BusContext *context,
2223 DBusConnection *connection)
2225 DBusMessage *message;
2226 dbus_uint32_t serial;
2230 dbus_error_init (&error);
2232 message = dbus_message_new_method_call (DBUS_SERVICE_ORG_FREEDESKTOP_DBUS,
2233 DBUS_PATH_ORG_FREEDESKTOP_DBUS,
2234 DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
2237 if (message == NULL)
2240 if (!dbus_message_append_args (message,
2242 "org.freedesktop.DBus.TestSuiteSegfaultService",
2243 DBUS_TYPE_UINT32, 0,
2246 dbus_message_unref (message);
2250 if (!dbus_connection_send (connection, message, &serial))
2252 dbus_message_unref (message);
2256 dbus_message_unref (message);
2259 bus_test_run_everything (context);
2260 block_connection_until_message_from_bus (context, connection);
2261 bus_test_run_everything (context);
2263 if (!dbus_connection_get_is_connected (connection))
2265 _dbus_verbose ("connection was disconnected\n");
2271 message = pop_message_waiting_for_memory (connection);
2272 if (message == NULL)
2274 _dbus_warn ("Did not receive a reply to %s %d on %p\n",
2275 "ActivateService", serial, connection);
2279 verbose_message_received (connection, message);
2281 if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
2283 if (!dbus_message_has_sender (message, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS))
2285 _dbus_warn ("Message has wrong sender %s\n",
2286 dbus_message_get_sender (message) ?
2287 dbus_message_get_sender (message) : "(none)");
2291 if (dbus_message_is_error (message,
2292 DBUS_ERROR_NO_MEMORY))
2294 ; /* good, this is a valid response */
2296 else if (dbus_message_is_error (message,
2297 DBUS_ERROR_SPAWN_CHILD_SIGNALED))
2299 ; /* good, this is expected also */
2303 warn_unexpected (connection, message, "not this error");
2310 _dbus_warn ("Did not expect to successfully activate segfault service\n");
2318 dbus_message_unref (message);
2324 /* returns TRUE if the correct thing happens,
2325 * but the correct thing may include OOM errors.
2328 check_segfault_service_auto_activation (BusContext *context,
2329 DBusConnection *connection)
2331 DBusMessage *message;
2332 dbus_uint32_t serial;
2336 dbus_error_init (&error);
2338 dbus_error_init (&error);
2340 message = dbus_message_new_method_call ("org.freedesktop.DBus.TestSuiteSegfaultService",
2341 "/org/freedesktop/TestSuite",
2342 "org.freedesktop.TestSuite",
2345 if (message == NULL)
2348 dbus_message_set_auto_activation (message, TRUE);
2350 if (!dbus_connection_send (connection, message, &serial))
2352 dbus_message_unref (message);
2356 dbus_message_unref (message);
2359 bus_test_run_everything (context);
2360 block_connection_until_message_from_bus (context, connection);
2361 bus_test_run_everything (context);
2363 if (!dbus_connection_get_is_connected (connection))
2365 _dbus_verbose ("connection was disconnected\n");
2371 message = pop_message_waiting_for_memory (connection);
2372 if (message == NULL)
2374 _dbus_warn ("Did not receive a reply to %s %d on %p\n",
2375 "Echo message (auto activation)", serial, connection);
2379 verbose_message_received (connection, message);
2381 if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
2383 if (!dbus_message_has_sender (message, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS))
2385 _dbus_warn ("Message has wrong sender %s\n",
2386 dbus_message_get_sender (message) ?
2387 dbus_message_get_sender (message) : "(none)");
2391 if (dbus_message_is_error (message,
2392 DBUS_ERROR_NO_MEMORY))
2394 ; /* good, this is a valid response */
2396 else if (dbus_message_is_error (message,
2397 DBUS_ERROR_SPAWN_CHILD_SIGNALED))
2399 ; /* good, this is expected also */
2403 warn_unexpected (connection, message, "not this error");
2410 _dbus_warn ("Did not expect to successfully activate segfault service\n");
2418 dbus_message_unref (message);
2423 #define TEST_ECHO_MESSAGE "Test echo message"
2425 /* returns TRUE if the correct thing happens,
2426 * but the correct thing may include OOM errors.
2429 check_existent_service_auto_activation (BusContext *context,
2430 DBusConnection *connection)
2432 DBusMessage *message;
2433 dbus_uint32_t serial;
2438 base_service = NULL;
2440 dbus_error_init (&error);
2442 message = dbus_message_new_method_call (EXISTENT_SERVICE_NAME,
2443 "/org/freedesktop/TestSuite",
2444 "org.freedesktop.TestSuite",
2447 if (message == NULL)
2450 dbus_message_set_auto_activation (message, TRUE);
2452 if (!dbus_message_append_args (message,
2453 DBUS_TYPE_STRING, TEST_ECHO_MESSAGE,
2456 dbus_message_unref (message);
2460 if (!dbus_connection_send (connection, message, &serial))
2462 dbus_message_unref (message);
2466 dbus_message_unref (message);
2469 bus_test_run_everything (context);
2471 /* now wait for the message bus to hear back from the activated
2474 block_connection_until_message_from_bus (context, connection);
2475 bus_test_run_everything (context);
2477 if (!dbus_connection_get_is_connected (connection))
2479 _dbus_verbose ("connection was disconnected\n");
2485 /* Should get ServiceCreated for the base service, or an error. */
2486 message = pop_message_waiting_for_memory (connection);
2487 if (message == NULL)
2489 _dbus_warn ("Did not receive any messages after auto activation %d on %p\n",
2490 serial, connection);
2494 verbose_message_received (connection, message);
2495 _dbus_verbose (" (after sending %s)\n", "ActivateService");
2497 if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
2499 if (!dbus_message_has_sender (message, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS))
2501 _dbus_warn ("Message has wrong sender %s\n",
2502 dbus_message_get_sender (message) ?
2503 dbus_message_get_sender (message) : "(none)");
2507 if (dbus_message_is_error (message, DBUS_ERROR_NO_MEMORY) ||
2508 dbus_message_is_error (message, DBUS_ERROR_SPAWN_CHILD_EXITED) ||
2509 dbus_message_is_error (message, DBUS_ERROR_TIMED_OUT))
2511 ; /* good, those are expected */
2517 _dbus_warn ("Did not expect error %s\n",
2518 dbus_message_get_error_name (message));
2524 dbus_bool_t got_service_deleted;
2525 dbus_bool_t got_error;
2527 if (!check_base_service_activated (context, connection,
2528 message, &base_service))
2531 dbus_message_unref (message);
2534 /* We may need to block here for the test service to exit or finish up */
2535 block_connection_until_message_from_bus (context, connection);
2537 /* Should get ServiceCreated for the activated service name,
2538 * ServiceDeleted on the base service name, or an error.
2540 message = dbus_connection_borrow_message (connection);
2541 if (message == NULL)
2543 _dbus_warn ("Did not receive any messages after base service creation notification\n");
2547 got_service_deleted = dbus_message_is_signal (message,
2548 DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
2550 got_error = dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR;
2552 dbus_connection_return_message (connection, message);
2557 if (!check_got_error (context, connection,
2558 DBUS_ERROR_SPAWN_CHILD_EXITED,
2559 DBUS_ERROR_NO_MEMORY,
2563 /* A service deleted should be coming along now after this error.
2564 * We can also get the error *after* the service deleted.
2566 got_service_deleted = TRUE;
2569 if (got_service_deleted)
2571 /* The service started up and got a base address, but then
2572 * failed to register under EXISTENT_SERVICE_NAME
2574 CheckServiceDeletedData csdd;
2576 csdd.expected_service_name = base_service;
2577 csdd.failed = FALSE;
2578 bus_test_clients_foreach (check_service_deleted_foreach,
2584 /* Now we should get an error about the service exiting
2585 * if we didn't get it before.
2589 block_connection_until_message_from_bus (context, connection);
2591 /* and process everything again */
2592 bus_test_run_everything (context);
2594 if (!check_got_error (context, connection,
2595 DBUS_ERROR_SPAWN_CHILD_EXITED,
2602 message = pop_message_waiting_for_memory (connection);
2603 if (message == NULL)
2605 _dbus_warn ("Failed to pop message we just put back! should have been a ServiceCreated\n");
2609 /* Check that ServiceCreated was correctly received */
2610 if (!check_service_auto_activated (context, connection, EXISTENT_SERVICE_NAME,
2611 base_service, message))
2614 dbus_message_unref (message);
2618 /* Note: if this test is run in OOM mode, it will block when the bus
2619 * doesn't send a reply due to OOM.
2621 block_connection_until_message_from_bus (context, connection);
2623 message = pop_message_waiting_for_memory (connection);
2624 if (message == NULL)
2626 _dbus_warn ("Failed to pop message! Should have been reply from echo message\n");
2630 if (dbus_message_get_reply_serial (message) != serial)
2632 _dbus_warn ("Wrong reply serial\n");
2636 dbus_message_unref (message);
2639 if (!check_send_exit_to_service (context, connection,
2640 EXISTENT_SERVICE_NAME,
2649 dbus_message_unref (message);
2652 dbus_free (base_service);
2660 BusContext *context;
2664 check_oom_check1_func (void *data)
2666 Check1Data *d = data;
2668 if (! (* d->func) (d->context))
2671 if (!check_no_leftovers (d->context))
2673 _dbus_warn ("Messages were left over, should be covered by test suite\n");
2681 check1_try_iterations (BusContext *context,
2682 const char *description,
2688 d.context = context;
2690 if (!_dbus_test_oom_handling (description, check_oom_check1_func,
2692 _dbus_assert_not_reached ("test failed");
2698 BusContext *context;
2699 DBusConnection *connection;
2703 check_oom_check2_func (void *data)
2705 Check2Data *d = data;
2707 if (! (* d->func) (d->context, d->connection))
2710 if (!check_no_leftovers (d->context))
2712 _dbus_warn ("Messages were left over, should be covered by test suite");
2720 check2_try_iterations (BusContext *context,
2721 DBusConnection *connection,
2722 const char *description,
2728 d.context = context;
2729 d.connection = connection;
2731 if (!_dbus_test_oom_handling (description, check_oom_check2_func,
2733 _dbus_assert_not_reached ("test failed");
2737 bus_dispatch_test (const DBusString *test_data_dir)
2739 BusContext *context;
2740 DBusConnection *foo;
2741 DBusConnection *bar;
2742 DBusConnection *baz;
2745 dbus_error_init (&error);
2747 context = bus_context_new_test (test_data_dir,
2748 "valid-config-files/debug-allow-all.conf");
2749 if (context == NULL)
2752 foo = dbus_connection_open ("debug-pipe:name=test-server", &error);
2754 _dbus_assert_not_reached ("could not alloc connection");
2756 if (!bus_setup_debug_client (foo))
2757 _dbus_assert_not_reached ("could not set up connection");
2759 if (!check_hello_message (context, foo))
2760 _dbus_assert_not_reached ("hello message failed");
2762 if (!check_add_match_all (context, foo))
2763 _dbus_assert_not_reached ("AddMatch message failed");
2765 bar = dbus_connection_open ("debug-pipe:name=test-server", &error);
2767 _dbus_assert_not_reached ("could not alloc connection");
2769 if (!bus_setup_debug_client (bar))
2770 _dbus_assert_not_reached ("could not set up connection");
2772 if (!check_hello_message (context, bar))
2773 _dbus_assert_not_reached ("hello message failed");
2775 if (!check_add_match_all (context, bar))
2776 _dbus_assert_not_reached ("AddMatch message failed");
2778 baz = dbus_connection_open ("debug-pipe:name=test-server", &error);
2780 _dbus_assert_not_reached ("could not alloc connection");
2782 if (!bus_setup_debug_client (baz))
2783 _dbus_assert_not_reached ("could not set up connection");
2785 if (!check_hello_message (context, baz))
2786 _dbus_assert_not_reached ("hello message failed");
2788 if (!check_add_match_all (context, baz))
2789 _dbus_assert_not_reached ("AddMatch message failed");
2791 if (!check_no_leftovers (context))
2793 _dbus_warn ("Messages were left over after setting up initial connections");
2794 _dbus_assert_not_reached ("initial connection setup failed");
2797 check1_try_iterations (context, "create_and_hello",
2798 check_hello_connection);
2800 check2_try_iterations (context, foo, "nonexistent_service_activation",
2801 check_nonexistent_service_activation);
2803 check2_try_iterations (context, foo, "segfault_service_activation",
2804 check_segfault_service_activation);
2806 check2_try_iterations (context, foo, "existent_service_activation",
2807 check_existent_service_activation);
2809 check2_try_iterations (context, foo, "nonexistent_service_auto_activation",
2810 check_nonexistent_service_auto_activation);
2812 check2_try_iterations (context, foo, "segfault_service_auto_activation",
2813 check_segfault_service_auto_activation);
2816 /* Note: need to resolve some issues with the testing code in order to run
2817 * this in oom (handle that we sometimes don't get replies back from the bus
2818 * when oom happens, without blocking the test).
2820 check2_try_iterations (context, foo, "existent_service_auto_activation",
2821 check_existent_service_auto_activation);
2824 if (!check_existent_service_auto_activation (context, foo))
2825 _dbus_assert_not_reached ("existent service auto activation failed");
2827 _dbus_verbose ("Disconnecting foo, bar, and baz\n");
2829 kill_client_connection_unchecked (foo);
2830 kill_client_connection_unchecked (bar);
2831 kill_client_connection_unchecked (baz);
2833 bus_context_unref (context);
2839 bus_dispatch_sha1_test (const DBusString *test_data_dir)
2841 BusContext *context;
2842 DBusConnection *foo;
2845 dbus_error_init (&error);
2847 /* Test SHA1 authentication */
2848 _dbus_verbose ("Testing SHA1 context\n");
2850 context = bus_context_new_test (test_data_dir,
2851 "valid-config-files/debug-allow-all-sha1.conf");
2852 if (context == NULL)
2855 foo = dbus_connection_open ("debug-pipe:name=test-server", &error);
2857 _dbus_assert_not_reached ("could not alloc connection");
2859 if (!bus_setup_debug_client (foo))
2860 _dbus_assert_not_reached ("could not set up connection");
2862 if (!check_hello_message (context, foo))
2863 _dbus_assert_not_reached ("hello message failed");
2865 if (!check_add_match_all (context, foo))
2866 _dbus_assert_not_reached ("addmatch message failed");
2868 if (!check_no_leftovers (context))
2870 _dbus_warn ("Messages were left over after setting up initial SHA-1 connection\n");
2871 _dbus_assert_not_reached ("initial connection setup failed");
2874 check1_try_iterations (context, "create_and_hello_sha1",
2875 check_hello_connection);
2877 kill_client_connection_unchecked (foo);
2879 bus_context_unref (context);
2884 #endif /* DBUS_BUILD_TESTS */