342e806b6a9550f990ea96aed66e5bde68843f8b
[platform/upstream/dbus.git] / test / bus-test.c
1 #include <dbus/dbus.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4
5 #define DBUS_COMPILATION /* cheat and use DBusList */
6 #include <dbus/dbus-list.h>
7 #include <bus/connection.h>
8
9 #undef DBUS_COMPILATION
10
11 #include "debug-thread.h"
12 #include "bus-test-loop.h"
13
14
15 static DBusHandlerResult
16 message_handler (DBusMessageHandler *handler,
17                  DBusConnection     *connection,
18                  DBusMessage        *message,
19                  void               *user_data)
20 {
21   printf ("client got a message!: %s\n",
22           dbus_message_get_name (message));
23   return DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
24 }
25
26 static void
27 new_connection_callback (DBusServer     *server,
28                          DBusConnection *new_connection,
29                          void           *data)
30 {
31   if (!bus_connection_setup (new_connection))
32     return;
33
34   bus_test_loop_hookup_with_connection (new_connection);
35
36   dbus_connection_ref (new_connection);
37 }
38
39
40 static void
41 die (const char *failure)
42 {
43   fprintf (stderr, "Unit test failed: %s\n", failure);
44   exit (1);
45 }
46
47 /* Here are the tests */
48 static dbus_bool_t test_hello_succeeding = TRUE;
49 static char *client1_name, *client2_name;
50 static int client1_stage = 0, client2_stage = 0;
51
52 #define TEST_HELLO_HANDLE_FAIL(x) do { if (!(x)) { printf ("failed at line %d\n", __LINE__); test_hello_succeeding = FALSE; goto out;  } } while (0)
53
54                                    
55 static DBusHandlerResult
56 test_hello_client1_handler (DBusMessageHandler *handler,
57                             DBusConnection     *connection,
58                             DBusMessage        *message,
59                             void               *user_data)
60 {
61   char *tmp = NULL;
62
63   if (!test_hello_succeeding)
64     goto out;
65   
66   if (dbus_message_name_is (message, DBUS_MESSAGE_HELLO))
67     {
68       TEST_HELLO_HANDLE_FAIL (client1_stage == 0);
69
70       TEST_HELLO_HANDLE_FAIL ((dbus_message_get_args (message,
71                                                       DBUS_TYPE_STRING, &client1_name,
72                                                       0) == DBUS_RESULT_SUCCESS));
73
74       client1_stage += 1;
75     }
76   else if (dbus_message_name_is (message, DBUS_MESSAGE_SERVICE_CREATED))
77     {
78       TEST_HELLO_HANDLE_FAIL (client1_stage == 1 || client1_stage == 3);
79
80       TEST_HELLO_HANDLE_FAIL ((dbus_message_get_args (message,
81                                                       DBUS_TYPE_STRING, &tmp,
82                                                       0) == DBUS_RESULT_SUCCESS));
83       if (client1_stage == 1)
84         TEST_HELLO_HANDLE_FAIL (strcmp (client1_name, tmp) == 0);
85       else
86         TEST_HELLO_HANDLE_FAIL (strcmp (client2_name, tmp) == 0);
87
88       client1_stage += 1;
89
90       if (client1_stage == 4)
91         bus_test_loop_quit ();
92     }
93   else if (dbus_message_name_is (message, DBUS_MESSAGE_SERVICE_ACQUIRED))
94     {
95       TEST_HELLO_HANDLE_FAIL (client1_stage == 2);
96
97       TEST_HELLO_HANDLE_FAIL ((dbus_message_get_args (message,
98                                                       DBUS_TYPE_STRING, &tmp,
99                                                       0) == DBUS_RESULT_SUCCESS));
100       TEST_HELLO_HANDLE_FAIL (strcmp (client1_name, tmp) == 0);
101
102       client1_stage += 1;
103     }
104   else
105     {
106       printf ("client1 received unexpected message %s in stage %d\n",
107               dbus_message_get_name (message), client1_stage);
108       
109       test_hello_succeeding = FALSE;
110       goto out;
111     }
112
113  out:
114   if (tmp)
115     dbus_free (tmp);
116
117   return DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
118 }
119
120 static DBusHandlerResult
121 test_hello_client2_handler (DBusMessageHandler *handler,
122                             DBusConnection     *connection,
123                             DBusMessage        *message,
124                             void               *user_data)
125 {
126   char *tmp = NULL;
127   
128   if (!test_hello_succeeding)
129     goto out;
130
131   if (dbus_message_name_is (message, DBUS_MESSAGE_HELLO))
132     {
133       TEST_HELLO_HANDLE_FAIL (client2_stage == 0);
134
135       TEST_HELLO_HANDLE_FAIL ((dbus_message_get_args (message,
136                                                       DBUS_TYPE_STRING, &client2_name,
137                                                       0) == DBUS_RESULT_SUCCESS));
138
139       client2_stage += 1;
140     }
141   else if (dbus_message_name_is (message, DBUS_MESSAGE_SERVICE_CREATED))
142     {
143       TEST_HELLO_HANDLE_FAIL (client2_stage == 1);
144
145       TEST_HELLO_HANDLE_FAIL ((dbus_message_get_args (message,
146                                                       DBUS_TYPE_STRING, &tmp,
147                                                       0) == DBUS_RESULT_SUCCESS));
148       TEST_HELLO_HANDLE_FAIL (strcmp (client2_name, tmp) == 0);
149       
150       client2_stage += 1;
151     }
152   else if (dbus_message_name_is (message, DBUS_MESSAGE_SERVICE_ACQUIRED))
153     {
154       TEST_HELLO_HANDLE_FAIL (client2_stage == 2);
155
156       TEST_HELLO_HANDLE_FAIL ((dbus_message_get_args (message,
157                                                       DBUS_TYPE_STRING, &tmp,
158                                                       0) == DBUS_RESULT_SUCCESS));
159       TEST_HELLO_HANDLE_FAIL (strcmp (client2_name, tmp) == 0);
160
161       client2_stage += 1;
162     }
163   else
164     {
165       test_hello_succeeding = FALSE;
166       goto out;
167     }
168     
169  out:
170   if (tmp)
171     dbus_free (tmp);
172
173   return DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
174 }
175
176 static dbus_bool_t
177 test_hello_replies (void)
178 {
179   DBusConnection *connection;
180   DBusResultCode result;
181   DBusMessage *message;
182   DBusMessageHandler *handler;
183   
184   /* First start client 1 */
185   connection = dbus_connection_open ("debug:name=test-server", &result);
186   bus_test_loop_hookup_with_connection (connection);
187   message = dbus_message_new (DBUS_SERVICE_DBUS,
188                               DBUS_MESSAGE_HELLO);
189   handler = dbus_message_handler_new (test_hello_client1_handler, NULL, NULL);
190   dbus_connection_add_filter (connection, handler);
191   dbus_connection_send_message (connection, message, NULL, NULL);
192   dbus_message_unref (message);
193
194   /* Then start client 2 */
195   connection = dbus_connection_open ("debug:name=test-server", &result);
196   bus_test_loop_hookup_with_connection (connection);
197   message = dbus_message_new (DBUS_SERVICE_DBUS,
198                               DBUS_MESSAGE_HELLO);
199   handler = dbus_message_handler_new (test_hello_client2_handler, NULL, NULL);
200   dbus_connection_add_filter (connection, handler);
201   dbus_connection_send_message (connection, message, NULL, NULL);
202   dbus_message_unref (message);
203
204   bus_test_loop_run ();
205   
206   return test_hello_succeeding;
207 }
208
209 int
210 main (int    argc,
211       char **argv)
212 {
213   DBusServer *server;
214   DBusResultCode result;
215     
216   debug_threads_init ();
217
218   bus_connection_init ();
219   
220   server = dbus_server_listen ("debug:name=test-server", &result);
221   dbus_server_set_new_connection_function (server,
222                                            new_connection_callback,
223                                            NULL, NULL);
224   bus_test_loop_hookup_with_server (server);
225   if (server == NULL)
226     {
227       fprintf (stderr, "Failed to start server: %s\n",
228                dbus_result_to_string (result));
229       return 1;
230     }
231
232   if (!test_hello_replies ())
233     die ("hello with replies");
234
235   printf ("all tests succeeded\n");
236   
237   return 0;
238 }