1 /* Integration tests for monitor-mode D-Bus connections
3 * Copyright © 2010-2011 Nokia Corporation
4 * Copyright © 2015 Collabora Ltd.
6 * Permission is hereby granted, free of charge, to any person
7 * obtaining a copy of this software and associated documentation files
8 * (the "Software"), to deal in the Software without restriction,
9 * including without limitation the rights to use, copy, modify, merge,
10 * publish, distribute, sublicense, and/or sell copies of the Software,
11 * and to permit persons to whom the Software is furnished to do so,
12 * subject to the following conditions:
14 * The above copyright notice and this permission notice shall be
15 * included in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
21 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
22 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31 #include "test-utils-glib.h"
34 const char *config_file;
35 const char * const *match_rules;
36 gboolean care_about_our_names;
48 DBusConnection *monitor;
49 DBusConnection *sender;
50 DBusConnection *recipient;
54 const char *monitor_name;
55 const char *sender_name;
56 const char *recipient_name;
58 DBusConnection *systemd;
59 const char *systemd_name;
60 DBusMessage *systemd_message;
61 DBusConnection *activated;
62 const char *activated_name;
63 DBusMessage *activated_message;
66 static const char * const no_match_rules[] = {
70 static const char * const wildcard_match_rules[] = {
76 static const char * const eavesdrop_match_rules[] = {
82 static const char * const no_eavesdrop_match_rules[] = {
88 static const char * const selective_match_rules[] = {
89 "interface='com.example.Interesting'",
90 "interface='com.example.Fun'",
95 static Config forbidding_config = {
96 "valid-config-files/forbidding.conf",
101 static Config wildcard_config = {
103 wildcard_match_rules,
107 static Config selective_config = {
109 selective_match_rules,
113 static Config no_rules_config = {
119 static Config eavesdrop_config = {
121 eavesdrop_match_rules,
125 static Config no_eavesdrop_config = {
127 no_eavesdrop_match_rules,
132 static Config fake_systemd_config = {
133 "valid-config-files/systemd-activation.conf",
139 static Config side_effects_config = {
145 static inline const char *
146 not_null2 (const char *x,
147 const char *fallback)
155 static inline const char *
156 not_null (const char *x)
158 return not_null2 (x, "(null)");
161 #define log_message(m) _log_message (m, __FILE__, __LINE__)
165 _log_message (DBusMessage *m,
169 g_test_message ("%s:%d: message type %d (%s)", file, line,
170 dbus_message_get_type (m),
171 dbus_message_type_to_string (dbus_message_get_type (m)));
172 g_test_message ("\tfrom: %s",
173 not_null2 (dbus_message_get_sender (m), "(dbus-daemon)"));
174 g_test_message ("\tto: %s",
175 not_null2 (dbus_message_get_destination (m), "(broadcast)"));
176 g_test_message ("\tpath: %s",
177 not_null (dbus_message_get_path (m)));
178 g_test_message ("\tinterface: %s",
179 not_null (dbus_message_get_interface (m)));
180 g_test_message ("\tmember: %s",
181 not_null (dbus_message_get_member (m)));
182 g_test_message ("\tsignature: %s",
183 not_null (dbus_message_get_signature (m)));
184 g_test_message ("\terror name: %s",
185 not_null (dbus_message_get_error_name (m)));
187 if (strcmp ("s", dbus_message_get_signature (m)) == 0)
189 DBusError e = DBUS_ERROR_INIT;
192 dbus_message_get_args (m, &e,
193 DBUS_TYPE_STRING, &s,
195 test_assert_no_error (&e);
196 g_test_message ("\tstring payload: %s", s);
200 /* these are macros so they get the right line number */
202 #define assert_hello(m) \
204 g_assert_cmpstr (dbus_message_type_to_string (dbus_message_get_type (m)), \
205 ==, dbus_message_type_to_string (DBUS_MESSAGE_TYPE_METHOD_CALL)); \
206 g_assert_cmpstr (dbus_message_get_destination (m), ==, DBUS_SERVICE_DBUS); \
207 g_assert_cmpstr (dbus_message_get_path (m), ==, DBUS_PATH_DBUS); \
208 g_assert_cmpstr (dbus_message_get_interface (m), ==, DBUS_INTERFACE_DBUS); \
209 g_assert_cmpstr (dbus_message_get_member (m), ==, "Hello"); \
210 g_assert_cmpstr (dbus_message_get_signature (m), ==, ""); \
211 g_assert_cmpint (dbus_message_get_serial (m), !=, 0); \
212 g_assert_cmpint (dbus_message_get_reply_serial (m), ==, 0); \
215 #define assert_hello_reply(m) \
217 DBusError _e = DBUS_ERROR_INIT; \
220 g_assert_cmpstr (dbus_message_type_to_string (dbus_message_get_type (m)), \
221 ==, dbus_message_type_to_string (DBUS_MESSAGE_TYPE_METHOD_RETURN)); \
222 g_assert_cmpstr (dbus_message_get_sender (m), ==, DBUS_SERVICE_DBUS); \
223 g_assert_cmpstr (dbus_message_get_path (m), ==, NULL); \
224 g_assert_cmpstr (dbus_message_get_interface (m), ==, NULL); \
225 g_assert_cmpstr (dbus_message_get_member (m), ==, NULL); \
226 g_assert_cmpstr (dbus_message_get_signature (m), ==, "s"); \
227 g_assert_cmpint (dbus_message_get_serial (m), !=, 0); \
228 g_assert_cmpint (dbus_message_get_reply_serial (m), !=, 0); \
230 dbus_message_get_args (m, &_e, \
231 DBUS_TYPE_STRING, &_s, \
232 DBUS_TYPE_INVALID); \
233 test_assert_no_error (&_e); \
234 g_assert_cmpstr (dbus_message_get_destination (m), ==, _s); \
237 #define assert_name_acquired(m) \
239 DBusError _e = DBUS_ERROR_INIT; \
242 g_assert_cmpstr (dbus_message_type_to_string (dbus_message_get_type (m)), \
243 ==, dbus_message_type_to_string (DBUS_MESSAGE_TYPE_SIGNAL)); \
244 g_assert_cmpstr (dbus_message_get_sender (m), ==, DBUS_SERVICE_DBUS); \
245 g_assert_cmpstr (dbus_message_get_path (m), ==, DBUS_PATH_DBUS); \
246 g_assert_cmpstr (dbus_message_get_interface (m), ==, DBUS_INTERFACE_DBUS); \
247 g_assert_cmpstr (dbus_message_get_member (m), ==, "NameAcquired"); \
248 g_assert_cmpstr (dbus_message_get_signature (m), ==, "s"); \
249 g_assert_cmpint (dbus_message_get_serial (m), !=, 0); \
250 g_assert_cmpint (dbus_message_get_reply_serial (m), ==, 0); \
252 dbus_message_get_args (m, &_e, \
253 DBUS_TYPE_STRING, &_s, \
254 DBUS_TYPE_INVALID); \
255 test_assert_no_error (&_e); \
256 g_assert_cmpstr (dbus_message_get_destination (m), ==, _s); \
259 #define assert_method_call(m, sender, \
260 destination, path, iface, method, signature) \
262 g_assert_cmpstr (dbus_message_type_to_string (dbus_message_get_type (m)), \
263 ==, dbus_message_type_to_string (DBUS_MESSAGE_TYPE_METHOD_CALL)); \
264 g_assert_cmpstr (dbus_message_get_sender (m), ==, sender); \
265 g_assert_cmpstr (dbus_message_get_destination (m), ==, destination); \
266 g_assert_cmpstr (dbus_message_get_path (m), ==, path); \
267 g_assert_cmpstr (dbus_message_get_interface (m), ==, iface); \
268 g_assert_cmpstr (dbus_message_get_member (m), ==, method); \
269 g_assert_cmpstr (dbus_message_get_signature (m), ==, signature); \
270 g_assert_cmpint (dbus_message_get_serial (m), !=, 0); \
271 g_assert_cmpint (dbus_message_get_reply_serial (m), ==, 0); \
274 #define assert_signal(m, \
275 sender, path, iface, member, signature, \
278 g_assert_cmpstr (dbus_message_type_to_string (dbus_message_get_type (m)), \
279 ==, dbus_message_type_to_string (DBUS_MESSAGE_TYPE_SIGNAL)); \
280 g_assert_cmpstr (dbus_message_get_sender (m), ==, sender); \
281 g_assert_cmpstr (dbus_message_get_destination (m), ==, destination); \
282 g_assert_cmpstr (dbus_message_get_path (m), ==, path); \
283 g_assert_cmpstr (dbus_message_get_interface (m), ==, iface); \
284 g_assert_cmpstr (dbus_message_get_member (m), ==, member); \
285 g_assert_cmpstr (dbus_message_get_signature (m), ==, signature); \
286 g_assert_cmpint (dbus_message_get_serial (m), !=, 0); \
287 g_assert_cmpint (dbus_message_get_reply_serial (m), ==, 0); \
290 #define assert_method_reply(m, sender, destination, signature) \
292 g_assert_cmpstr (dbus_message_type_to_string (dbus_message_get_type (m)), \
293 ==, dbus_message_type_to_string (DBUS_MESSAGE_TYPE_METHOD_RETURN)); \
294 g_assert_cmpstr (dbus_message_get_sender (m), ==, sender); \
295 g_assert_cmpstr (dbus_message_get_destination (m), ==, destination); \
296 g_assert_cmpstr (dbus_message_get_path (m), ==, NULL); \
297 g_assert_cmpstr (dbus_message_get_interface (m), ==, NULL); \
298 g_assert_cmpstr (dbus_message_get_member (m), ==, NULL); \
299 g_assert_cmpstr (dbus_message_get_signature (m), ==, signature); \
300 g_assert_cmpint (dbus_message_get_serial (m), !=, 0); \
301 g_assert_cmpint (dbus_message_get_reply_serial (m), !=, 0); \
304 #define assert_error_reply(m, sender, destination, error_name) \
306 g_assert_cmpstr (dbus_message_type_to_string (dbus_message_get_type (m)), \
307 ==, dbus_message_type_to_string (DBUS_MESSAGE_TYPE_ERROR)); \
308 g_assert_cmpstr (dbus_message_get_sender (m), ==, sender); \
309 g_assert_cmpstr (dbus_message_get_destination (m), ==, destination); \
310 g_assert_cmpstr (dbus_message_get_error_name (m), ==, error_name); \
311 g_assert_cmpstr (dbus_message_get_path (m), ==, NULL); \
312 g_assert_cmpstr (dbus_message_get_interface (m), ==, NULL); \
313 g_assert_cmpstr (dbus_message_get_member (m), ==, NULL); \
314 g_assert_cmpstr (dbus_message_get_signature (m), ==, "s"); \
315 g_assert_cmpint (dbus_message_get_serial (m), !=, 0); \
316 g_assert_cmpint (dbus_message_get_reply_serial (m), !=, 0); \
319 /* This is called after processing pending replies to our own method
320 * calls, but before anything else.
322 static DBusHandlerResult
323 monitor_filter (DBusConnection *connection,
324 DBusMessage *message,
327 Fixture *f = user_data;
329 g_assert_cmpstr (dbus_message_get_interface (message), !=,
330 "com.example.Tedious");
332 /* we are not interested in the monitor getting NameAcquired or NameLost
334 if (f->config == NULL || !f->config->care_about_our_names)
336 if (dbus_message_is_signal (message, DBUS_INTERFACE_DBUS,
338 dbus_message_is_signal (message, DBUS_INTERFACE_DBUS,
341 DBusError e = DBUS_ERROR_INIT;
344 dbus_message_get_args (message, &e,
345 DBUS_TYPE_STRING, &s,
347 test_assert_no_error (&e);
349 if (strcmp (s, f->monitor_name) == 0)
352 return DBUS_HANDLER_RESULT_HANDLED;
357 g_queue_push_tail (&f->monitored, dbus_message_ref (message));
359 return DBUS_HANDLER_RESULT_HANDLED;
362 static DBusHandlerResult
363 recipient_filter (DBusConnection *connection,
364 DBusMessage *message,
367 g_assert_cmpstr (dbus_message_get_interface (message), !=,
368 "com.example.CannotSend");
369 g_assert_cmpstr (dbus_message_get_interface (message), !=,
370 "com.example.CannotReceive");
372 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
375 static DBusHandlerResult
376 systemd_filter (DBusConnection *connection,
377 DBusMessage *message,
380 Fixture *f = user_data;
382 if (dbus_message_is_signal (message, DBUS_INTERFACE_DBUS,
384 dbus_message_is_signal (message, DBUS_INTERFACE_DBUS,
387 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
390 g_assert (f->systemd_message == NULL);
391 f->systemd_message = dbus_message_ref (message);
393 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
396 static DBusHandlerResult
397 activated_filter (DBusConnection *connection,
398 DBusMessage *message,
401 Fixture *f = user_data;
403 if (dbus_message_is_signal (message, DBUS_INTERFACE_DBUS,
405 dbus_message_is_signal (message, DBUS_INTERFACE_DBUS,
408 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
411 g_assert (f->activated_message == NULL);
412 f->activated_message = dbus_message_ref (message);
414 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
419 gconstpointer context)
423 f->ctx = test_main_context_get ();
426 dbus_error_init (&f->e);
428 f->address = test_get_dbus_daemon (f->config ? f->config->config_file : NULL,
429 TEST_USER_ME, &f->daemon_pid);
431 if (f->address == NULL)
434 f->monitor = test_connect_to_bus (f->ctx, f->address);
435 f->monitor_name = dbus_bus_get_unique_name (f->monitor);
436 f->sender = test_connect_to_bus (f->ctx, f->address);
437 f->sender_name = dbus_bus_get_unique_name (f->sender);
438 f->recipient = test_connect_to_bus (f->ctx, f->address);
439 f->recipient_name = dbus_bus_get_unique_name (f->recipient);
441 if (!dbus_connection_add_filter (f->monitor, monitor_filter, f, NULL))
444 if (!dbus_connection_add_filter (f->recipient, recipient_filter, f, NULL))
449 become_monitor (Fixture *f)
454 DBusMessageIter appender, array_appender;
455 const char * const *match_rules;
457 dbus_uint32_t zero = 0;
459 dbus_connection_set_route_peer_messages (f->monitor, TRUE);
461 if (f->config != NULL && f->config->match_rules != NULL)
462 match_rules = f->config->match_rules;
464 match_rules = wildcard_match_rules;
466 m = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
467 DBUS_PATH_DBUS, DBUS_INTERFACE_MONITORING, "BecomeMonitor");
472 dbus_message_iter_init_append (m, &appender);
474 if (!dbus_message_iter_open_container (&appender, DBUS_TYPE_ARRAY, "s",
478 for (i = 0; match_rules[i] != NULL; i++)
480 if (!dbus_message_iter_append_basic (&array_appender, DBUS_TYPE_STRING,
485 if (!dbus_message_iter_close_container (&appender, &array_appender) ||
486 !dbus_message_iter_append_basic (&appender, DBUS_TYPE_UINT32, &zero))
489 if (!dbus_connection_send_with_reply (f->monitor, m, &pc,
490 DBUS_TIMEOUT_USE_DEFAULT) ||
494 dbus_message_unref (m);
497 if (dbus_pending_call_get_completed (pc))
498 test_pending_call_store_reply (pc, &m);
499 else if (!dbus_pending_call_set_notify (pc, test_pending_call_store_reply,
504 test_main_context_iterate (f->ctx, TRUE);
506 ok = dbus_message_get_args (m, &f->e,
508 test_assert_no_error (&f->e);
511 dbus_pending_call_unref (pc);
512 dbus_message_unref (m);
517 * Test what happens if the method call arguments are invalid.
520 test_invalid (Fixture *f,
521 gconstpointer context)
526 DBusMessageIter appender, array_appender;
527 dbus_uint32_t zero = 0;
528 dbus_uint32_t invalid_flags = G_MAXUINT32;
531 if (f->address == NULL)
534 dbus_connection_set_route_peer_messages (f->monitor, TRUE);
536 /* Try to become a monitor but specify nonzero flags - not allowed */
538 m = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
539 DBUS_PATH_DBUS, DBUS_INTERFACE_MONITORING, "BecomeMonitor");
544 dbus_message_iter_init_append (m, &appender);
546 if (!dbus_message_iter_open_container (&appender, DBUS_TYPE_ARRAY, "s",
550 if (!dbus_message_iter_close_container (&appender, &array_appender) ||
551 !dbus_message_iter_append_basic (&appender, DBUS_TYPE_UINT32,
555 if (!dbus_connection_send_with_reply (f->monitor, m, &pc,
556 DBUS_TIMEOUT_USE_DEFAULT) ||
560 dbus_message_unref (m);
563 if (dbus_pending_call_get_completed (pc))
564 test_pending_call_store_reply (pc, &m);
565 else if (!dbus_pending_call_set_notify (pc, test_pending_call_store_reply,
570 test_main_context_iterate (f->ctx, TRUE);
572 g_assert_cmpint (dbus_message_get_type (m), ==, DBUS_MESSAGE_TYPE_ERROR);
573 g_assert_cmpstr (dbus_message_get_error_name (m), ==,
574 DBUS_ERROR_INVALID_ARGS);
576 /* Try to become a monitor but specify a bad match rule -
577 * also not allowed */
579 dbus_pending_call_unref (pc);
580 dbus_message_unref (m);
582 m = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
583 DBUS_PATH_DBUS, DBUS_INTERFACE_MONITORING, "BecomeMonitor");
588 dbus_message_iter_init_append (m, &appender);
590 if (!dbus_message_iter_open_container (&appender, DBUS_TYPE_ARRAY, "s",
594 /* Syntactically incorrect match rule taken from #92298 - was probably
595 * intended to be path='/modules/...'
597 s = "interface='org.kde.walletd',member='/modules/kwalletd/org.kde.KWallet/walletOpened'";
599 if (!dbus_message_iter_append_basic (&array_appender, DBUS_TYPE_STRING,
601 !dbus_message_iter_close_container (&appender, &array_appender) ||
602 !dbus_message_iter_append_basic (&appender, DBUS_TYPE_UINT32, &zero) ||
603 !dbus_connection_send_with_reply (f->monitor, m, &pc,
604 DBUS_TIMEOUT_USE_DEFAULT) ||
608 dbus_message_unref (m);
611 if (dbus_pending_call_get_completed (pc))
612 test_pending_call_store_reply (pc, &m);
613 else if (!dbus_pending_call_set_notify (pc, test_pending_call_store_reply,
618 test_main_context_iterate (f->ctx, TRUE);
620 g_assert_cmpint (dbus_message_get_type (m), ==, DBUS_MESSAGE_TYPE_ERROR);
621 g_assert_cmpstr (dbus_message_get_error_name (m), ==,
622 DBUS_ERROR_MATCH_RULE_INVALID);
624 dbus_pending_call_unref (pc);
625 dbus_message_unref (m);
627 /* We did not become a monitor, so we can still call methods. */
630 m = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
631 DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS, "GetId");
636 if (!dbus_connection_send_with_reply (f->monitor, m, &pc,
637 DBUS_TIMEOUT_USE_DEFAULT) ||
641 dbus_message_unref (m);
644 if (dbus_pending_call_get_completed (pc))
645 test_pending_call_store_reply (pc, &m);
646 else if (!dbus_pending_call_set_notify (pc, test_pending_call_store_reply,
651 test_main_context_iterate (f->ctx, TRUE);
653 ok = dbus_message_get_args (m, &f->e,
654 DBUS_TYPE_STRING, &s,
656 test_assert_no_error (&f->e);
658 g_assert_cmpstr (s, !=, NULL);
659 g_assert_cmpstr (s, !=, "");
661 dbus_pending_call_unref (pc);
662 dbus_message_unref (m);
666 * Test the side-effects of becoming a monitor.
669 test_become_monitor (Fixture *f,
670 gconstpointer context)
674 dbus_bool_t got_unique = FALSE, got_a = FALSE, got_b = FALSE, got_c = FALSE;
675 dbus_bool_t lost_unique = FALSE, lost_a = FALSE, lost_b = FALSE, lost_c = FALSE;
677 if (f->address == NULL)
680 ret = dbus_bus_request_name (f->monitor, "com.example.A",
681 DBUS_NAME_FLAG_DO_NOT_QUEUE, &f->e);
682 test_assert_no_error (&f->e);
683 g_assert_cmpint (ret, ==, DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER);
685 ret = dbus_bus_request_name (f->monitor, "com.example.B",
686 DBUS_NAME_FLAG_DO_NOT_QUEUE, &f->e);
687 test_assert_no_error (&f->e);
688 g_assert_cmpint (ret, ==, DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER);
690 ret = dbus_bus_request_name (f->monitor, "com.example.C",
691 DBUS_NAME_FLAG_DO_NOT_QUEUE, &f->e);
692 test_assert_no_error (&f->e);
693 g_assert_cmpint (ret, ==, DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER);
695 while (!got_unique || !got_a || !got_b || !got_c)
697 if (g_queue_is_empty (&f->monitored))
698 test_main_context_iterate (f->ctx, TRUE);
700 while ((m = g_queue_pop_head (&f->monitored)) != NULL)
702 if (dbus_message_is_signal (m, DBUS_INTERFACE_DBUS,
706 dbus_bool_t ok = dbus_message_get_args (m, &f->e,
707 DBUS_TYPE_STRING, &name,
710 g_assert_cmpstr (dbus_message_get_path (m), ==,
713 test_assert_no_error (&f->e);
716 if (g_str_equal (name, f->monitor_name))
718 g_assert (!got_unique);
721 else if (g_str_equal (name, "com.example.A"))
726 else if (g_str_equal (name, "com.example.B"))
733 g_assert_cmpstr (name, ==, "com.example.C");
740 g_error ("unexpected message %s.%s",
741 dbus_message_get_interface (m),
742 dbus_message_get_member (m));
745 dbus_message_unref (m);
751 while (!lost_unique || !lost_a || !lost_b || !lost_c)
753 if (g_queue_is_empty (&f->monitored))
754 test_main_context_iterate (f->ctx, TRUE);
756 while ((m = g_queue_pop_head (&f->monitored)) != NULL)
758 if (dbus_message_is_signal (m, DBUS_INTERFACE_DBUS,
762 dbus_bool_t ok = dbus_message_get_args (m, &f->e,
763 DBUS_TYPE_STRING, &name,
766 test_assert_no_error (&f->e);
769 if (g_str_equal (name, f->monitor_name))
771 g_assert (!lost_unique);
774 else if (g_str_equal (name, "com.example.A"))
779 else if (g_str_equal (name, "com.example.B"))
786 g_assert_cmpstr (name, ==, "com.example.C");
793 g_error ("unexpected message %s.%s",
794 dbus_message_get_interface (m),
795 dbus_message_get_member (m));
798 dbus_message_unref (m);
802 /* Calling methods is forbidden; we get disconnected. */
803 dbus_bus_add_match (f->monitor, "", &f->e);
804 g_assert_cmpstr (f->e.name, ==, DBUS_ERROR_NO_REPLY);
805 g_assert (!dbus_connection_get_is_connected (f->monitor));
809 if (g_queue_is_empty (&f->monitored))
810 test_main_context_iterate (f->ctx, TRUE);
812 /* When we iterate all the connection's messages, we see ourselves
813 * losing all our names, then we're disconnected. */
814 while ((m = g_queue_pop_head (&f->monitored)) != NULL)
816 if (dbus_message_is_signal (m, DBUS_INTERFACE_LOCAL, "Disconnected"))
818 dbus_message_unref (m);
823 g_error ("unexpected message %s.%s",
824 dbus_message_get_interface (m),
825 dbus_message_get_member (m));
828 dbus_message_unref (m);
840 test_broadcast (Fixture *f,
841 gconstpointer context)
845 if (f->address == NULL)
848 dbus_bus_add_match (f->recipient, "type='signal'", &f->e);
849 test_assert_no_error (&f->e);
853 m = dbus_message_new_signal ("/foo", "com.example.bar", "BroadcastSignal1");
854 dbus_connection_send (f->sender, m, NULL);
855 dbus_message_unref (m);
857 m = dbus_message_new_signal ("/foo", "com.example.bar", "BroadcastSignal2");
858 dbus_connection_send (f->sender, m, NULL);
859 dbus_message_unref (m);
861 m = dbus_message_new_signal ("/foo", "com.example.bar", "BroadcastSignal3");
862 dbus_connection_send (f->sender, m, NULL);
863 dbus_message_unref (m);
865 while (g_queue_get_length (&f->monitored) < 3)
866 test_main_context_iterate (f->ctx, TRUE);
868 m = g_queue_pop_head (&f->monitored);
869 assert_signal (m, f->sender_name, "/foo", "com.example.bar",
870 "BroadcastSignal1", "", NULL);
871 dbus_message_unref (m);
873 m = g_queue_pop_head (&f->monitored);
874 assert_signal (m, f->sender_name, "/foo", "com.example.bar",
875 "BroadcastSignal2", "", NULL);
876 dbus_message_unref (m);
878 m = g_queue_pop_head (&f->monitored);
879 assert_signal (m, f->sender_name, "/foo", "com.example.bar",
880 "BroadcastSignal3", "", NULL);
881 dbus_message_unref (m);
883 m = g_queue_pop_head (&f->monitored);
884 g_assert (m == NULL);
888 test_forbidden_broadcast (Fixture *f,
889 gconstpointer context)
893 if (f->address == NULL)
896 dbus_bus_add_match (f->recipient, "type='signal'", &f->e);
897 test_assert_no_error (&f->e);
901 m = dbus_message_new_signal ("/foo", "com.example.CannotSend",
903 dbus_connection_send (f->sender, m, NULL);
904 dbus_message_unref (m);
906 m = dbus_message_new_signal ("/foo", "com.example.CannotReceive",
908 dbus_connection_send (f->sender, m, NULL);
909 dbus_message_unref (m);
911 m = dbus_message_new_signal ("/foo", "com.example.CannotSend",
913 dbus_connection_send (f->sender, m, NULL);
914 dbus_message_unref (m);
916 while (g_queue_get_length (&f->monitored) < 6)
917 test_main_context_iterate (f->ctx, TRUE);
919 m = g_queue_pop_head (&f->monitored);
920 assert_signal (m, f->sender_name, "/foo", "com.example.CannotSend",
921 "BroadcastSignal1", "", NULL);
922 dbus_message_unref (m);
924 m = g_queue_pop_head (&f->monitored);
925 assert_error_reply (m, DBUS_SERVICE_DBUS, f->sender_name,
926 DBUS_ERROR_ACCESS_DENIED);
927 dbus_message_unref (m);
929 m = g_queue_pop_head (&f->monitored);
930 assert_signal (m, f->sender_name, "/foo", "com.example.CannotReceive",
931 "BroadcastSignal2", "", NULL);
932 dbus_message_unref (m);
934 m = g_queue_pop_head (&f->monitored);
935 assert_error_reply (m, DBUS_SERVICE_DBUS, f->sender_name,
936 DBUS_ERROR_ACCESS_DENIED);
937 dbus_message_unref (m);
939 m = g_queue_pop_head (&f->monitored);
940 assert_signal (m, f->sender_name, "/foo", "com.example.CannotSend",
941 "BroadcastSignal3", "", NULL);
942 dbus_message_unref (m);
944 m = g_queue_pop_head (&f->monitored);
945 assert_error_reply (m, DBUS_SERVICE_DBUS, f->sender_name,
946 DBUS_ERROR_ACCESS_DENIED);
947 dbus_message_unref (m);
949 m = g_queue_pop_head (&f->monitored);
950 g_assert (m == NULL);
954 test_unicast_signal (Fixture *f,
955 gconstpointer context)
959 if (f->address == NULL)
964 m = dbus_message_new_signal ("/foo", "com.example.bar", "UnicastSignal1");
965 if (!dbus_message_set_destination (m, f->recipient_name))
967 dbus_connection_send (f->sender, m, NULL);
968 dbus_message_unref (m);
970 m = dbus_message_new_signal ("/foo", "com.example.bar", "UnicastSignal2");
971 if (!dbus_message_set_destination (m, f->recipient_name))
973 dbus_connection_send (f->sender, m, NULL);
974 dbus_message_unref (m);
976 m = dbus_message_new_signal ("/foo", "com.example.bar", "UnicastSignal3");
977 if (!dbus_message_set_destination (m, f->recipient_name))
979 dbus_connection_send (f->sender, m, NULL);
980 dbus_message_unref (m);
982 while (g_queue_get_length (&f->monitored) < 3)
983 test_main_context_iterate (f->ctx, TRUE);
985 m = g_queue_pop_head (&f->monitored);
986 assert_signal (m, f->sender_name, "/foo",
987 "com.example.bar", "UnicastSignal1", "", f->recipient_name);
988 dbus_message_unref (m);
990 m = g_queue_pop_head (&f->monitored);
991 assert_signal (m, f->sender_name, "/foo",
992 "com.example.bar", "UnicastSignal2", "", f->recipient_name);
993 dbus_message_unref (m);
995 m = g_queue_pop_head (&f->monitored);
996 assert_signal (m, f->sender_name, "/foo",
997 "com.example.bar", "UnicastSignal3", "", f->recipient_name);
998 dbus_message_unref (m);
1000 m = g_queue_pop_head (&f->monitored);
1001 g_assert (m == NULL);
1005 test_forbidden (Fixture *f,
1006 gconstpointer context)
1010 if (f->address == NULL)
1015 m = dbus_message_new_signal ("/foo", "com.example.CannotSend",
1017 if (!dbus_message_set_destination (m, f->recipient_name))
1019 dbus_connection_send (f->sender, m, NULL);
1020 dbus_message_unref (m);
1022 m = dbus_message_new_signal ("/foo", "com.example.CannotReceive",
1024 if (!dbus_message_set_destination (m, f->recipient_name))
1026 dbus_connection_send (f->sender, m, NULL);
1027 dbus_message_unref (m);
1029 m = dbus_message_new_signal ("/foo", "com.example.CannotSend",
1031 if (!dbus_message_set_destination (m, f->recipient_name))
1033 dbus_connection_send (f->sender, m, NULL);
1034 dbus_message_unref (m);
1036 while (g_queue_get_length (&f->monitored) < 6)
1037 test_main_context_iterate (f->ctx, TRUE);
1039 m = g_queue_pop_head (&f->monitored);
1040 assert_signal (m, f->sender_name, "/foo",
1041 "com.example.CannotSend", "UnicastSignal1", "", f->recipient_name);
1042 dbus_message_unref (m);
1044 m = g_queue_pop_head (&f->monitored);
1045 assert_error_reply (m, DBUS_SERVICE_DBUS, f->sender_name,
1046 DBUS_ERROR_ACCESS_DENIED);
1047 dbus_message_unref (m);
1049 m = g_queue_pop_head (&f->monitored);
1050 assert_signal (m, f->sender_name, "/foo",
1051 "com.example.CannotReceive", "UnicastSignal2", "", f->recipient_name);
1052 dbus_message_unref (m);
1054 m = g_queue_pop_head (&f->monitored);
1055 assert_error_reply (m, DBUS_SERVICE_DBUS, f->sender_name,
1056 DBUS_ERROR_ACCESS_DENIED);
1057 dbus_message_unref (m);
1059 m = g_queue_pop_head (&f->monitored);
1060 assert_signal (m, f->sender_name, "/foo",
1061 "com.example.CannotSend", "UnicastSignal3", "", f->recipient_name);
1062 dbus_message_unref (m);
1064 m = g_queue_pop_head (&f->monitored);
1065 assert_error_reply (m, DBUS_SERVICE_DBUS, f->sender_name,
1066 DBUS_ERROR_ACCESS_DENIED);
1067 dbus_message_unref (m);
1069 m = g_queue_pop_head (&f->monitored);
1070 g_assert (m == NULL);
1074 test_method_call (Fixture *f,
1075 gconstpointer context)
1079 if (f->address == NULL)
1084 /* regression test for
1085 * https://bugs.freedesktop.org/show_bug.cgi?id=90952 */
1086 m = dbus_message_new_method_call (f->recipient_name, "/foo",
1087 DBUS_INTERFACE_PEER, "Ping");
1088 dbus_connection_send (f->sender, m, NULL);
1089 dbus_message_unref (m);
1091 while (g_queue_get_length (&f->monitored) < 2)
1092 test_main_context_iterate (f->ctx, TRUE);
1094 m = g_queue_pop_head (&f->monitored);
1095 assert_method_call (m, f->sender_name, f->recipient_name, "/foo",
1096 DBUS_INTERFACE_PEER, "Ping", "");
1097 dbus_message_unref (m);
1099 m = g_queue_pop_head (&f->monitored);
1100 assert_method_reply (m, f->recipient_name, f->sender_name, "");
1101 dbus_message_unref (m);
1103 m = g_queue_pop_head (&f->monitored);
1104 g_assert (m == NULL);
1106 m = dbus_message_new_method_call (f->recipient_name, "/foo", "com.example.bar",
1108 dbus_connection_send (f->sender, m, NULL);
1109 dbus_message_unref (m);
1111 while (g_queue_get_length (&f->monitored) < 2)
1112 test_main_context_iterate (f->ctx, TRUE);
1114 m = g_queue_pop_head (&f->monitored);
1115 assert_method_call (m, f->sender_name, f->recipient_name, "/foo",
1116 "com.example.bar", "Call1", "");
1117 dbus_message_unref (m);
1119 m = g_queue_pop_head (&f->monitored);
1120 assert_error_reply (m, f->recipient_name, f->sender_name,
1121 DBUS_ERROR_UNKNOWN_METHOD);
1122 dbus_message_unref (m);
1124 m = g_queue_pop_head (&f->monitored);
1125 g_assert (m == NULL);
1129 test_forbidden_method_call (Fixture *f,
1130 gconstpointer context)
1134 if (f->address == NULL)
1139 m = dbus_message_new_method_call (f->recipient_name, "/foo",
1140 "com.example.CannotSend", "Call1");
1141 dbus_connection_send (f->sender, m, NULL);
1142 dbus_message_unref (m);
1144 while (g_queue_get_length (&f->monitored) < 2)
1145 test_main_context_iterate (f->ctx, TRUE);
1147 m = g_queue_pop_head (&f->monitored);
1148 assert_method_call (m, f->sender_name, f->recipient_name, "/foo",
1149 "com.example.CannotSend", "Call1", "");
1150 dbus_message_unref (m);
1152 m = g_queue_pop_head (&f->monitored);
1153 assert_error_reply (m, DBUS_SERVICE_DBUS, f->sender_name,
1154 DBUS_ERROR_ACCESS_DENIED);
1155 dbus_message_unref (m);
1157 m = g_queue_pop_head (&f->monitored);
1158 g_assert (m == NULL);
1160 m = dbus_message_new_method_call (f->recipient_name, "/foo",
1161 "com.example.CannotReceive", "Call2");
1162 dbus_connection_send (f->sender, m, NULL);
1163 dbus_message_unref (m);
1165 while (g_queue_get_length (&f->monitored) < 2)
1166 test_main_context_iterate (f->ctx, TRUE);
1168 m = g_queue_pop_head (&f->monitored);
1169 assert_method_call (m, f->sender_name, f->recipient_name, "/foo",
1170 "com.example.CannotReceive", "Call2", "");
1171 dbus_message_unref (m);
1173 m = g_queue_pop_head (&f->monitored);
1174 assert_error_reply (m, DBUS_SERVICE_DBUS, f->sender_name,
1175 DBUS_ERROR_ACCESS_DENIED);
1176 dbus_message_unref (m);
1178 m = g_queue_pop_head (&f->monitored);
1179 g_assert (m == NULL);
1183 test_dbus_daemon (Fixture *f,
1184 gconstpointer context)
1189 if (f->address == NULL)
1194 res = dbus_bus_request_name (f->sender, "com.example.Sender",
1195 DBUS_NAME_FLAG_DO_NOT_QUEUE, &f->e);
1196 test_assert_no_error (&f->e);
1197 g_assert_cmpint (res, ==, DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER);
1199 res = dbus_bus_release_name (f->sender, "com.example.Sender", &f->e);
1200 test_assert_no_error (&f->e);
1201 g_assert_cmpint (res, ==, DBUS_RELEASE_NAME_REPLY_RELEASED);
1203 while (g_queue_get_length (&f->monitored) < 8)
1204 test_main_context_iterate (f->ctx, TRUE);
1206 m = g_queue_pop_head (&f->monitored);
1207 assert_method_call (m, f->sender_name, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS,
1208 DBUS_INTERFACE_DBUS, "RequestName", "su");
1209 dbus_message_unref (m);
1211 m = g_queue_pop_head (&f->monitored);
1212 assert_signal (m, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS,
1213 "NameOwnerChanged", "sss", NULL);
1214 dbus_message_unref (m);
1216 /* FIXME: should we get this? */
1217 m = g_queue_pop_head (&f->monitored);
1218 assert_signal (m, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS,
1219 "NameAcquired", "s", f->sender_name);
1220 dbus_message_unref (m);
1222 m = g_queue_pop_head (&f->monitored);
1223 assert_method_reply (m, DBUS_SERVICE_DBUS, f->sender_name, "u");
1224 dbus_message_unref (m);
1226 m = g_queue_pop_head (&f->monitored);
1227 assert_method_call (m, f->sender_name, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS,
1228 DBUS_INTERFACE_DBUS, "ReleaseName", "s");
1229 dbus_message_unref (m);
1231 /* FIXME: should we get this? */
1232 m = g_queue_pop_head (&f->monitored);
1233 assert_signal (m, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS,
1234 "NameLost", "s", f->sender_name);
1235 dbus_message_unref (m);
1237 m = g_queue_pop_head (&f->monitored);
1238 assert_signal (m, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS,
1239 "NameOwnerChanged", "sss", NULL);
1240 dbus_message_unref (m);
1242 m = g_queue_pop_head (&f->monitored);
1243 assert_method_reply (m, DBUS_SERVICE_DBUS, f->sender_name, "u");
1244 dbus_message_unref (m);
1246 m = g_queue_pop_head (&f->monitored);
1247 g_assert (m == NULL);
1251 test_selective (Fixture *f,
1252 gconstpointer context)
1256 if (f->address == NULL)
1259 /* Match rules added before becoming a monitor should be cleared:
1260 * if they weren't, this test would get Interesting twice, then Tedious,
1261 * and only see Fun after that. */
1262 dbus_bus_add_match (f->monitor,
1263 "eavesdrop='true',interface='com.example.Interesting'", &f->e);
1264 test_assert_no_error (&f->e);
1265 dbus_bus_add_match (f->monitor,
1266 "eavesdrop='true',interface='com.example.Tedious'", &f->e);
1267 test_assert_no_error (&f->e);
1271 m = dbus_message_new_signal ("/foo", "com.example.Interesting",
1273 if (!dbus_message_set_destination (m, f->recipient_name))
1275 dbus_connection_send (f->sender, m, NULL);
1276 dbus_message_unref (m);
1278 m = dbus_message_new_signal ("/foo", "com.example.Tedious",
1280 if (!dbus_message_set_destination (m, f->recipient_name))
1282 dbus_connection_send (f->sender, m, NULL);
1283 dbus_message_unref (m);
1285 m = dbus_message_new_signal ("/foo", "com.example.Fun",
1287 if (!dbus_message_set_destination (m, f->recipient_name))
1289 dbus_connection_send (f->sender, m, NULL);
1290 dbus_message_unref (m);
1292 while (g_queue_get_length (&f->monitored) < 2)
1293 test_main_context_iterate (f->ctx, TRUE);
1295 /* We get the interesting signal and the fun signal, but not the tedious
1298 m = g_queue_pop_head (&f->monitored);
1299 assert_signal (m, f->sender_name, "/foo",
1300 "com.example.Interesting", "UnicastSignal1", "", f->recipient_name);
1301 dbus_message_unref (m);
1303 m = g_queue_pop_head (&f->monitored);
1304 assert_signal (m, f->sender_name, "/foo",
1305 "com.example.Fun", "UnicastSignal3", "", f->recipient_name);
1306 dbus_message_unref (m);
1308 m = g_queue_pop_head (&f->monitored);
1309 g_assert (m == NULL);
1313 /* currently only used for the systemd activation test */
1315 expect_new_connection (Fixture *f)
1319 while (g_queue_get_length (&f->monitored) < 4)
1320 test_main_context_iterate (f->ctx, TRUE);
1322 m = g_queue_pop_head (&f->monitored);
1324 dbus_message_unref (m);
1326 m = g_queue_pop_head (&f->monitored);
1327 assert_hello_reply (m);
1328 dbus_message_unref (m);
1330 m = g_queue_pop_head (&f->monitored);
1331 assert_signal (m, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS,
1332 "NameOwnerChanged", "sss", NULL);
1333 dbus_message_unref (m);
1335 m = g_queue_pop_head (&f->monitored);
1336 assert_name_acquired (m);
1337 dbus_message_unref (m);
1340 /* currently only used for the systemd activation test */
1342 take_well_known_name (Fixture *f,
1343 DBusConnection *connection,
1348 ret = dbus_bus_request_name (connection, name,
1349 DBUS_NAME_FLAG_DO_NOT_QUEUE, &f->e);
1350 test_assert_no_error (&f->e);
1351 g_assert_cmpint (ret, ==, DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER);
1354 /* currently only used for the systemd activation test */
1356 expect_take_well_known_name (Fixture *f,
1357 DBusConnection *connection,
1361 const char *connection_name = dbus_bus_get_unique_name (connection);
1363 while (g_queue_get_length (&f->monitored) < 4)
1364 test_main_context_iterate (f->ctx, TRUE);
1366 m = g_queue_pop_head (&f->monitored);
1367 assert_method_call (m, connection_name, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS,
1368 DBUS_INTERFACE_DBUS, "RequestName", "su");
1369 dbus_message_unref (m);
1371 m = g_queue_pop_head (&f->monitored);
1372 assert_signal (m, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS,
1373 "NameOwnerChanged", "sss", NULL);
1374 dbus_message_unref (m);
1376 m = g_queue_pop_head (&f->monitored);
1377 assert_signal (m, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS,
1378 "NameAcquired", "s", connection_name);
1379 dbus_message_unref (m);
1381 m = g_queue_pop_head (&f->monitored);
1382 assert_method_reply (m, DBUS_SERVICE_DBUS, connection_name, "u");
1383 dbus_message_unref (m);
1387 test_activation (Fixture *f,
1388 gconstpointer context)
1392 if (f->address == NULL)
1397 /* The sender sends a message to an activatable service. */
1398 m = dbus_message_new_signal ("/foo", "com.example.bar", "UnicastSignal1");
1399 if (!dbus_message_set_destination (m, "com.example.SystemdActivatable1"))
1401 dbus_connection_send (f->sender, m, NULL);
1402 dbus_message_unref (m);
1404 /* We observe the activation request, and the message that caused it,
1405 * before systemd has even joined the bus. */
1406 while (g_queue_get_length (&f->monitored) < 2)
1407 test_main_context_iterate (f->ctx, TRUE);
1409 m = g_queue_pop_head (&f->monitored);
1410 assert_signal (m, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS,
1411 "org.freedesktop.systemd1.Activator", "ActivationRequest", "s",
1412 "org.freedesktop.systemd1");
1413 dbus_message_unref (m);
1414 m = g_queue_pop_head (&f->monitored);
1415 assert_signal (m, f->sender_name, "/foo",
1416 "com.example.bar", "UnicastSignal1", "",
1417 "com.example.SystemdActivatable1");
1418 dbus_message_unref (m);
1420 /* The fake systemd connects to the bus. */
1421 f->systemd = test_connect_to_bus (f->ctx, f->address);
1422 if (!dbus_connection_add_filter (f->systemd, systemd_filter, f, NULL))
1424 f->systemd_name = dbus_bus_get_unique_name (f->systemd);
1426 expect_new_connection (f);
1427 take_well_known_name (f, f->systemd, "org.freedesktop.systemd1");
1428 expect_take_well_known_name (f, f->systemd, "org.freedesktop.systemd1");
1430 /* It gets its activation request. */
1431 while (f->systemd_message == NULL)
1432 test_main_context_iterate (f->ctx, TRUE);
1434 m = f->systemd_message;
1435 f->systemd_message = NULL;
1436 assert_signal (m, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS,
1437 "org.freedesktop.systemd1.Activator", "ActivationRequest", "s",
1438 "org.freedesktop.systemd1");
1439 dbus_message_unref (m);
1441 /* systemd starts the activatable service. */
1442 f->activated = test_connect_to_bus (f->ctx, f->address);
1443 if (!dbus_connection_add_filter (f->activated, activated_filter,
1446 f->activated_name = dbus_bus_get_unique_name (f->activated);
1448 expect_new_connection (f);
1449 take_well_known_name (f, f->activated, "com.example.SystemdActivatable1");
1450 expect_take_well_known_name (f, f->activated,
1451 "com.example.SystemdActivatable1");
1453 /* The message is delivered to the activatable service. */
1454 while (f->activated_message == NULL)
1455 test_main_context_iterate (f->ctx, TRUE);
1457 m = f->activated_message;
1458 f->activated_message = NULL;
1459 assert_signal (m, f->sender_name, "/foo",
1460 "com.example.bar", "UnicastSignal1", "",
1461 "com.example.SystemdActivatable1");
1462 dbus_message_unref (m);
1464 /* The sender sends a message to a different activatable service. */
1465 m = dbus_message_new_signal ("/foo", "com.example.bar", "UnicastSignal2");
1466 if (!dbus_message_set_destination (m, "com.example.SystemdActivatable2"))
1468 dbus_connection_send (f->sender, m, NULL);
1469 dbus_message_unref (m);
1471 /* This time systemd is already ready for it. */
1472 while (g_queue_get_length (&f->monitored) < 2 ||
1473 f->systemd_message == NULL)
1474 test_main_context_iterate (f->ctx, TRUE);
1476 m = f->systemd_message;
1477 f->systemd_message = NULL;
1478 assert_signal (m, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS,
1479 "org.freedesktop.systemd1.Activator", "ActivationRequest", "s",
1480 "org.freedesktop.systemd1");
1481 dbus_message_unref (m);
1483 /* The monitor sees the activation request and the signal that
1485 m = g_queue_pop_head (&f->monitored);
1486 assert_signal (m, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS,
1487 "org.freedesktop.systemd1.Activator", "ActivationRequest", "s",
1488 "org.freedesktop.systemd1");
1489 dbus_message_unref (m);
1490 m = g_queue_pop_head (&f->monitored);
1491 assert_signal (m, f->sender_name, "/foo",
1492 "com.example.bar", "UnicastSignal2", "",
1493 "com.example.SystemdActivatable2");
1494 dbus_message_unref (m);
1496 /* The activatable service takes its name. Here I'm faking it by using
1497 * an existing connection. */
1498 take_well_known_name (f, f->activated, "com.example.SystemdActivatable2");
1500 /* The message is delivered to the activatable service.
1501 * Implementation detail: the monitor sees this happen before it even
1502 * sees that the name request happened, which is pretty odd. */
1503 while (f->activated_message == NULL)
1504 test_main_context_iterate (f->ctx, TRUE);
1506 m = f->activated_message;
1507 f->activated_message = NULL;
1508 assert_signal (m, f->sender_name, "/foo",
1509 "com.example.bar", "UnicastSignal2", "",
1510 "com.example.SystemdActivatable2");
1511 dbus_message_unref (m);
1513 expect_take_well_known_name (f, f->activated,
1514 "com.example.SystemdActivatable2");
1516 /* A third activation. */
1517 m = dbus_message_new_signal ("/foo", "com.example.bar", "UnicastSignal3");
1518 if (!dbus_message_set_destination (m, "com.example.SystemdActivatable3"))
1520 dbus_connection_send (f->sender, m, NULL);
1521 dbus_message_unref (m);
1523 /* Once again, we see the activation request and the reason. */
1524 while (g_queue_get_length (&f->monitored) < 2)
1525 test_main_context_iterate (f->ctx, TRUE);
1527 m = g_queue_pop_head (&f->monitored);
1528 assert_signal (m, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS,
1529 "org.freedesktop.systemd1.Activator", "ActivationRequest", "s",
1530 "org.freedesktop.systemd1");
1531 dbus_message_unref (m);
1532 m = g_queue_pop_head (&f->monitored);
1533 assert_signal (m, f->sender_name, "/foo",
1534 "com.example.bar", "UnicastSignal3", "",
1535 "com.example.SystemdActivatable3");
1536 dbus_message_unref (m);
1538 /* systemd gets the request too. */
1539 while (f->systemd_message == NULL)
1540 test_main_context_iterate (f->ctx, TRUE);
1542 m = f->systemd_message;
1543 f->systemd_message = NULL;
1544 assert_signal (m, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS,
1545 "org.freedesktop.systemd1.Activator", "ActivationRequest", "s",
1546 "org.freedesktop.systemd1");
1547 dbus_message_unref (m);
1549 /* This time activation fails */
1550 m = dbus_message_new_signal ("/org/freedesktop/systemd1",
1551 "org.freedesktop.systemd1.Activator", "ActivationFailure");
1555 const char *unit = "dbus-com.example.SystemdActivatable3.service";
1556 const char *error_name = "com.example.Nope";
1557 const char *error_message = "Computer says no";
1559 if (!dbus_message_append_args (m,
1560 DBUS_TYPE_STRING, &unit,
1561 DBUS_TYPE_STRING, &error_name,
1562 DBUS_TYPE_STRING, &error_message,
1568 if (!dbus_message_set_destination (m, "org.freedesktop.DBus"))
1570 dbus_connection_send (f->systemd, m, NULL);
1571 dbus_message_unref (m);
1573 /* The monitor sees activation fail */
1575 /* Once again, we see the activation request and the reason. */
1576 while (g_queue_get_length (&f->monitored) < 1)
1577 test_main_context_iterate (f->ctx, TRUE);
1579 m = g_queue_pop_head (&f->monitored);
1580 assert_error_reply (m, DBUS_SERVICE_DBUS, f->sender_name,
1581 "com.example.Nope");
1582 dbus_message_unref (m);
1584 #endif /* DBUS_UNIX */
1587 teardown (Fixture *f,
1588 gconstpointer context G_GNUC_UNUSED)
1590 dbus_error_free (&f->e);
1591 g_clear_error (&f->ge);
1593 if (f->monitor != NULL)
1595 dbus_connection_remove_filter (f->monitor, monitor_filter, f);
1596 dbus_connection_close (f->monitor);
1597 dbus_connection_unref (f->monitor);
1601 if (f->sender != NULL)
1603 dbus_connection_close (f->sender);
1604 dbus_connection_unref (f->sender);
1608 if (f->recipient != NULL)
1610 dbus_connection_remove_filter (f->recipient, recipient_filter, f);
1611 dbus_connection_close (f->recipient);
1612 dbus_connection_unref (f->recipient);
1613 f->recipient = NULL;
1616 if (f->systemd != NULL)
1618 dbus_connection_remove_filter (f->systemd, systemd_filter, f);
1619 dbus_connection_close (f->systemd);
1620 dbus_connection_unref (f->systemd);
1624 if (f->activated != NULL)
1626 dbus_connection_remove_filter (f->activated, activated_filter, f);
1627 dbus_connection_close (f->activated);
1628 dbus_connection_unref (f->activated);
1629 f->activated = NULL;
1632 test_kill_pid (f->daemon_pid);
1633 g_spawn_close_pid (f->daemon_pid);
1635 test_main_context_unref (f->ctx);
1637 g_queue_foreach (&f->monitored, (GFunc) dbus_message_unref, NULL);
1638 g_queue_clear (&f->monitored);
1640 g_free (f->address);
1647 test_init (&argc, &argv);
1649 g_test_add ("/monitor/invalid", Fixture, NULL,
1650 setup, test_invalid, teardown);
1651 g_test_add ("/monitor/become", Fixture, &side_effects_config,
1652 setup, test_become_monitor, teardown);
1653 g_test_add ("/monitor/broadcast", Fixture, NULL,
1654 setup, test_broadcast, teardown);
1655 g_test_add ("/monitor/forbidden-broadcast", Fixture, &forbidding_config,
1656 setup, test_forbidden_broadcast, teardown);
1657 g_test_add ("/monitor/unicast-signal", Fixture, NULL,
1658 setup, test_unicast_signal, teardown);
1659 g_test_add ("/monitor/forbidden", Fixture, &forbidding_config,
1660 setup, test_forbidden, teardown);
1661 g_test_add ("/monitor/method-call", Fixture, NULL,
1662 setup, test_method_call, teardown);
1663 g_test_add ("/monitor/forbidden-method", Fixture, &forbidding_config,
1664 setup, test_forbidden_method_call, teardown);
1665 g_test_add ("/monitor/dbus-daemon", Fixture, NULL,
1666 setup, test_dbus_daemon, teardown);
1667 g_test_add ("/monitor/selective", Fixture, &selective_config,
1668 setup, test_selective, teardown);
1669 g_test_add ("/monitor/wildcard", Fixture, &wildcard_config,
1670 setup, test_unicast_signal, teardown);
1671 g_test_add ("/monitor/no-rule", Fixture, &no_rules_config,
1672 setup, test_unicast_signal, teardown);
1673 g_test_add ("/monitor/eavesdrop", Fixture, &eavesdrop_config,
1674 setup, test_unicast_signal, teardown);
1675 g_test_add ("/monitor/no-eavesdrop", Fixture, &no_eavesdrop_config,
1676 setup, test_unicast_signal, teardown);
1679 /* this relies on the systemd activation code path */
1680 g_test_add ("/monitor/activation", Fixture, &fake_systemd_config,
1681 setup, test_activation, teardown);
1684 return g_test_run ();