test.c revision 5c1a8e44903bd1dedc8cbefad78b0c8b61daada5
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))
1125c1a8e44903bd1dedc8cbefad78b0c8b61daada5Havoc Pennington    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
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
1275c1a8e44903bd1dedc8cbefad78b0c8b61daada5Havoc Pennington  return DBUS_HANDLER_RESULT_HANDLED;
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