summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--test/test-utils.c178
-rw-r--r--test/test-utils.h17
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