test.c revision b29ea9115ea3277354b7ccbe442026279220f4ac
1d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington/* -*- mode: C; c-file-style: "gnu" -*- */ 2d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington/* test.c unit test routines 3d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * 4d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * Copyright (C) 2003 Red Hat, Inc. 5d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * 6d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * Licensed under the Academic Free License version 1.2 7d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * 8d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * This program is free software; you can redistribute it and/or modify 9d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * it under the terms of the GNU General Public License as published by 10d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * the Free Software Foundation; either version 2 of the License, or 11d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * (at your option) any later version. 12d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * 13d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * This program is distributed in the hope that it will be useful, 14d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of 15d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * GNU General Public License for more details. 17d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * 18d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * You should have received a copy of the GNU General Public License 19d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * along with this program; if not, write to the Free Software 20d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * 22d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington */ 23d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington 24169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington#include <config.h> 25169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 26169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington#ifdef DBUS_BUILD_TESTS 27169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington#include "test.h" 28f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington#include <dbus/dbus-internals.h> 29ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington#include <dbus/dbus-list.h> 30169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 31169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington/* The "debug client" watch/timeout handlers don't dispatch messages, 32169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington * as we manually pull them in order to verify them. This is why they 33169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington * are different from the real handlers in connection.c 34169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington */ 35ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtonstatic DBusList *clients = NULL; 36df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Penningtonstatic DBusLoop *client_loop = NULL; 37169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 38b4a1100f4f81534e2aac0141afda750f318223d4Havoc Penningtonstatic dbus_bool_t 39f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtonclient_watch_callback (DBusWatch *watch, 401b08036103a70159e7a67b2349306710edcd6654Havoc Pennington unsigned int condition, 411b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 42169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington{ 433df260c07102745c5606c313af862558f105f83eHavoc Pennington /* FIXME this can be done in dbus-mainloop.c 443df260c07102745c5606c313af862558f105f83eHavoc Pennington * if the code in activation.c for the babysitter 453df260c07102745c5606c313af862558f105f83eHavoc Pennington * watch handler is fixed. 463df260c07102745c5606c313af862558f105f83eHavoc Pennington */ 473df260c07102745c5606c313af862558f105f83eHavoc Pennington 483df260c07102745c5606c313af862558f105f83eHavoc Pennington return dbus_watch_handle (watch, condition); 49169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington} 50169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 51169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Penningtonstatic dbus_bool_t 52f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtonadd_client_watch (DBusWatch *watch, 531b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 54169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington{ 551b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 561b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 57df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington return _dbus_loop_add_watch (client_loop, 58df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington watch, client_watch_callback, connection, 59df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington NULL); 60169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington} 61169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 62169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Penningtonstatic void 63f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtonremove_client_watch (DBusWatch *watch, 641b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 65169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington{ 661b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 671b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 68df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_loop_remove_watch (client_loop, 69df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington watch, client_watch_callback, connection); 70169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington} 71169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 72169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Penningtonstatic void 73f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtonclient_timeout_callback (DBusTimeout *timeout, 741b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 75169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington{ 76169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington DBusConnection *connection = data; 77169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 78169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington dbus_connection_ref (connection); 79b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 80b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington /* can return FALSE on OOM but we just let it fire again later */ 81169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington dbus_timeout_handle (timeout); 82169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 83169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington dbus_connection_unref (connection); 84169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington} 85169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 86169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Penningtonstatic dbus_bool_t 87f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtonadd_client_timeout (DBusTimeout *timeout, 881b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 89169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington{ 901b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 911b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 92df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington return _dbus_loop_add_timeout (client_loop, timeout, client_timeout_callback, connection, NULL); 93169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington} 94169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 95169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Penningtonstatic void 96f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtonremove_client_timeout (DBusTimeout *timeout, 971b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 98169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington{ 991b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 1001b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 101df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_loop_remove_timeout (client_loop, timeout, client_timeout_callback, connection); 102169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington} 103169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 104f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtonstatic DBusHandlerResult 105f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtonclient_disconnect_handler (DBusMessageHandler *handler, 106f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington DBusConnection *connection, 107f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington DBusMessage *message, 108f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington void *user_data) 109f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington{ 110b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington if (!dbus_message_has_name (message, 111b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington DBUS_MESSAGE_LOCAL_DISCONNECT)) 112b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington return DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS; 113b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington 114ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_verbose ("Removing client %p in disconnect handler\n", 115ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington connection); 116ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 117ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_list_remove (&clients, connection); 1181b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 119f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington dbus_connection_unref (connection); 120f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 1211b08036103a70159e7a67b2349306710edcd6654Havoc Pennington if (clients == NULL) 1221b08036103a70159e7a67b2349306710edcd6654Havoc Pennington { 123df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_loop_unref (client_loop); 1241b08036103a70159e7a67b2349306710edcd6654Havoc Pennington client_loop = NULL; 1251b08036103a70159e7a67b2349306710edcd6654Havoc Pennington } 1261b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 127f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington return DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS; 128f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington} 129169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 1306843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Penningtonstatic dbus_int32_t handler_slot = -1; 131f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 132f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonstatic void 133f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonfree_handler (void *data) 134f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington{ 135f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington DBusMessageHandler *handler = data; 136f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 137f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington dbus_message_handler_unref (handler); 1386843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Pennington dbus_connection_free_data_slot (&handler_slot); 139f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington} 140ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 141169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Penningtondbus_bool_t 142169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Penningtonbus_setup_debug_client (DBusConnection *connection) 143169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington{ 144f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington DBusMessageHandler *disconnect_handler; 145f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington dbus_bool_t retval; 146169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 147f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington disconnect_handler = dbus_message_handler_new (client_disconnect_handler, 148f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington NULL, NULL); 149f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 150f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington if (disconnect_handler == NULL) 151f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington return FALSE; 152f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 153b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington if (!dbus_connection_add_filter (connection, 154b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington disconnect_handler)) 155169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington { 156f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington dbus_message_handler_unref (disconnect_handler); 157169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington return FALSE; 158169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington } 159f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 160f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington retval = FALSE; 1611b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 1621b08036103a70159e7a67b2349306710edcd6654Havoc Pennington if (client_loop == NULL) 1631b08036103a70159e7a67b2349306710edcd6654Havoc Pennington { 164df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington client_loop = _dbus_loop_new (); 1651b08036103a70159e7a67b2349306710edcd6654Havoc Pennington if (client_loop == NULL) 1661b08036103a70159e7a67b2349306710edcd6654Havoc Pennington goto out; 1671b08036103a70159e7a67b2349306710edcd6654Havoc Pennington } 168169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 169f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington if (!dbus_connection_set_watch_functions (connection, 1701b08036103a70159e7a67b2349306710edcd6654Havoc Pennington add_client_watch, 1711b08036103a70159e7a67b2349306710edcd6654Havoc Pennington remove_client_watch, 172f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, 173f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington connection, 174f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington NULL)) 175f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington goto out; 176f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 177169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington if (!dbus_connection_set_timeout_functions (connection, 1781b08036103a70159e7a67b2349306710edcd6654Havoc Pennington add_client_timeout, 1791b08036103a70159e7a67b2349306710edcd6654Havoc Pennington remove_client_timeout, 180f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, 181169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington connection, NULL)) 182f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington goto out; 183f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 184ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!_dbus_list_append (&clients, connection)) 185ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 186ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 1876843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Pennington if (!dbus_connection_allocate_data_slot (&handler_slot)) 188f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington goto out; 189f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 190f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington /* Set up handler to be destroyed */ 191ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!dbus_connection_set_data (connection, handler_slot, 192ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington disconnect_handler, 193f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington free_handler)) 194f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington { 1956843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Pennington dbus_connection_free_data_slot (&handler_slot); 196f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington goto out; 197f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington } 198ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 199f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington retval = TRUE; 200f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 201f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington out: 202f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington if (!retval) 203169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington { 204ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_message_handler_unref (disconnect_handler); /* unregisters it */ 205f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 206f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington dbus_connection_set_watch_functions (connection, 207f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, NULL, NULL, NULL, NULL); 208f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington dbus_connection_set_timeout_functions (connection, 209f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, NULL, NULL, NULL, NULL); 210ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 211ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_list_remove_last (&clients, connection); 2121b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 2131b08036103a70159e7a67b2349306710edcd6654Havoc Pennington if (clients == NULL) 2141b08036103a70159e7a67b2349306710edcd6654Havoc Pennington { 215df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_loop_unref (client_loop); 2161b08036103a70159e7a67b2349306710edcd6654Havoc Pennington client_loop = NULL; 2171b08036103a70159e7a67b2349306710edcd6654Havoc Pennington } 218169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington } 219ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 220ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington return retval; 221ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington} 222ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 223ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtonvoid 224ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtonbus_test_clients_foreach (BusConnectionForeachFunction function, 225ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington void *data) 226ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington{ 227ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusList *link; 228f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 229ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington link = _dbus_list_get_first_link (&clients); 230ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington while (link != NULL) 231ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 232ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusConnection *connection = link->data; 233ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusList *next = _dbus_list_get_next_link (&clients, link); 234ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 235ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!(* function) (connection, data)) 236ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington break; 237ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 238ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington link = next; 239ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 240ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington} 241ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 242ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtondbus_bool_t 243ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtonbus_test_client_listed (DBusConnection *connection) 244ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington{ 245ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusList *link; 246f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 247ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington link = _dbus_list_get_first_link (&clients); 248ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington while (link != NULL) 249ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 250ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusConnection *c = link->data; 251ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusList *next = _dbus_list_get_next_link (&clients, link); 252ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 253ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (c == connection) 254ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington return TRUE; 255ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 256ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington link = next; 257ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 258ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 259ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington return FALSE; 260169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington} 261ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 262ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Penningtonvoid 263fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Penningtonbus_test_run_clients_loop (dbus_bool_t block_once) 264ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington{ 2651b08036103a70159e7a67b2349306710edcd6654Havoc Pennington if (client_loop == NULL) 2661b08036103a70159e7a67b2349306710edcd6654Havoc Pennington return; 26751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 26851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington /* dispatch before we block so pending dispatches 26951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington * won't make our block return early 27051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington */ 27151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington _dbus_loop_dispatch (client_loop); 2721b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 2731b08036103a70159e7a67b2349306710edcd6654Havoc Pennington /* Do one blocking wait, since we're expecting data */ 274e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington if (block_once) 275e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington { 276e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _dbus_verbose ("---> blocking on \"client side\"\n"); 277e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _dbus_loop_iterate (client_loop, TRUE); 278e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington } 2791b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 2801b08036103a70159e7a67b2349306710edcd6654Havoc Pennington /* Then mop everything up */ 281df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington while (_dbus_loop_iterate (client_loop, FALSE)) 282ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington ; 2831b08036103a70159e7a67b2349306710edcd6654Havoc Pennington} 2841b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 2851b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonvoid 286fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Penningtonbus_test_run_bus_loop (BusContext *context, 287fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington dbus_bool_t block_once) 2881b08036103a70159e7a67b2349306710edcd6654Havoc Pennington{ 28951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington /* dispatch before we block so pending dispatches 29051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington * won't make our block return early 29151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington */ 29251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington _dbus_loop_dispatch (bus_context_get_loop (context)); 29351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 2941b08036103a70159e7a67b2349306710edcd6654Havoc Pennington /* Do one blocking wait, since we're expecting data */ 295e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington if (block_once) 296e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington { 297e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _dbus_verbose ("---> blocking on \"server side\"\n"); 298e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _dbus_loop_iterate (bus_context_get_loop (context), TRUE); 299e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington } 3001b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 3011b08036103a70159e7a67b2349306710edcd6654Havoc Pennington /* Then mop everything up */ 302df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington while (_dbus_loop_iterate (bus_context_get_loop (context), FALSE)) 303ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington ; 304ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington} 305ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington 3061b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonvoid 3071b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonbus_test_run_everything (BusContext *context) 3081b08036103a70159e7a67b2349306710edcd6654Havoc Pennington{ 309a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington while (_dbus_loop_iterate (bus_context_get_loop (context), FALSE) || 310a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington (client_loop == NULL || _dbus_loop_iterate (client_loop, FALSE))) 311a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington ; 3121b08036103a70159e7a67b2349306710edcd6654Havoc Pennington} 3131b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 31429c71168cd17b11eed65023c97aff401d5305b01Havoc PenningtonBusContext* 31529c71168cd17b11eed65023c97aff401d5305b01Havoc Penningtonbus_context_new_test (const DBusString *test_data_dir, 31629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington const char *filename) 31729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington{ 31829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington DBusError error; 31929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington DBusString config_file; 32029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington DBusString relative; 32129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington BusContext *context; 32229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 323fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington if (!_dbus_string_init (&config_file)) 32429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington { 32529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_warn ("No memory\n"); 32629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington return NULL; 32729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington } 32829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 32929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington if (!_dbus_string_copy (test_data_dir, 0, 33029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington &config_file, 0)) 33129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington { 33229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_warn ("No memory\n"); 33329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_string_free (&config_file); 33429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington return NULL; 33529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington } 33629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 33729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_string_init_const (&relative, filename); 33829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 33929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington if (!_dbus_concat_dir_and_file (&config_file, &relative)) 34029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington { 34129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_warn ("No memory\n"); 34229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_string_free (&config_file); 34329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington return NULL; 34429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington } 34529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 34629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington dbus_error_init (&error); 347df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington context = bus_context_new (&config_file, FALSE, -1, -1, &error); 34829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington if (context == NULL) 34929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington { 35029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _DBUS_ASSERT_ERROR_IS_SET (&error); 35129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 35229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_warn ("Failed to create debug bus context from configuration file %s: %s\n", 35329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington filename, error.message); 35429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 35529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington dbus_error_free (&error); 35629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 35729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_string_free (&config_file); 35829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 35929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington return NULL; 36029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington } 36129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 36229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_string_free (&config_file); 36329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 36429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington return context; 36529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington} 36629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 367169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington#endif 368