Bug 15571: Clean up GUID-less connections correctly (Scott James Remnant)
[platform/upstream/dbus.git] / test / name-test / test-privserver-client.c
1 #include "../test-utils.h"
2
3 static void
4 die (const char *message, ...)
5 {
6   va_list args;
7   va_start (args, message);
8   vfprintf (stderr, message, args);
9   va_end (args);
10   exit (1);
11 }
12
13 static DBusHandlerResult 
14 filter_private_message (DBusConnection     *connection,
15                         DBusMessage        *message,
16                         void               *user_data)
17 {
18   if (dbus_message_is_signal (message,
19                               DBUS_INTERFACE_LOCAL,
20                               "Disconnected"))
21     {
22        DBusLoop *loop = user_data;      
23        _dbus_loop_quit (loop);
24        return DBUS_HANDLER_RESULT_HANDLED;
25     }
26   return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
27 }
28
29 static void
30 open_shutdown_private_connection (dbus_bool_t use_guid)
31 {
32   DBusError error;
33   DBusLoop *loop;
34   DBusConnection *session;
35   DBusMessage *msg;
36   DBusMessage *reply;
37   DBusConnection *privconn;
38   char *addr;
39   char *comma;
40
41   dbus_error_init (&error);
42
43   loop = _dbus_loop_new ();
44
45   session = dbus_bus_get (DBUS_BUS_SESSION, &error);
46   if (!session)
47     die ("couldn't access session bus\n");
48   dbus_connection_set_exit_on_disconnect (session, FALSE);
49   msg = dbus_message_new_method_call ("org.freedesktop.DBus.TestSuite.TestServer",
50                                       "/",
51                                       "org.freedesktop.DBus.TestSuite.TestServer",
52                                       "GetPrivateAddress");
53   if (!(reply = dbus_connection_send_with_reply_and_block (session, msg, -1, &error)))
54     die ("couldn't send message: %s\n", error.message);
55   dbus_message_unref (msg);
56   if (!dbus_message_get_args (reply, &error, DBUS_TYPE_STRING, &addr, DBUS_TYPE_INVALID))
57     die ("couldn't parse message replym\n");
58   printf ("got private temp address %s\n", addr);
59   addr = strdup (addr);
60   if (!use_guid)
61     {
62       char *comma = strrchr (addr, ',');
63       if (comma)
64         *comma = '\0';
65     }
66   privconn = dbus_connection_open (addr, &error);
67   free (addr);
68   if (!privconn)
69     die ("couldn't connect to server direct connection: %s\n", error.message);
70   dbus_message_unref (reply);
71
72   dbus_connection_set_exit_on_disconnect (privconn, FALSE);
73   dbus_connection_add_filter (privconn, filter_private_message, loop, NULL);
74   test_connection_setup (loop, privconn);
75
76   msg = dbus_message_new_method_call ("org.freedesktop.DBus.TestSuite.TestServer",
77                                       "/",
78                                       "org.freedesktop.DBus.TestSuite.TestServer",
79                                       "Quit");
80   if (!dbus_connection_send (session, msg, NULL))
81     die ("couldn't send Quit message\n");
82   dbus_message_unref (msg);
83
84   _dbus_loop_run (loop);  
85
86   test_connection_shutdown (loop, session);
87   dbus_connection_unref (session);
88
89   test_connection_shutdown (loop, privconn);
90   dbus_connection_remove_filter (privconn, filter_private_message, loop);
91   dbus_connection_unref (privconn);
92
93   _dbus_loop_unref (loop);
94 }
95
96 int
97 main (int argc, char *argv[])
98 {
99   open_shutdown_private_connection (TRUE);
100
101   dbus_shutdown ();
102
103   open_shutdown_private_connection (TRUE);
104
105   dbus_shutdown ();
106
107   open_shutdown_private_connection (FALSE);
108
109   dbus_shutdown ();
110
111   open_shutdown_private_connection (FALSE);
112
113   dbus_shutdown ();
114
115   return 0;
116 }