test-privserver.c 3.27 KB
Newer Older
1
#include <config.h>
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
#include "../test-utils.h"

static void
die (const char *message, ...)
{
  va_list args;
  va_start (args, message);
  vfprintf (stderr, message, args);
  va_end (args);
  exit (1);
}

typedef struct TestServiceData TestServiceData;

struct TestServiceData
{
  DBusLoop *loop;
  char *private_addr;
};

static void
new_connection_callback (DBusServer     *server,
                         DBusConnection *new_connection,
                         void           *data)
{
  TestServiceData *testdata = data;

  if (!test_connection_setup (testdata->loop, new_connection))
    dbus_connection_close (new_connection);
}

static DBusHandlerResult 
filter_session_message (DBusConnection     *connection,
                        DBusMessage        *message,
                        void               *user_data)
{
  TestServiceData *testdata = user_data;

  if (dbus_message_is_method_call (message,
41
                                   "org.freedesktop.DBus.TestSuite.PrivServer",
42 43 44 45 46 47 48 49 50 51 52
                                   "GetPrivateAddress"))
    {
       DBusMessage *reply;
       reply = dbus_message_new_method_return (message);
       dbus_message_append_args (reply, DBUS_TYPE_STRING, 
                                 &(testdata->private_addr), DBUS_TYPE_INVALID);
       dbus_connection_send (connection, reply, NULL);
       dbus_message_unref (reply);
       return DBUS_HANDLER_RESULT_HANDLED;
    }
  else if (dbus_message_is_method_call (message,
53
                                   "org.freedesktop.DBus.TestSuite.PrivServer",
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
                                   "Quit"))
    {
      fprintf (stderr, "server exiting loop\n");
      _dbus_loop_quit (testdata->loop);
      return DBUS_HANDLER_RESULT_HANDLED;
    }
  return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}

int
main (int argc, char *argv[])
{
  DBusServer *server;
  DBusError error;
  DBusLoop *loop;
  DBusConnection *session;
  TestServiceData *testdata;

  dbus_error_init (&error);

  loop = _dbus_loop_new ();

  testdata = dbus_new (TestServiceData, 1);
  testdata->loop = loop;

  session = dbus_bus_get (DBUS_BUS_SESSION, &error);
  if (!session)
    die ("couldn't access session bus");

  test_connection_setup (loop, session);

85
  dbus_bus_request_name (session, "org.freedesktop.DBus.TestSuite.PrivServer", 0, &error);
86 87 88 89 90 91
  if (dbus_error_is_set (&error))
    die ("couldn't request name: %s", error.message);

  if (!dbus_connection_add_filter (session, filter_session_message, testdata, NULL))
    die ("couldn't add filter");

92 93 94
#ifdef DBUS_CMAKE
  server = dbus_server_listen (TEST_LISTEN, &error);
#else
95
  server = dbus_server_listen ("unix:tmpdir=/tmp", &error);
96
#endif
97 98 99
  if (!server)
    die (error.message);
  testdata->private_addr = dbus_server_get_address (server);
100
  printf ("test server listening on %s\n", testdata->private_addr);
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123

  dbus_server_set_new_connection_function (server, new_connection_callback,
                                           testdata, NULL);

  if (!test_server_setup (loop, server))
    die ("server setup failed");

  fprintf (stderr, "server running mainloop\n");
  _dbus_loop_run (loop);
  fprintf (stderr, "server mainloop quit\n");

  test_server_shutdown (loop, server);

  test_connection_shutdown (loop, session);

  dbus_connection_unref (session);

  _dbus_loop_unref (loop);

  dbus_free (testdata);

  return 0;
}