test-service.c revision f7beca572b341c4cabf2f97a9f0d6d763e6acb40
198572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington 298572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington#include "test-utils.h" 398572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington 498572905e60cac7ea971aa0830e2a629bfff208dHavoc Penningtonstatic DBusLoop *loop; 551781f541094a4936d47119cd62682e0431c41e9Havoc Penningtonstatic dbus_bool_t already_quit = FALSE; 6fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington 7fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Penningtonstatic void 8fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Penningtonquit (void) 9fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington{ 10fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington if (!already_quit) 11fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington { 12fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington _dbus_loop_quit (loop); 13fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington already_quit = TRUE; 14fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington } 15fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington} 16eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington 17f216e81432ddf04889202c33a6e68113f94d7611Havoc Penningtonstatic void 18f216e81432ddf04889202c33a6e68113f94d7611Havoc Penningtondie (const char *message) 19f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington{ 20f7beca572b341c4cabf2f97a9f0d6d763e6acb40Havoc Pennington fprintf (stderr, "*** test-service: %s", message); 21f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington exit (1); 22f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington} 23f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 24f216e81432ddf04889202c33a6e68113f94d7611Havoc Penningtonstatic DBusHandlerResult 25a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Penningtonhandle_echo (DBusConnection *connection, 26a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Pennington DBusMessage *message) 27f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington{ 28f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington DBusError error; 29f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington DBusMessage *reply; 30f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington char *s; 3175742242000e782719bc1656f0a7da72b059e88eHavoc Pennington 3275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington _dbus_verbose ("sending reply to Echo method\n"); 33f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 34f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington dbus_error_init (&error); 35f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 36f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington if (!dbus_message_get_args (message, 37f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington &error, 38f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington DBUS_TYPE_STRING, &s, 39f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington DBUS_TYPE_INVALID)) 40f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington { 41b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington reply = dbus_message_new_error (message, 42b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington error.name, 43b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington error.message); 44f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 45f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington if (reply == NULL) 46f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington die ("No memory\n"); 47f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 48f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington if (!dbus_connection_send (connection, reply, NULL)) 49f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington die ("No memory\n"); 50f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 51f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington dbus_message_unref (reply); 52f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 535c1a8e44903bd1dedc8cbefad78b0c8b61daada5Havoc Pennington return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; 54f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington } 55f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 56b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington reply = dbus_message_new_method_return (message); 57f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington if (reply == NULL) 58f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington die ("No memory\n"); 59c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 60d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington if (!dbus_message_append_args (reply, 61d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington DBUS_TYPE_STRING, s, 62d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington DBUS_TYPE_INVALID)) 63f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington die ("No memory"); 64d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 65f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington if (!dbus_connection_send (connection, reply, NULL)) 66f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington die ("No memory\n"); 67d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 68d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington fprintf (stderr, "Echo service echoed string: \"%s\"\n", s); 69f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 70f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington dbus_free (s); 71f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 72f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington dbus_message_unref (reply); 73f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 74d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington return DBUS_HANDLER_RESULT_HANDLED; 75f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington} 76f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 7775742242000e782719bc1656f0a7da72b059e88eHavoc Penningtonstatic void 7875742242000e782719bc1656f0a7da72b059e88eHavoc Penningtonpath_unregistered_func (DBusConnection *connection, 7975742242000e782719bc1656f0a7da72b059e88eHavoc Pennington void *user_data) 8075742242000e782719bc1656f0a7da72b059e88eHavoc Pennington{ 8175742242000e782719bc1656f0a7da72b059e88eHavoc Pennington /* connection was finalized */ 8275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington} 8375742242000e782719bc1656f0a7da72b059e88eHavoc Pennington 84a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Penningtonstatic DBusHandlerResult 8575742242000e782719bc1656f0a7da72b059e88eHavoc Penningtonpath_message_func (DBusConnection *connection, 8675742242000e782719bc1656f0a7da72b059e88eHavoc Pennington DBusMessage *message, 8775742242000e782719bc1656f0a7da72b059e88eHavoc Pennington void *user_data) 8875742242000e782719bc1656f0a7da72b059e88eHavoc Pennington{ 8968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington if (dbus_message_is_method_call (message, 9068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington "org.freedesktop.TestSuite", 9168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington "Echo")) 92a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Pennington return handle_echo (connection, message); 9368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington else if (dbus_message_is_method_call (message, 9468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington "org.freedesktop.TestSuite", 9575742242000e782719bc1656f0a7da72b059e88eHavoc Pennington "Exit")) 9675742242000e782719bc1656f0a7da72b059e88eHavoc Pennington { 9775742242000e782719bc1656f0a7da72b059e88eHavoc Pennington dbus_connection_disconnect (connection); 9875742242000e782719bc1656f0a7da72b059e88eHavoc Pennington quit (); 9975742242000e782719bc1656f0a7da72b059e88eHavoc Pennington return DBUS_HANDLER_RESULT_HANDLED; 10075742242000e782719bc1656f0a7da72b059e88eHavoc Pennington } 10175742242000e782719bc1656f0a7da72b059e88eHavoc Pennington else if (dbus_message_is_method_call (message, 10275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington "org.freedesktop.TestSuite", 10375742242000e782719bc1656f0a7da72b059e88eHavoc Pennington "EmitFoo")) 10475742242000e782719bc1656f0a7da72b059e88eHavoc Pennington { 10575742242000e782719bc1656f0a7da72b059e88eHavoc Pennington /* Emit the Foo signal */ 10675742242000e782719bc1656f0a7da72b059e88eHavoc Pennington DBusMessage *signal; 10775742242000e782719bc1656f0a7da72b059e88eHavoc Pennington 10875742242000e782719bc1656f0a7da72b059e88eHavoc Pennington _dbus_verbose ("emitting signal Foo\n"); 10975742242000e782719bc1656f0a7da72b059e88eHavoc Pennington 11075742242000e782719bc1656f0a7da72b059e88eHavoc Pennington signal = dbus_message_new_signal ("/org/freedesktop/TestSuite", 11175742242000e782719bc1656f0a7da72b059e88eHavoc Pennington "org.freedesktop.TestSuite", 11275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington "Foo"); 11375742242000e782719bc1656f0a7da72b059e88eHavoc Pennington if (signal == NULL) 11475742242000e782719bc1656f0a7da72b059e88eHavoc Pennington die ("No memory\n"); 11575742242000e782719bc1656f0a7da72b059e88eHavoc Pennington 11675742242000e782719bc1656f0a7da72b059e88eHavoc Pennington if (!dbus_message_append_args (signal, 11775742242000e782719bc1656f0a7da72b059e88eHavoc Pennington DBUS_TYPE_DOUBLE, 42.6, 11875742242000e782719bc1656f0a7da72b059e88eHavoc Pennington DBUS_TYPE_INVALID)) 11975742242000e782719bc1656f0a7da72b059e88eHavoc Pennington die ("No memory"); 12075742242000e782719bc1656f0a7da72b059e88eHavoc Pennington 12175742242000e782719bc1656f0a7da72b059e88eHavoc Pennington if (!dbus_connection_send (connection, signal, NULL)) 12275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington die ("No memory\n"); 12375742242000e782719bc1656f0a7da72b059e88eHavoc Pennington 12475742242000e782719bc1656f0a7da72b059e88eHavoc Pennington return DBUS_HANDLER_RESULT_HANDLED; 12575742242000e782719bc1656f0a7da72b059e88eHavoc Pennington } 12675742242000e782719bc1656f0a7da72b059e88eHavoc Pennington else 12775742242000e782719bc1656f0a7da72b059e88eHavoc Pennington return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; 12875742242000e782719bc1656f0a7da72b059e88eHavoc Pennington} 12975742242000e782719bc1656f0a7da72b059e88eHavoc Pennington 13075742242000e782719bc1656f0a7da72b059e88eHavoc Penningtonstatic DBusObjectPathVTable 13175742242000e782719bc1656f0a7da72b059e88eHavoc Penningtonecho_vtable = { 13275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington path_unregistered_func, 13375742242000e782719bc1656f0a7da72b059e88eHavoc Pennington path_message_func, 13475742242000e782719bc1656f0a7da72b059e88eHavoc Pennington NULL, 13575742242000e782719bc1656f0a7da72b059e88eHavoc Pennington}; 13675742242000e782719bc1656f0a7da72b059e88eHavoc Pennington 13796f6740f2fbc16c7ee220d3d5abdc94e22da78f3Olivier Andrieu 13896f6740f2fbc16c7ee220d3d5abdc94e22da78f3Olivier Andrieustatic const char* echo_path = "/org/freedesktop/TestSuite" ; 13975742242000e782719bc1656f0a7da72b059e88eHavoc Pennington 14075742242000e782719bc1656f0a7da72b059e88eHavoc Penningtonstatic DBusHandlerResult 14175742242000e782719bc1656f0a7da72b059e88eHavoc Penningtonfilter_func (DBusConnection *connection, 14275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington DBusMessage *message, 14375742242000e782719bc1656f0a7da72b059e88eHavoc Pennington void *user_data) 14475742242000e782719bc1656f0a7da72b059e88eHavoc Pennington{ 14575742242000e782719bc1656f0a7da72b059e88eHavoc Pennington if (dbus_message_is_signal (message, 14675742242000e782719bc1656f0a7da72b059e88eHavoc Pennington DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL, 14775742242000e782719bc1656f0a7da72b059e88eHavoc Pennington "Disconnected")) 148a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Pennington { 149fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington dbus_connection_disconnect (connection); 150fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington quit (); 1515c1a8e44903bd1dedc8cbefad78b0c8b61daada5Havoc Pennington return DBUS_HANDLER_RESULT_HANDLED; 152a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Pennington } 153a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Pennington else 154a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Pennington { 1555c1a8e44903bd1dedc8cbefad78b0c8b61daada5Havoc Pennington return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; 156a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Pennington } 157a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Pennington} 158a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Pennington 159eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Penningtonint 160eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Penningtonmain (int argc, 161eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington char **argv) 162eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington{ 163eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington DBusConnection *connection; 164eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington DBusError error; 165f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington int result; 166f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 167eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington dbus_error_init (&error); 16875742242000e782719bc1656f0a7da72b059e88eHavoc Pennington connection = dbus_bus_get (DBUS_BUS_ACTIVATION, &error); 169eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington if (connection == NULL) 170eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington { 17175742242000e782719bc1656f0a7da72b059e88eHavoc Pennington fprintf (stderr, "*** Failed to open connection to activating message bus: %s\n", 17275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington error.message); 173eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington dbus_error_free (&error); 174eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington return 1; 175eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington } 176eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington 17798572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington loop = _dbus_loop_new (); 17898572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington if (loop == NULL) 17998572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington die ("No memory\n"); 18098572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington 18198572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington if (!test_connection_setup (loop, connection)) 18298572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington die ("No memory\n"); 183f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 1841dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington if (!dbus_connection_add_filter (connection, 1851dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington filter_func, NULL, NULL)) 186f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington die ("No memory"); 187f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 18875742242000e782719bc1656f0a7da72b059e88eHavoc Pennington if (!dbus_connection_register_object_path (connection, 18975742242000e782719bc1656f0a7da72b059e88eHavoc Pennington echo_path, 19075742242000e782719bc1656f0a7da72b059e88eHavoc Pennington &echo_vtable, 19175742242000e782719bc1656f0a7da72b059e88eHavoc Pennington NULL)) 19275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington die ("No memory"); 193f4cffc0e49d48a8dbf158230d7e816d8713566daSeth Nickell 194f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington result = dbus_bus_acquire_service (connection, "org.freedesktop.DBus.TestSuiteEchoService", 195f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 0, &error); 196f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington if (dbus_error_is_set (&error)) 197f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington { 19896f6740f2fbc16c7ee220d3d5abdc94e22da78f3Olivier Andrieu fprintf (stderr, "Error %s\n", error.message); 19977eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington _dbus_verbose ("*** Failed to acquire service: %s\n", 20077eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington error.message); 201f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington dbus_error_free (&error); 202fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington exit (1); 203f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington } 20451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 20551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington _dbus_verbose ("*** Test service entering main loop\n"); 20698572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington _dbus_loop_run (loop); 207eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington 208fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington test_connection_shutdown (loop, connection); 2091dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington 2101dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington dbus_connection_remove_filter (connection, filter_func, NULL); 211fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington 212eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington dbus_connection_unref (connection); 21398572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington 21498572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington _dbus_loop_unref (loop); 21598572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington loop = NULL; 216f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 217f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington dbus_shutdown (); 218fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington 2191708094c0e00ab433bb0a51981f8b77d24aee256Havoc Pennington _dbus_verbose ("*** Test service exiting\n"); 220eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington 221eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington return 0; 222eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington} 223