2006-10-01 Havoc Pennington <hp@redhat.com>
[platform/upstream/dbus.git] / test / test-service.c
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 }