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
13static void
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
56static void
57_run_iteration (DBusConnection *conn)
58{
59  _method_call (conn, -1);
60  _method_call (conn, 10000);
61  _method_call (conn, INT_MAX);
62}
63
64int
65main (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