• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2 * Test to make sure that pending calls succeed when given a default,
3 * specific and infinite timeout.
4 **/
5 
6 #include <config.h>
7 #include <dbus/dbus.h>
8 #include <dbus/dbus-sysdeps.h>
9 #include <stdio.h>
10 #include <limits.h>
11 #include <stdlib.h>
12 
13 static void
_method_call(DBusConnection * conn,int timeout_milliseconds)14 _method_call (DBusConnection *conn,
15 	      int             timeout_milliseconds)
16 {
17   DBusPendingCall *pending;
18   DBusMessage *method;
19   DBusMessage *reply;
20   char *echo = "echo";
21 
22   /* send the message */
23   method = dbus_message_new_method_call ("org.freedesktop.DBus.TestSuiteEchoService",
24                                          "/org/freedesktop/TestSuite",
25                                          "org.freedesktop.TestSuite",
26                                          "DelayEcho");
27 
28   dbus_message_append_args (method, DBUS_TYPE_STRING, &echo, NULL);
29   dbus_connection_send_with_reply (conn, method, &pending, timeout_milliseconds);
30   dbus_message_unref (method);
31 
32   /* block on the message */
33   dbus_pending_call_block (pending);
34 
35   /* check the reply only to make sure we
36      are not getting errors unrelated
37      to the block in poll bug */
38   reply = dbus_pending_call_steal_reply (pending);
39 
40   if (reply == NULL)
41     {
42       printf ("Failed: Reply is NULL ***\n");
43       exit (1);
44     }
45 
46   if (dbus_message_get_type (reply) == DBUS_MESSAGE_TYPE_ERROR)
47     {
48       printf ("Failed: Reply is error: %s ***\n", dbus_message_get_error_name (reply));
49       exit (1);
50     }
51 
52   dbus_message_unref (reply);
53   dbus_pending_call_unref (pending);
54 }
55 
56 static void
_run_iteration(DBusConnection * conn)57 _run_iteration (DBusConnection *conn)
58 {
59   _method_call (conn, -1);
60   _method_call (conn, 10000);
61   _method_call (conn, INT_MAX);
62 }
63 
64 int
main(int argc,char * argv[])65 main (int argc, char *argv[])
66 {
67   long start_tv_sec, start_tv_usec;
68   long end_tv_sec, end_tv_usec;
69   int i;
70   DBusMessage *method;
71   DBusConnection *conn;
72   DBusError error;
73 
74   printf ("*** Testing pending call timeouts\n");
75 
76   dbus_error_init (&error);
77 
78   conn = dbus_bus_get (DBUS_BUS_SESSION, &error);
79 
80   /* run 100 times to make sure */
81   for (i = 0; i < 100; i++)
82     {
83       long delta;
84 
85       _dbus_get_monotonic_time (&start_tv_sec, &start_tv_usec);
86       _run_iteration (conn);
87       _dbus_get_monotonic_time (&end_tv_sec, &end_tv_usec);
88 
89       /* we just care about seconds */
90       delta = end_tv_sec - start_tv_sec;
91       printf ("Iter %i: %lis\n", i, delta);
92     }
93 
94   method = dbus_message_new_method_call ("org.freedesktop.TestSuiteEchoService",
95                                          "/org/freedesktop/TestSuite",
96                                          "org.freedesktop.TestSuite",
97                                          "Exit");
98   dbus_connection_send (conn, method, NULL);
99   dbus_message_unref (method);
100 
101   printf ("Success ***\n");
102   exit (0);
103 }
104