
#include "gdbus-object-manager-example/objectmanager-gen.h"

/* ---------------------------------------------------------------------------------------------------- */

/* The fixture contains a GTestDBus object and
 * a proxy to the service we're going to be testing.
 */
typedef struct {
  GTestDBus *dbus;
  GDBusObjectManager *manager;
} TestFixture;

static void
fixture_setup (TestFixture *fixture, gconstpointer unused)
{
  GError *error = NULL;

  /* Create the global dbus-daemon for this test suite
   */
  fixture->dbus = g_test_dbus_new (G_TEST_DBUS_NONE);

  /* Add the private directory with our in-tree service files, 
   * TEST_SERVICES is defined by the build system to point
   * to the right directory.
   */
  g_test_dbus_add_service_dir (fixture->dbus, TEST_SERVICES);

  /* Start the private D-Bus daemon
   */
  g_test_dbus_up (fixture->dbus);

  /* Create the proxy that we're going to test
   */
  fixture->manager =
    example_object_manager_client_new_for_bus_sync (G_BUS_TYPE_SESSION,
                                                    G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
                                                    "org.gtk.GDBus.Examples.ObjectManager",
                                                    "/example/Animals",
                                                    NULL, /* GCancellable */
                                                    &error);
  if (fixture->manager == NULL)
    g_error ("Error getting object manager client: %s", error->message);
}

static void
fixture_teardown (TestFixture *fixture, gconstpointer unused)
{
  /* Tear down the proxy
   */
  if (fixture->manager)
    g_object_unref (fixture->manager);

  /* Stop the private D-Bus daemon
   */
  g_test_dbus_down (fixture->dbus);
  g_object_unref (fixture->dbus);
}

/* The gdbus-example-objectmanager-server exports 10 objects,
 * to test the server has actually activated, let's ensure
 * that 10 objects exist.
 */
static void
test_gtest_dbus (TestFixture *fixture, gconstpointer unused)
{
  GList *objects;

  objects = g_dbus_object_manager_get_objects (fixture->manager);

  g_assert_cmpint (g_list_length (objects), ==, 10);
  g_list_free_full (objects, g_object_unref);
}

int
main (int   argc,
      char *argv[])
{
  g_test_init (&argc, &argv, NULL);

  /* This test simply ensures that we can bring the GTestDBus up and down a hand
   * full of times in a row, each time successfully activating the in-tree service
   */
  g_test_add ("/GTestDBus/Cycle1", TestFixture, NULL,
  	      fixture_setup, test_gtest_dbus, fixture_teardown);
  g_test_add ("/GTestDBus/Cycle2", TestFixture, NULL,
  	      fixture_setup, test_gtest_dbus, fixture_teardown);
  g_test_add ("/GTestDBus/Cycle3", TestFixture, NULL,
  	      fixture_setup, test_gtest_dbus, fixture_teardown);
  g_test_add ("/GTestDBus/Cycle4", TestFixture, NULL,
  	      fixture_setup, test_gtest_dbus, fixture_teardown);
  g_test_add ("/GTestDBus/Cycle5", TestFixture, NULL,
  	      fixture_setup, test_gtest_dbus, fixture_teardown);
  
  return g_test_run ();
}
