Add IgnoreOnIsolate=yes to dbus.service
[platform/upstream/dbus.git] / test / name-test / test-privserver-client.c
1 #include <config.h>
2 #include "../test-utils.h"
3
4 static void die (const char *message,
5                  ...) _DBUS_GNUC_NORETURN _DBUS_GNUC_PRINTF (1, 2);
6
7 static void
8 die (const char *message, ...)
9 {
10   va_list args;
11   va_start (args, message);
12   vfprintf (stderr, message, args);
13   va_end (args);
14   exit (1);
15 }
16
17 #define PRIVSERVER_SERVICE "org.freedesktop.DBus.TestSuite.PrivServer"
18 #define PRIVSERVER_INTERFACE PRIVSERVER_SERVICE
19 #define PRIVSERVER_DIED_RULE \
20       "type='signal',sender='" DBUS_SERVICE_DBUS "'," \
21       "interface='" DBUS_INTERFACE_DBUS "',member='NameOwnerChanged'," \
22       "arg0='" PRIVSERVER_SERVICE "',arg2=''"
23
24 static DBusHandlerResult
25 filter_session_message (DBusConnection     *connection,
26                         DBusMessage        *message,
27                         void               *user_data)
28 {
29   dbus_bool_t *service_died_p = user_data;
30   const char *name, *old_owner, *new_owner;
31
32   if (dbus_message_is_signal (message,
33                               DBUS_INTERFACE_DBUS,
34                               "NameOwnerChanged") &&
35       dbus_message_has_sender (message, DBUS_SERVICE_DBUS) &&
36       dbus_message_get_args (message, NULL,
37                              DBUS_TYPE_STRING, &name,
38                              DBUS_TYPE_STRING, &old_owner,
39                              DBUS_TYPE_STRING, &new_owner,
40                              DBUS_TYPE_INVALID) &&
41       strcmp (name, PRIVSERVER_SERVICE) == 0 &&
42       old_owner[0] != '\0' &&
43       new_owner[0] == '\0')
44     {
45       *service_died_p = TRUE;
46     }
47
48   return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
49 }
50
51 static DBusHandlerResult 
52 filter_private_message (DBusConnection     *connection,
53                         DBusMessage        *message,
54                         void               *user_data)
55 {
56   dbus_bool_t *private_conn_lost_p = user_data;
57
58   if (dbus_message_is_signal (message,
59                               DBUS_INTERFACE_LOCAL,
60                               "Disconnected"))
61     {
62       *private_conn_lost_p = TRUE;
63     }
64   return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
65 }
66
67 static void
68 open_shutdown_private_connection (dbus_bool_t use_guid)
69 {
70   DBusError error;
71   DBusLoop *loop;
72   DBusConnection *session;
73   DBusMessage *msg;
74   DBusMessage *reply;
75   DBusConnection *privconn;
76   char *addr;
77   dbus_bool_t service_died;
78   dbus_bool_t private_conn_lost;
79
80   dbus_error_init (&error);
81   service_died = FALSE;
82   private_conn_lost = FALSE;
83
84   loop = _dbus_loop_new ();
85
86   session = dbus_bus_get (DBUS_BUS_SESSION, &error);
87   if (!session)
88     die ("couldn't access session bus\n");
89   dbus_connection_set_exit_on_disconnect (session, FALSE);
90   test_connection_setup (loop, session);
91
92   dbus_bus_add_match (session, PRIVSERVER_DIED_RULE, &error);
93   if (dbus_error_is_set (&error))
94     die ("couldn't add match rule \"%s\": %s: %s", PRIVSERVER_DIED_RULE,
95          error.name, error.message);
96
97   if (!dbus_connection_add_filter (session, filter_session_message,
98                                    &service_died, NULL))
99     die ("couldn't add filter to session bus\n");
100
101   msg = dbus_message_new_method_call (PRIVSERVER_SERVICE, "/",
102                                       PRIVSERVER_INTERFACE, "GetPrivateAddress");
103   if (!(reply = dbus_connection_send_with_reply_and_block (session, msg, -1, &error)))
104     die ("couldn't send message: %s\n", error.message);
105   dbus_message_unref (msg);
106
107   if (dbus_set_error_from_message (&error, reply))
108     die ("%s: %s", error.name, error.message);
109
110   if (!dbus_message_get_args (reply, &error, DBUS_TYPE_STRING, &addr, DBUS_TYPE_INVALID))
111     die ("couldn't parse message replym\n");
112   printf ("# got private temp address %s\n", addr);
113   addr = strdup (addr);
114   if (!use_guid)
115     {
116       char *comma = strrchr (addr, ',');
117       if (comma)
118         *comma = '\0';
119     }
120   privconn = dbus_connection_open (addr, &error);
121   free (addr);
122   if (!privconn)
123     die ("couldn't connect to server direct connection: %s\n", error.message);
124   dbus_message_unref (reply);
125
126   dbus_connection_set_exit_on_disconnect (privconn, FALSE);
127   if (!dbus_connection_add_filter (privconn, filter_private_message,
128                                    &private_conn_lost, NULL))
129     die ("couldn't add filter to private connection\n");
130   test_connection_setup (loop, privconn);
131
132   msg = dbus_message_new_method_call (PRIVSERVER_SERVICE, "/",
133                                       PRIVSERVER_INTERFACE, "Quit");
134   if (!dbus_connection_send (session, msg, NULL))
135     die ("couldn't send Quit message\n");
136   dbus_message_unref (msg);
137
138   while (!service_died || !private_conn_lost)
139     _dbus_loop_iterate (loop, TRUE);
140
141   dbus_connection_remove_filter (session, filter_session_message,
142                                  &service_died);
143   dbus_bus_remove_match (session, PRIVSERVER_DIED_RULE, NULL);
144   test_connection_shutdown (loop, session);
145   dbus_connection_unref (session);
146
147   test_connection_shutdown (loop, privconn);
148   dbus_connection_remove_filter (privconn, filter_private_message,
149                                  &private_conn_lost);
150   dbus_connection_unref (privconn);
151
152   _dbus_loop_unref (loop);
153 }
154
155 /* This test outputs TAP syntax: http://testanything.org/ */
156 int
157 main (int argc, char *argv[])
158 {
159   int test_num = 0;
160
161   open_shutdown_private_connection (TRUE);
162
163   dbus_shutdown ();
164   printf ("ok %d\n", ++test_num);
165
166   open_shutdown_private_connection (TRUE);
167
168   dbus_shutdown ();
169   printf ("ok %d\n", ++test_num);
170
171   open_shutdown_private_connection (FALSE);
172
173   dbus_shutdown ();
174   printf ("ok %d\n", ++test_num);
175
176   open_shutdown_private_connection (FALSE);
177
178   dbus_shutdown ();
179   printf ("ok %d\n", ++test_num);
180
181   printf ("1..%d\n", test_num);
182   return 0;
183 }