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