diff options
author | Colin Walters <walters@verbum.org> | 2008-05-30 17:11:15 -0400 |
---|---|---|
committer | Colin Walters <walters@verbum.org> | 2008-05-30 17:11:15 -0400 |
commit | 5e359834f28b0580e7b79a057614d4e3592709ac (patch) | |
tree | 7fcf7e5f72aa49783544010917f2d9f185415a8e /test/name-test/test-privserver.c | |
parent | a73a79a155e97a3bd0d3ce5001ca6b9db803eeeb (diff) |
Add "PrivServer" test which exercises DBusServer and dbus_shutdown
* test/data/valid-service-files/org.freedesktop.DBus.TestSuite.PrivServer.service.in:
New service file for PrivServer.
* configure.in: Generate it.
* test/name-test/Makefile.am: Build test-privserver and
test-privserver-client.
* test/name-test/test-privserver.c: Use DBusServer to
serve a private connection.
* test/name-test/test-privserver-client.c: Connect
via session bus and get address of private server,
exercise dbus_shutdown().
* test/name-test/run-test.sh: Run it.
Diffstat (limited to 'test/name-test/test-privserver.c')
-rw-r--r-- | test/name-test/test-privserver.c | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/test/name-test/test-privserver.c b/test/name-test/test-privserver.c new file mode 100644 index 00000000..8a6efc4e --- /dev/null +++ b/test/name-test/test-privserver.c @@ -0,0 +1,118 @@ +#include "../test-utils.h" + +static void +die (const char *message, ...) +{ + va_list args; + va_start (args, message); + vfprintf (stderr, message, args); + va_end (args); + exit (1); +} + +typedef struct TestServiceData TestServiceData; + +struct TestServiceData +{ + DBusLoop *loop; + char *private_addr; +}; + +static void +new_connection_callback (DBusServer *server, + DBusConnection *new_connection, + void *data) +{ + TestServiceData *testdata = data; + + if (!test_connection_setup (testdata->loop, new_connection)) + dbus_connection_close (new_connection); +} + +static DBusHandlerResult +filter_session_message (DBusConnection *connection, + DBusMessage *message, + void *user_data) +{ + TestServiceData *testdata = user_data; + + if (dbus_message_is_method_call (message, + "org.freedesktop.DBus.TestSuite.TestServer", + "GetPrivateAddress")) + { + DBusMessage *reply; + reply = dbus_message_new_method_return (message); + dbus_message_append_args (reply, DBUS_TYPE_STRING, + &(testdata->private_addr), DBUS_TYPE_INVALID); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + return DBUS_HANDLER_RESULT_HANDLED; + } + else if (dbus_message_is_method_call (message, + "org.freedesktop.DBus.TestSuite.TestServer", + "Quit")) + { + fprintf (stderr, "server exiting loop\n"); + _dbus_loop_quit (testdata->loop); + return DBUS_HANDLER_RESULT_HANDLED; + } + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +int +main (int argc, char *argv[]) +{ + DBusServer *server; + DBusError error; + DBusLoop *loop; + DBusConnection *session; + TestServiceData *testdata; + + dbus_error_init (&error); + + loop = _dbus_loop_new (); + + testdata = dbus_new (TestServiceData, 1); + testdata->loop = loop; + + session = dbus_bus_get (DBUS_BUS_SESSION, &error); + if (!session) + die ("couldn't access session bus"); + + test_connection_setup (loop, session); + + dbus_bus_request_name (session, "org.freedesktop.DBus.TestSuite.TestServer", 0, &error); + if (dbus_error_is_set (&error)) + die ("couldn't request name: %s", error.message); + + if (!dbus_connection_add_filter (session, filter_session_message, testdata, NULL)) + die ("couldn't add filter"); + + server = dbus_server_listen ("unix:tmpdir=/tmp", &error); + if (!server) + die (error.message); + testdata->private_addr = dbus_server_get_address (server); + printf ("test server listening on %s\n", testdata->private_addr); + + dbus_server_set_new_connection_function (server, new_connection_callback, + testdata, NULL); + + if (!test_server_setup (loop, server)) + die ("server setup failed"); + + fprintf (stderr, "server running mainloop\n"); + _dbus_loop_run (loop); + fprintf (stderr, "server mainloop quit\n"); + + test_server_shutdown (loop, server); + + test_connection_shutdown (loop, session); + + dbus_connection_unref (session); + + _dbus_loop_unref (loop); + + dbus_free (testdata); + + return 0; +} |