diff options
| -rw-r--r-- | test/test-utils.c | 178 | ||||
| -rw-r--r-- | test/test-utils.h | 17 | 
2 files changed, 195 insertions, 0 deletions
diff --git a/test/test-utils.c b/test/test-utils.c new file mode 100644 index 00000000..d7ccd931 --- /dev/null +++ b/test/test-utils.c @@ -0,0 +1,178 @@ +#include "test-utils.h" + +typedef struct +{ +  DBusLoop *loop; +  DBusConnection *connection; + +} CData; + +dbus_bool_t +test_connection_dispatch_one_message  (DBusConnection *connection) +{ +  DBusDispatchStatus status; + +  while ((status = dbus_connection_dispatch (connection)) == DBUS_DISPATCH_NEED_MEMORY) +    _dbus_wait_for_memory (); +   +  return status == DBUS_DISPATCH_DATA_REMAINS; +} + +void +test_connection_dispatch_all_messages (DBusConnection *connection) +{ +  while (test_connection_dispatch_one_message (connection)) +    ; +} + +static dbus_bool_t +connection_watch_callback (DBusWatch     *watch, +                           unsigned int   condition, +                           void          *data) +{ +  CData *cd = data; +  dbus_bool_t retval; + +  dbus_connection_ref (cd->connection); +   +  retval = dbus_connection_handle_watch (cd->connection, watch, condition); + +  test_connection_dispatch_all_messages (cd->connection); +   +  dbus_connection_unref (cd->connection); + +  return retval; +} + +static dbus_bool_t +add_watch (DBusWatch *watch, +	   void      *data) +{ +  CData *cd = data; + +  return _dbus_loop_add_watch (cd->loop, +                               watch, +                               connection_watch_callback, +                               cd, NULL); +} + +static void +remove_watch (DBusWatch *watch, +	      void      *data) +{ +  CData *cd = data; +   +  _dbus_loop_remove_watch (cd->loop, +                           watch, connection_watch_callback, cd);   +} + +static void +connection_timeout_callback (DBusTimeout   *timeout, +                             void          *data) +{ +  CData *cd = data; + +  dbus_connection_ref (cd->connection); + +  /* Can return FALSE on OOM but we just let it fire again later */ +  dbus_timeout_handle (timeout); +   +  test_connection_dispatch_all_messages (cd->connection); +   +  dbus_connection_unref (cd->connection); +} + +static dbus_bool_t +add_timeout (DBusTimeout *timeout, +	     void        *data) +{ +  CData *cd = data; + +  return _dbus_loop_add_timeout (cd->loop, +                                 timeout, connection_timeout_callback, cd, NULL); +} + +static void +remove_timeout (DBusTimeout *timeout, +		void        *data) +{ +  CData *cd = data; + +  _dbus_loop_remove_timeout (cd->loop, +                             timeout, connection_timeout_callback, cd); +} + +static void +cdata_free (void *data) +{ +  CData *cd = data; + +  dbus_connection_unref (cd->connection); +  _dbus_loop_unref (cd->loop); +   +  dbus_free (cd); +} + +static CData* +cdata_new (DBusLoop       *loop, +           DBusConnection *connection) +{ +  CData *cd; + +  cd = dbus_new0 (CData, 1); +  if (cd == NULL) +    return NULL; + +  cd->loop = loop; +  cd->connection = connection; + +  dbus_connection_ref (cd->connection); +  _dbus_loop_ref (cd->loop); + +  return cd; +} + +dbus_bool_t +test_connection_setup (DBusLoop       *loop, +                       DBusConnection *connection) +{ +  CData *cd; + +  cd = cdata_new (loop, connection); +  if (cd == NULL) +    goto nomem; + +  /* Because dbus-mainloop.c checks dbus_timeout_get_enabled(), +   * dbus_watch_get_enabled() directly, we don't have to provide +   * "toggled" callbacks. +   */ +   +  if (!dbus_connection_set_watch_functions (connection, +                                            add_watch, +                                            remove_watch, +                                            NULL, +                                            cd, cdata_free)) +    goto nomem; + + +  cd = cdata_new (loop, connection); +  if (cd == NULL) +    goto nomem; +   +  if (!dbus_connection_set_timeout_functions (connection, +                                              add_timeout, +                                              remove_timeout, +                                              NULL, +                                              cd, cdata_free)) +    { +      dbus_connection_set_watch_functions (connection, NULL, NULL, NULL, NULL, NULL); +      goto nomem; +    } + +  return TRUE; +   + nomem: +  if (cd) +    cdata_free (cd); +  return FALSE; +} diff --git a/test/test-utils.h b/test/test-utils.h new file mode 100644 index 00000000..2f115c7f --- /dev/null +++ b/test/test-utils.h @@ -0,0 +1,17 @@ +#ifndef TEST_UTILS_H +#define TEST_UTILS_H +#include <config.h> +#define DBUS_COMPILATION /* Cheat and use private stuff */ +#include <dbus/dbus.h> +#include <stdio.h> +#include <stdlib.h> +#include <dbus/dbus-mainloop.h> +#include <dbus/dbus-internals.h> +#undef DBUS_COMPILATION + +dbus_bool_t test_connection_setup                 (DBusLoop       *loop, +                                                   DBusConnection *connection); +void        test_connection_dispatch_all_messages (DBusConnection *connection); +dbus_bool_t test_connection_dispatch_one_message  (DBusConnection *connection); + +#endif  | 
