test.c revision 1b08036103a70159e7a67b2349306710edcd6654
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" 28169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington#include "loop.h" 29f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington#include <dbus/dbus-internals.h> 30ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington#include <dbus/dbus-list.h> 31169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 32169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington/* The "debug client" watch/timeout handlers don't dispatch messages, 33169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington * as we manually pull them in order to verify them. This is why they 34169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington * are different from the real handlers in connection.c 35169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington */ 36ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtonstatic DBusList *clients = NULL; 371b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonstatic BusLoop *client_loop = NULL; 38169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 39b4a1100f4f81534e2aac0141afda750f318223d4Havoc Penningtonstatic dbus_bool_t 40f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtonclient_watch_callback (DBusWatch *watch, 411b08036103a70159e7a67b2349306710edcd6654Havoc Pennington unsigned int condition, 421b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 43169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington{ 44169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington DBusConnection *connection = data; 45b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington dbus_bool_t retval; 46b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 47169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington dbus_connection_ref (connection); 48169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 49b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington retval = dbus_connection_handle_watch (connection, watch, condition); 50169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 51169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington dbus_connection_unref (connection); 52b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 53b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington return retval; 54169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington} 55169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 56169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Penningtonstatic dbus_bool_t 57f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtonadd_client_watch (DBusWatch *watch, 581b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 59169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington{ 601b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 611b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 621b08036103a70159e7a67b2349306710edcd6654Havoc Pennington return bus_loop_add_watch (client_loop, 631b08036103a70159e7a67b2349306710edcd6654Havoc Pennington watch, client_watch_callback, connection, 64169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington NULL); 65169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington} 66169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 67169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Penningtonstatic void 68f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtonremove_client_watch (DBusWatch *watch, 691b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 70169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington{ 711b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 721b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 731b08036103a70159e7a67b2349306710edcd6654Havoc Pennington bus_loop_remove_watch (client_loop, 741b08036103a70159e7a67b2349306710edcd6654Havoc Pennington watch, client_watch_callback, connection); 75169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington} 76169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 77169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Penningtonstatic void 78f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtonclient_timeout_callback (DBusTimeout *timeout, 791b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 80169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington{ 81169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington DBusConnection *connection = data; 82169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 83169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington dbus_connection_ref (connection); 84b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 85b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington /* can return FALSE on OOM but we just let it fire again later */ 86169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington dbus_timeout_handle (timeout); 87169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 88169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington dbus_connection_unref (connection); 89169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington} 90169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 91169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Penningtonstatic dbus_bool_t 92f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtonadd_client_timeout (DBusTimeout *timeout, 931b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 94169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington{ 951b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 961b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 971b08036103a70159e7a67b2349306710edcd6654Havoc Pennington return bus_loop_add_timeout (client_loop, timeout, client_timeout_callback, connection, NULL); 98169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington} 99169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 100169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Penningtonstatic void 101f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtonremove_client_timeout (DBusTimeout *timeout, 1021b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 103169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington{ 1041b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 1051b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 1061b08036103a70159e7a67b2349306710edcd6654Havoc Pennington bus_loop_remove_timeout (client_loop, timeout, client_timeout_callback, connection); 107169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington} 108169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 109f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtonstatic DBusHandlerResult 110f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtonclient_disconnect_handler (DBusMessageHandler *handler, 111f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington DBusConnection *connection, 112f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington DBusMessage *message, 113f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington void *user_data) 114f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington{ 115ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_verbose ("Removing client %p in disconnect handler\n", 116ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington connection); 117ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 118ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_list_remove (&clients, connection); 1191b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 120f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington dbus_connection_unref (connection); 121f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 1221b08036103a70159e7a67b2349306710edcd6654Havoc Pennington if (clients == NULL) 1231b08036103a70159e7a67b2349306710edcd6654Havoc Pennington { 1241b08036103a70159e7a67b2349306710edcd6654Havoc Pennington bus_loop_unref (client_loop); 1251b08036103a70159e7a67b2349306710edcd6654Havoc Pennington client_loop = NULL; 1261b08036103a70159e7a67b2349306710edcd6654Havoc Pennington } 1271b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 128f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington return DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS; 129f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington} 130169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 131ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtonstatic int handler_slot = -1; 132f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonstatic int handler_slot_refcount = 0; 133f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 134f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonstatic dbus_bool_t 135f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonhandler_slot_ref (void) 136f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington{ 137f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington if (handler_slot < 0) 138f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington { 139f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington handler_slot = dbus_connection_allocate_data_slot (); 140f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 141f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington if (handler_slot < 0) 142f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington return FALSE; 143f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 144f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington _dbus_assert (handler_slot_refcount == 0); 145f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington } 146f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 147f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington handler_slot_refcount += 1; 148f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 149f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington return TRUE; 150f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 151f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington} 152f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 153f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonstatic void 154f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonhandler_slot_unref (void) 155f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington{ 156f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington _dbus_assert (handler_slot_refcount > 0); 157f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 158f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington handler_slot_refcount -= 1; 159f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 160f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington if (handler_slot_refcount == 0) 161f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington { 162f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington dbus_connection_free_data_slot (handler_slot); 163f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington handler_slot = -1; 164f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington } 165f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington} 166f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 167f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonstatic void 168f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonfree_handler (void *data) 169f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington{ 170f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington DBusMessageHandler *handler = data; 171f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 172f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington dbus_message_handler_unref (handler); 173f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington handler_slot_unref (); 174f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington} 175ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 176169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Penningtondbus_bool_t 177169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Penningtonbus_setup_debug_client (DBusConnection *connection) 178169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington{ 179f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington DBusMessageHandler *disconnect_handler; 180f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington const char *to_handle[] = { DBUS_MESSAGE_LOCAL_DISCONNECT }; 181f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington dbus_bool_t retval; 182169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 183f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington disconnect_handler = dbus_message_handler_new (client_disconnect_handler, 184f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington NULL, NULL); 185f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 186f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington if (disconnect_handler == NULL) 187f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington return FALSE; 188f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 189f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington if (!dbus_connection_register_handler (connection, 190f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington disconnect_handler, 191f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington to_handle, 192f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington _DBUS_N_ELEMENTS (to_handle))) 193169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington { 194f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington dbus_message_handler_unref (disconnect_handler); 195169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington return FALSE; 196169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington } 197f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 198f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington retval = FALSE; 1991b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 2001b08036103a70159e7a67b2349306710edcd6654Havoc Pennington if (client_loop == NULL) 2011b08036103a70159e7a67b2349306710edcd6654Havoc Pennington { 2021b08036103a70159e7a67b2349306710edcd6654Havoc Pennington client_loop = bus_loop_new (); 2031b08036103a70159e7a67b2349306710edcd6654Havoc Pennington if (client_loop == NULL) 2041b08036103a70159e7a67b2349306710edcd6654Havoc Pennington goto out; 2051b08036103a70159e7a67b2349306710edcd6654Havoc Pennington } 206169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 207f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington if (!dbus_connection_set_watch_functions (connection, 2081b08036103a70159e7a67b2349306710edcd6654Havoc Pennington add_client_watch, 2091b08036103a70159e7a67b2349306710edcd6654Havoc Pennington remove_client_watch, 210f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, 211f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington connection, 212f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington NULL)) 213f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington goto out; 214f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 215169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington if (!dbus_connection_set_timeout_functions (connection, 2161b08036103a70159e7a67b2349306710edcd6654Havoc Pennington add_client_timeout, 2171b08036103a70159e7a67b2349306710edcd6654Havoc Pennington remove_client_timeout, 218f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, 219169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington connection, NULL)) 220f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington goto out; 221f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 222ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!_dbus_list_append (&clients, connection)) 223ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 224ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 225f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington if (!handler_slot_ref ()) 226f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington goto out; 227f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 228f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington /* Set up handler to be destroyed */ 229ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!dbus_connection_set_data (connection, handler_slot, 230ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington disconnect_handler, 231f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington free_handler)) 232f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington { 233f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington handler_slot_unref (); 234f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington goto out; 235f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington } 236ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 237f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington retval = TRUE; 238f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 239f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington out: 240f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington if (!retval) 241169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington { 242ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_message_handler_unref (disconnect_handler); /* unregisters it */ 243f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 244f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington dbus_connection_set_watch_functions (connection, 245f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, NULL, NULL, NULL, NULL); 246f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington dbus_connection_set_timeout_functions (connection, 247f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, NULL, NULL, NULL, NULL); 248ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 249ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_list_remove_last (&clients, connection); 2501b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 2511b08036103a70159e7a67b2349306710edcd6654Havoc Pennington if (clients == NULL) 2521b08036103a70159e7a67b2349306710edcd6654Havoc Pennington { 2531b08036103a70159e7a67b2349306710edcd6654Havoc Pennington bus_loop_unref (client_loop); 2541b08036103a70159e7a67b2349306710edcd6654Havoc Pennington client_loop = NULL; 2551b08036103a70159e7a67b2349306710edcd6654Havoc Pennington } 256169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington } 257ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 258ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington return retval; 259ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington} 260ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 261ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtonvoid 262ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtonbus_test_clients_foreach (BusConnectionForeachFunction function, 263ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington void *data) 264ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington{ 265ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusList *link; 266f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 267ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington link = _dbus_list_get_first_link (&clients); 268ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington while (link != NULL) 269ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 270ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusConnection *connection = link->data; 271ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusList *next = _dbus_list_get_next_link (&clients, link); 272ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 273ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!(* function) (connection, data)) 274ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington break; 275ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 276ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington link = next; 277ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 278ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington} 279ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 280ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtondbus_bool_t 281ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtonbus_test_client_listed (DBusConnection *connection) 282ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington{ 283ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusList *link; 284f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 285ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington link = _dbus_list_get_first_link (&clients); 286ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington while (link != NULL) 287ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 288ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusConnection *c = link->data; 289ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusList *next = _dbus_list_get_next_link (&clients, link); 290ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 291ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (c == connection) 292ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington return TRUE; 293ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 294ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington link = next; 295ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 296ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 297ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington return FALSE; 298169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington} 299ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 300ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Penningtonvoid 3011b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonbus_test_run_clients_loop (void) 302ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington{ 3031b08036103a70159e7a67b2349306710edcd6654Havoc Pennington if (client_loop == NULL) 3041b08036103a70159e7a67b2349306710edcd6654Havoc Pennington return; 3051b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 3061b08036103a70159e7a67b2349306710edcd6654Havoc Pennington /* Do one blocking wait, since we're expecting data */ 3071b08036103a70159e7a67b2349306710edcd6654Havoc Pennington bus_loop_iterate (client_loop, TRUE); 3081b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 3091b08036103a70159e7a67b2349306710edcd6654Havoc Pennington /* Then mop everything up */ 3101b08036103a70159e7a67b2349306710edcd6654Havoc Pennington while (bus_loop_iterate (client_loop, FALSE)) 311ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington ; 3121b08036103a70159e7a67b2349306710edcd6654Havoc Pennington} 3131b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 3141b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonvoid 3151b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonbus_test_run_bus_loop (BusContext *context) 3161b08036103a70159e7a67b2349306710edcd6654Havoc Pennington{ 3171b08036103a70159e7a67b2349306710edcd6654Havoc Pennington /* Do one blocking wait, since we're expecting data */ 3181b08036103a70159e7a67b2349306710edcd6654Havoc Pennington bus_loop_iterate (bus_context_get_loop (context), TRUE); 3191b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 3201b08036103a70159e7a67b2349306710edcd6654Havoc Pennington /* Then mop everything up */ 3211b08036103a70159e7a67b2349306710edcd6654Havoc Pennington while (bus_loop_iterate (bus_context_get_loop (context), FALSE)) 322ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington ; 323ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington} 324ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington 3251b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonvoid 3261b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonbus_test_run_everything (BusContext *context) 3271b08036103a70159e7a67b2349306710edcd6654Havoc Pennington{ 3281b08036103a70159e7a67b2349306710edcd6654Havoc Pennington int i; 3291b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 3301b08036103a70159e7a67b2349306710edcd6654Havoc Pennington i = 0; 3311b08036103a70159e7a67b2349306710edcd6654Havoc Pennington while (i < 2) 3321b08036103a70159e7a67b2349306710edcd6654Havoc Pennington { 3331b08036103a70159e7a67b2349306710edcd6654Havoc Pennington while (bus_loop_iterate (bus_context_get_loop (context), FALSE) || 3341b08036103a70159e7a67b2349306710edcd6654Havoc Pennington (client_loop == NULL || bus_loop_iterate (client_loop, FALSE))) 3351b08036103a70159e7a67b2349306710edcd6654Havoc Pennington ; 3361b08036103a70159e7a67b2349306710edcd6654Havoc Pennington ++i; 3371b08036103a70159e7a67b2349306710edcd6654Havoc Pennington } 3381b08036103a70159e7a67b2349306710edcd6654Havoc Pennington} 3391b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 34029c71168cd17b11eed65023c97aff401d5305b01Havoc PenningtonBusContext* 34129c71168cd17b11eed65023c97aff401d5305b01Havoc Penningtonbus_context_new_test (const DBusString *test_data_dir, 34229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington const char *filename) 34329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington{ 34429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington DBusError error; 34529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington DBusString config_file; 34629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington DBusString relative; 34729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington BusContext *context; 34829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 349fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington if (!_dbus_string_init (&config_file)) 35029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington { 35129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_warn ("No memory\n"); 35229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington return NULL; 35329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington } 35429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 35529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington if (!_dbus_string_copy (test_data_dir, 0, 35629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington &config_file, 0)) 35729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington { 35829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_warn ("No memory\n"); 35929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_string_free (&config_file); 36029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington return NULL; 36129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington } 36229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 36329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_string_init_const (&relative, filename); 36429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 36529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington if (!_dbus_concat_dir_and_file (&config_file, &relative)) 36629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington { 36729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_warn ("No memory\n"); 36829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_string_free (&config_file); 36929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington return NULL; 37029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington } 37129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 37229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington dbus_error_init (&error); 37329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington context = bus_context_new (&config_file, &error); 37429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington if (context == NULL) 37529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington { 37629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _DBUS_ASSERT_ERROR_IS_SET (&error); 37729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 37829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_warn ("Failed to create debug bus context from configuration file %s: %s\n", 37929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington filename, error.message); 38029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 38129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington dbus_error_free (&error); 38229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 38329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_string_free (&config_file); 38429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 38529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington return NULL; 38629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington } 38729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 38829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington _dbus_string_free (&config_file); 38929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 39029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington return context; 39129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington} 39229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 393169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington#endif 394