Home | History | Annotate | Download | only in test
      1 
      2 #include "test-utils.h"
      3 
      4 static DBusLoop *loop;
      5 static dbus_bool_t already_quit = FALSE;
      6 static dbus_bool_t hello_from_self_reply_received = FALSE;
      7 
      8 static void
      9 quit (void)
     10 {
     11   if (!already_quit)
     12     {
     13       _dbus_loop_quit (loop);
     14       already_quit = TRUE;
     15     }
     16 }
     17 
     18 static void
     19 die (const char *message)
     20 {
     21   fprintf (stderr, "*** test-service: %s", message);
     22   exit (1);
     23 }
     24 
     25 static void
     26 check_hello_from_self_reply (DBusPendingCall *pcall,
     27                              void *user_data)
     28 {
     29   DBusMessage *reply;
     30   DBusMessage *echo_message, *echo_reply = NULL;
     31   DBusError error;
     32   DBusConnection *connection;
     33 
     34   int type;
     35 
     36   dbus_error_init (&error);
     37 
     38   connection = dbus_bus_get (DBUS_BUS_STARTER, &error);
     39   if (connection == NULL)
     40     {
     41       fprintf (stderr, "*** Failed to open connection to activating message bus: %s\n",
     42                error.message);
     43       dbus_error_free (&error);
     44       die("no memory");
     45     }
     46 
     47 
     48   echo_message = (DBusMessage *)user_data;
     49 
     50   reply = dbus_pending_call_steal_reply (pcall);
     51 
     52   type = dbus_message_get_type (reply);
     53 
     54   if (type == DBUS_MESSAGE_TYPE_METHOD_RETURN)
     55     {
     56       const char *s;
     57       printf ("Reply from HelloFromSelf received\n");
     58 
     59       if (!dbus_message_get_args (echo_message,
     60                               &error,
     61                               DBUS_TYPE_STRING, &s,
     62                               DBUS_TYPE_INVALID))
     63         {
     64             echo_reply = dbus_message_new_error (echo_message,
     65                                       error.name,
     66                                       error.message);
     67 
     68             if (echo_reply == NULL)
     69               die ("No memory\n");
     70 
     71         }
     72       else
     73         {
     74           echo_reply = dbus_message_new_method_return (echo_message);
     75           if (echo_reply == NULL)
     76             die ("No memory\n");
     77 
     78           if (!dbus_message_append_args (echo_reply,
     79                                  DBUS_TYPE_STRING, &s,
     80                                  DBUS_TYPE_INVALID))
     81             die ("No memory");
     82         }
     83 
     84       if (!dbus_connection_send (connection, echo_reply, NULL))
     85         die ("No memory\n");
     86 
     87       dbus_message_unref (echo_reply);
     88     }
     89   else if (type == DBUS_MESSAGE_TYPE_ERROR)
     90     {
     91       dbus_set_error_from_message (&error, reply);
     92       printf ("Error type in reply: %s\n", error.message);
     93 
     94       if (strcmp (error.name, DBUS_ERROR_NO_MEMORY) != 0)
     95         {
     96             echo_reply = dbus_message_new_error (echo_reply,
     97                                       error.name,
     98                                       error.message);
     99 
    100             if (echo_reply == NULL)
    101               die ("No memory\n");
    102 
    103             if (!dbus_connection_send (connection, echo_reply, NULL))
    104               die ("No memory\n");
    105 
    106             dbus_message_unref (echo_reply);
    107         }
    108       dbus_error_free (&error);
    109     }
    110   else
    111      _dbus_assert_not_reached ("Unexpected message received\n");
    112 
    113   hello_from_self_reply_received = TRUE;
    114 
    115   dbus_message_unref (reply);
    116   dbus_message_unref (echo_message);
    117   dbus_pending_call_unref (pcall);
    118   dbus_connection_unref (connection);
    119 }
    120 
    121 static DBusHandlerResult
    122 handle_run_hello_from_self (DBusConnection     *connection,
    123                                                DBusMessage        *message)
    124 {
    125   DBusError error;
    126   DBusMessage *reply, *self_message;
    127   DBusPendingCall *pcall;
    128   char *s;
    129 
    130   _dbus_verbose ("sending reply to Echo method\n");
    131 
    132   dbus_error_init (&error);
    133 
    134   if (!dbus_message_get_args (message,
    135                               &error,
    136                               DBUS_TYPE_STRING, &s,
    137                               DBUS_TYPE_INVALID))
    138     {
    139       reply = dbus_message_new_error (message,
    140                                       error.name,
    141                                       error.message);
    142 
    143       if (reply == NULL)
    144         die ("No memory\n");
    145 
    146       if (!dbus_connection_send (connection, reply, NULL))
    147         die ("No memory\n");
    148 
    149       dbus_message_unref (reply);
    150 
    151       return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
    152     }
    153     printf ("Sending HelloFromSelf\n");
    154 
    155  _dbus_verbose ("*** Sending message to self\n");
    156  self_message = dbus_message_new_method_call ("org.freedesktop.DBus.TestSuiteEchoService",
    157                                           "/org/freedesktop/TestSuite",
    158                                           "org.freedesktop.TestSuite",
    159                                           "HelloFromSelf");
    160 
    161   if (self_message == NULL)
    162     die ("No memory");
    163 
    164   if (!dbus_connection_send_with_reply (connection, self_message, &pcall, -1))
    165     die("No memory");
    166 
    167   dbus_message_ref (message);
    168   if (!dbus_pending_call_set_notify (pcall, check_hello_from_self_reply, (void *)message, NULL))
    169     die("No memory");
    170 
    171   printf ("Sent HelloFromSelf\n");
    172   return DBUS_HANDLER_RESULT_HANDLED;
    173 }
    174 
    175 static DBusHandlerResult
    176 handle_echo (DBusConnection     *connection,
    177              DBusMessage        *message)
    178 {
    179   DBusError error;
    180   DBusMessage *reply;
    181   char *s;
    182 
    183   _dbus_verbose ("sending reply to Echo method\n");
    184 
    185   dbus_error_init (&error);
    186 
    187   if (!dbus_message_get_args (message,
    188                               &error,
    189                               DBUS_TYPE_STRING, &s,
    190                               DBUS_TYPE_INVALID))
    191     {
    192       reply = dbus_message_new_error (message,
    193                                       error.name,
    194                                       error.message);
    195 
    196       if (reply == NULL)
    197         die ("No memory\n");
    198 
    199       if (!dbus_connection_send (connection, reply, NULL))
    200         die ("No memory\n");
    201 
    202       dbus_message_unref (reply);
    203 
    204       return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
    205     }
    206 
    207   reply = dbus_message_new_method_return (message);
    208   if (reply == NULL)
    209     die ("No memory\n");
    210 
    211   if (!dbus_message_append_args (reply,
    212                                  DBUS_TYPE_STRING, &s,
    213                                  DBUS_TYPE_INVALID))
    214     die ("No memory");
    215 
    216   if (!dbus_connection_send (connection, reply, NULL))
    217     die ("No memory\n");
    218 
    219   fprintf (stderr, "Echo service echoed string: \"%s\"\n", s);
    220 
    221   dbus_message_unref (reply);
    222 
    223   return DBUS_HANDLER_RESULT_HANDLED;
    224 }
    225 
    226 static void
    227 path_unregistered_func (DBusConnection  *connection,
    228                         void            *user_data)
    229 {
    230   /* connection was finalized */
    231 }
    232 
    233 static DBusHandlerResult
    234 path_message_func (DBusConnection  *connection,
    235                    DBusMessage     *message,
    236                    void            *user_data)
    237 {
    238   if (dbus_message_is_method_call (message,
    239                                    "org.freedesktop.TestSuite",
    240                                    "Echo"))
    241     return handle_echo (connection, message);
    242   else if (dbus_message_is_method_call (message,
    243                                         "org.freedesktop.TestSuite",
    244                                         "Exit"))
    245     {
    246       quit ();
    247       return DBUS_HANDLER_RESULT_HANDLED;
    248     }
    249   else if (dbus_message_is_method_call (message,
    250                                         "org.freedesktop.TestSuite",
    251                                         "EmitFoo"))
    252     {
    253       /* Emit the Foo signal */
    254       DBusMessage *signal;
    255       double v_DOUBLE;
    256 
    257       _dbus_verbose ("emitting signal Foo\n");
    258 
    259       signal = dbus_message_new_signal ("/org/freedesktop/TestSuite",
    260                                         "org.freedesktop.TestSuite",
    261                                         "Foo");
    262       if (signal == NULL)
    263         die ("No memory\n");
    264 
    265       v_DOUBLE = 42.6;
    266       if (!dbus_message_append_args (signal,
    267                                      DBUS_TYPE_DOUBLE, &v_DOUBLE,
    268                                      DBUS_TYPE_INVALID))
    269         die ("No memory");
    270 
    271       if (!dbus_connection_send (connection, signal, NULL))
    272         die ("No memory\n");
    273 
    274       return DBUS_HANDLER_RESULT_HANDLED;
    275     }
    276 
    277   else if (dbus_message_is_method_call (message,
    278                                    "org.freedesktop.TestSuite",
    279                                    "RunHelloFromSelf"))
    280     {
    281       return handle_run_hello_from_self (connection, message);
    282     }
    283   else if (dbus_message_is_method_call (message,
    284                                         "org.freedesktop.TestSuite",
    285                                         "HelloFromSelf"))
    286     {
    287         DBusMessage *reply;
    288         printf ("Received the HelloFromSelf message\n");
    289 
    290         reply = dbus_message_new_method_return (message);
    291         if (reply == NULL)
    292           die ("No memory");
    293 
    294         if (!dbus_connection_send (connection, reply, NULL))
    295           die ("No memory");
    296 
    297         return DBUS_HANDLER_RESULT_HANDLED;
    298     }
    299   else
    300     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
    301 }
    302 
    303 static DBusObjectPathVTable
    304 echo_vtable = {
    305   path_unregistered_func,
    306   path_message_func,
    307   NULL,
    308 };
    309 
    310 
    311 static const char* echo_path = "/org/freedesktop/TestSuite" ;
    312 
    313 static DBusHandlerResult
    314 filter_func (DBusConnection     *connection,
    315              DBusMessage        *message,
    316              void               *user_data)
    317 {
    318   if (dbus_message_is_signal (message,
    319                               DBUS_INTERFACE_LOCAL,
    320                               "Disconnected"))
    321     {
    322       quit ();
    323       return DBUS_HANDLER_RESULT_HANDLED;
    324     }
    325   else
    326     {
    327       return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
    328     }
    329 }
    330 
    331 int
    332 main (int    argc,
    333       char **argv)
    334 {
    335   DBusError error;
    336   int result;
    337   DBusConnection *connection;
    338 
    339   dbus_error_init (&error);
    340   connection = dbus_bus_get (DBUS_BUS_STARTER, &error);
    341   if (connection == NULL)
    342     {
    343       fprintf (stderr, "*** Failed to open connection to activating message bus: %s\n",
    344                error.message);
    345       dbus_error_free (&error);
    346       return 1;
    347     }
    348 
    349   loop = _dbus_loop_new ();
    350   if (loop == NULL)
    351     die ("No memory\n");
    352 
    353   if (!test_connection_setup (loop, connection))
    354     die ("No memory\n");
    355 
    356   if (!dbus_connection_add_filter (connection,
    357                                    filter_func, NULL, NULL))
    358     die ("No memory");
    359 
    360   if (!dbus_connection_register_object_path (connection,
    361                                              echo_path,
    362                                              &echo_vtable,
    363                                              (void*) 0xdeadbeef))
    364     die ("No memory");
    365 
    366   {
    367     void *d;
    368     if (!dbus_connection_get_object_path_data (connection, echo_path, &d))
    369       die ("No memory");
    370     if (d != (void*) 0xdeadbeef)
    371       die ("dbus_connection_get_object_path_data() doesn't seem to work right\n");
    372   }
    373 
    374   result = dbus_bus_request_name (connection, "org.freedesktop.DBus.TestSuiteEchoService",
    375                                   0, &error);
    376   if (dbus_error_is_set (&error))
    377     {
    378       fprintf (stderr, "Error %s\n", error.message);
    379       _dbus_verbose ("*** Failed to acquire service: %s\n",
    380                      error.message);
    381       dbus_error_free (&error);
    382       exit (1);
    383     }
    384 
    385   _dbus_verbose ("*** Test service entering main loop\n");
    386   _dbus_loop_run (loop);
    387 
    388   test_connection_shutdown (loop, connection);
    389 
    390   dbus_connection_remove_filter (connection, filter_func, NULL);
    391 
    392   dbus_connection_unref (connection);
    393 
    394   _dbus_loop_unref (loop);
    395   loop = NULL;
    396 
    397   dbus_shutdown ();
    398 
    399   _dbus_verbose ("*** Test service exiting\n");
    400 
    401   return 0;
    402 }
    403