summaryrefslogtreecommitdiffstats
path: root/test/bus-test.c
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@codefactory.se>2003-02-16 21:50:32 +0000
committerAnders Carlsson <andersca@codefactory.se>2003-02-16 21:50:32 +0000
commit6cf6f82faae928a9142d4aa465b5add381960e29 (patch)
tree4275653da460d9f96639e7c246f82dd1c6e233a9 /test/bus-test.c
parentb2fce4c69b9fd75c54bb370e043ea166b83083f6 (diff)
2003-02-16 Anders Carlsson <andersca@codefactory.se>
* bus/dispatch.c: (send_one_message): Only send broadcast messages to registered connections. * dbus/dbus-message.c: (dbus_message_name_is): * dbus/dbus-message.h: New convenience function. * dbus/dbus-transport-debug.c: (do_reading): Only dispatch one message per run. * test/Makefile.am: * test/bus-test.c: (new_connection_callback), (die), (test_hello_client1_handler), (test_hello_client2_handler), (test_hello_replies), (main): * test/bus-test-loop.[ch]: Add these.
Diffstat (limited to 'test/bus-test.c')
-rw-r--r--test/bus-test.c283
1 files changed, 165 insertions, 118 deletions
diff --git a/test/bus-test.c b/test/bus-test.c
index 38742805..342e806b 100644
--- a/test/bus-test.c
+++ b/test/bus-test.c
@@ -1,6 +1,6 @@
#include <dbus/dbus.h>
#include <stdio.h>
-#include <sys/time.h>
+#include <stdlib.h>
#define DBUS_COMPILATION /* cheat and use DBusList */
#include <dbus/dbus-list.h>
@@ -9,54 +9,8 @@
#undef DBUS_COMPILATION
#include "debug-thread.h"
+#include "bus-test-loop.h"
-typedef struct
-{
- long time;
- DBusTimeout *timeout;
-
-} LoopTimeout;
-
-static DBusList *timeouts;
-
-static long
-get_time (void)
-{
- struct timeval r;
- long time;
-
- /* Can't use dbus-sysdeps here since that isn't
- * available outside of libdbus.
- */
- gettimeofday (&r, NULL);
-
- time = r.tv_sec * 1000;
- time += r.tv_usec / 1000;
-
- return time;
-}
-
-static void
-add_timeout (DBusTimeout *timeout,
- void *data)
-{
- LoopTimeout *lt;
-
- lt = dbus_new (LoopTimeout, 1);
- lt->time = get_time () + dbus_timeout_get_interval (timeout);
- lt->timeout = timeout;
-
- _dbus_list_append (&timeouts, lt);
- printf ("add timeout!\n");
-}
-
-static void
-remove_timeout (DBusTimeout *timeout,
- void *data)
-{
- printf ("remove timeout!\n");
-
-}
static DBusHandlerResult
message_handler (DBusMessageHandler *handler,
@@ -77,80 +31,197 @@ new_connection_callback (DBusServer *server,
if (!bus_connection_setup (new_connection))
return;
- dbus_connection_set_timeout_functions (new_connection,
- add_timeout, remove_timeout,
- NULL, NULL);
+ bus_test_loop_hookup_with_connection (new_connection);
dbus_connection_ref (new_connection);
}
+static void
+die (const char *failure)
+{
+ fprintf (stderr, "Unit test failed: %s\n", failure);
+ exit (1);
+}
-static dbus_bool_t running_loop;
+/* Here are the tests */
+static dbus_bool_t test_hello_succeeding = TRUE;
+static char *client1_name, *client2_name;
+static int client1_stage = 0, client2_stage = 0;
+#define TEST_HELLO_HANDLE_FAIL(x) do { if (!(x)) { printf ("failed at line %d\n", __LINE__); test_hello_succeeding = FALSE; goto out; } } while (0)
-static void
-loop_quit (void)
+
+static DBusHandlerResult
+test_hello_client1_handler (DBusMessageHandler *handler,
+ DBusConnection *connection,
+ DBusMessage *message,
+ void *user_data)
{
- running_loop = FALSE;
+ char *tmp = NULL;
+
+ if (!test_hello_succeeding)
+ goto out;
+
+ if (dbus_message_name_is (message, DBUS_MESSAGE_HELLO))
+ {
+ TEST_HELLO_HANDLE_FAIL (client1_stage == 0);
+
+ TEST_HELLO_HANDLE_FAIL ((dbus_message_get_args (message,
+ DBUS_TYPE_STRING, &client1_name,
+ 0) == DBUS_RESULT_SUCCESS));
+
+ client1_stage += 1;
+ }
+ else if (dbus_message_name_is (message, DBUS_MESSAGE_SERVICE_CREATED))
+ {
+ TEST_HELLO_HANDLE_FAIL (client1_stage == 1 || client1_stage == 3);
+
+ TEST_HELLO_HANDLE_FAIL ((dbus_message_get_args (message,
+ DBUS_TYPE_STRING, &tmp,
+ 0) == DBUS_RESULT_SUCCESS));
+ if (client1_stage == 1)
+ TEST_HELLO_HANDLE_FAIL (strcmp (client1_name, tmp) == 0);
+ else
+ TEST_HELLO_HANDLE_FAIL (strcmp (client2_name, tmp) == 0);
+
+ client1_stage += 1;
+
+ if (client1_stage == 4)
+ bus_test_loop_quit ();
+ }
+ else if (dbus_message_name_is (message, DBUS_MESSAGE_SERVICE_ACQUIRED))
+ {
+ TEST_HELLO_HANDLE_FAIL (client1_stage == 2);
+
+ TEST_HELLO_HANDLE_FAIL ((dbus_message_get_args (message,
+ DBUS_TYPE_STRING, &tmp,
+ 0) == DBUS_RESULT_SUCCESS));
+ TEST_HELLO_HANDLE_FAIL (strcmp (client1_name, tmp) == 0);
+
+ client1_stage += 1;
+ }
+ else
+ {
+ printf ("client1 received unexpected message %s in stage %d\n",
+ dbus_message_get_name (message), client1_stage);
+
+ test_hello_succeeding = FALSE;
+ goto out;
+ }
+
+ out:
+ if (tmp)
+ dbus_free (tmp);
+
+ return DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
}
-static void
-loop_run (void)
+static DBusHandlerResult
+test_hello_client2_handler (DBusMessageHandler *handler,
+ DBusConnection *connection,
+ DBusMessage *message,
+ void *user_data)
{
- long start_time = get_time ();
- running_loop = TRUE;
+ char *tmp = NULL;
+
+ if (!test_hello_succeeding)
+ goto out;
+
+ if (dbus_message_name_is (message, DBUS_MESSAGE_HELLO))
+ {
+ TEST_HELLO_HANDLE_FAIL (client2_stage == 0);
- /* Horribly inefficient main loop */
- while (running_loop)
+ TEST_HELLO_HANDLE_FAIL ((dbus_message_get_args (message,
+ DBUS_TYPE_STRING, &client2_name,
+ 0) == DBUS_RESULT_SUCCESS));
+
+ client2_stage += 1;
+ }
+ else if (dbus_message_name_is (message, DBUS_MESSAGE_SERVICE_CREATED))
{
- DBusList *link, *list_copy;
- long time;
-
- time = get_time ();
-
- _dbus_list_copy (&timeouts, &list_copy);
-
- link = _dbus_list_get_first_link (&list_copy);
- while (link != NULL)
- {
- LoopTimeout *lt = link->data;
- if (lt->time <= time)
- {
- dbus_timeout_handle (lt->timeout);
- _dbus_list_remove (&timeouts, lt);
- }
- link = _dbus_list_get_next_link (&list_copy, link);
- }
-
- if (get_time () - start_time > 1000)
- loop_quit ();
+ TEST_HELLO_HANDLE_FAIL (client2_stage == 1);
+
+ TEST_HELLO_HANDLE_FAIL ((dbus_message_get_args (message,
+ DBUS_TYPE_STRING, &tmp,
+ 0) == DBUS_RESULT_SUCCESS));
+ TEST_HELLO_HANDLE_FAIL (strcmp (client2_name, tmp) == 0);
+
+ client2_stage += 1;
}
-}
+ else if (dbus_message_name_is (message, DBUS_MESSAGE_SERVICE_ACQUIRED))
+ {
+ TEST_HELLO_HANDLE_FAIL (client2_stage == 2);
+ TEST_HELLO_HANDLE_FAIL ((dbus_message_get_args (message,
+ DBUS_TYPE_STRING, &tmp,
+ 0) == DBUS_RESULT_SUCCESS));
+ TEST_HELLO_HANDLE_FAIL (strcmp (client2_name, tmp) == 0);
+ client2_stage += 1;
+ }
+ else
+ {
+ test_hello_succeeding = FALSE;
+ goto out;
+ }
+
+ out:
+ if (tmp)
+ dbus_free (tmp);
+
+ return DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
+}
+
+static dbus_bool_t
+test_hello_replies (void)
+{
+ DBusConnection *connection;
+ DBusResultCode result;
+ DBusMessage *message;
+ DBusMessageHandler *handler;
+
+ /* First start client 1 */
+ connection = dbus_connection_open ("debug:name=test-server", &result);
+ bus_test_loop_hookup_with_connection (connection);
+ message = dbus_message_new (DBUS_SERVICE_DBUS,
+ DBUS_MESSAGE_HELLO);
+ handler = dbus_message_handler_new (test_hello_client1_handler, NULL, NULL);
+ dbus_connection_add_filter (connection, handler);
+ dbus_connection_send_message (connection, message, NULL, NULL);
+ dbus_message_unref (message);
+ /* Then start client 2 */
+ connection = dbus_connection_open ("debug:name=test-server", &result);
+ bus_test_loop_hookup_with_connection (connection);
+ message = dbus_message_new (DBUS_SERVICE_DBUS,
+ DBUS_MESSAGE_HELLO);
+ handler = dbus_message_handler_new (test_hello_client2_handler, NULL, NULL);
+ dbus_connection_add_filter (connection, handler);
+ dbus_connection_send_message (connection, message, NULL, NULL);
+ dbus_message_unref (message);
+ bus_test_loop_run ();
+
+ return test_hello_succeeding;
+}
int
main (int argc,
char **argv)
{
DBusServer *server;
- DBusConnection *connection;
DBusResultCode result;
- DBusMessage *message;
- DBusMessageHandler *handler;
-
+
debug_threads_init ();
+
+ bus_connection_init ();
server = dbus_server_listen ("debug:name=test-server", &result);
dbus_server_set_new_connection_function (server,
new_connection_callback,
NULL, NULL);
- dbus_server_set_timeout_functions (server,
- add_timeout, remove_timeout,
- NULL, NULL);
+ bus_test_loop_hookup_with_server (server);
if (server == NULL)
{
fprintf (stderr, "Failed to start server: %s\n",
@@ -158,34 +229,10 @@ main (int argc,
return 1;
}
- connection = dbus_connection_open ("debug:name=test-server", &result);
- dbus_connection_set_timeout_functions (connection,
- add_timeout, remove_timeout,
- NULL, NULL);
- if (connection == NULL)
- {
- fprintf (stderr, "Failed to connect to server: %s\n",
- dbus_result_to_string (result));
- return 1;
- }
-
- message = dbus_message_new (DBUS_SERVICE_DBUS,
- DBUS_MESSAGE_HELLO);
- dbus_message_append_args (message,
- DBUS_TYPE_STRING, "test",
- 0);
-
- handler = dbus_message_handler_new (message_handler, NULL, NULL);
- dbus_connection_add_filter (connection, handler);
-
- dbus_connection_send_message (connection, message, NULL, NULL);
- dbus_message_unref (message);
-
- bus_connection_init ();
-
- loop_run ();
-
- dbus_connection_disconnect (connection);
+ if (!test_hello_replies ())
+ die ("hello with replies");
+ printf ("all tests succeeded\n");
+
return 0;
}