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_current_time (&start_tv_sec, &start_tv_usec); 86 _run_iteration (conn); 87 _dbus_get_current_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