/* A very basic feature test for TpChannelDispatchOperation
*
* Copyright (C) 2009 Collabora Ltd.
* Copyright (C) 2009 Nokia Corporation
*
* Copying and distribution of this file, with or without modification,
* are permitted in any medium without royalty provided the copyright
* notice and this notice are preserved.
*/
#include
#include
#include
#include
#include
#include
#include
#include "tests/lib/util.h"
/* This object implements no methods and no properties - TpChannelRequest
* doesn't actually use them yet */
static GType test_simple_cdo_get_type (void);
typedef struct {
GObject parent;
} TestSimpleCDO;
typedef struct {
GObjectClass parent;
} TestSimpleCDOClass;
G_DEFINE_TYPE_WITH_CODE (TestSimpleCDO, test_simple_cdo, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CHANNEL_DISPATCH_OPERATION, NULL));
static void
test_simple_cdo_init (TestSimpleCDO *self)
{
}
static void
test_simple_cdo_class_init (TestSimpleCDOClass *klass)
{
}
typedef struct {
GMainLoop *mainloop;
TpDBusDaemon *dbus;
DBusGConnection *private_conn;
TpDBusDaemon *private_dbus;
GObject *cdo_service;
TpChannelDispatchOperation *cdo;
GError *error /* initialized where needed */;
} Test;
static void
setup (Test *test,
gconstpointer data)
{
DBusConnection *libdbus;
g_type_init ();
tp_debug_set_flags ("all");
test->mainloop = g_main_loop_new (NULL, FALSE);
test->dbus = tp_dbus_daemon_dup (NULL);
g_assert (test->dbus != NULL);
libdbus = dbus_bus_get_private (DBUS_BUS_STARTER, NULL);
g_assert (libdbus != NULL);
dbus_connection_setup_with_g_main (libdbus, NULL);
dbus_connection_set_exit_on_disconnect (libdbus, FALSE);
test->private_conn = dbus_connection_get_g_connection (libdbus);
/* transfer ref */
dbus_g_connection_ref (test->private_conn);
dbus_connection_unref (libdbus);
g_assert (test->private_conn != NULL);
test->private_dbus = tp_dbus_daemon_new (test->private_conn);
g_assert (test->private_dbus != NULL);
test->cdo = NULL;
test->cdo_service = g_object_new (test_simple_cdo_get_type (),
NULL);
dbus_g_connection_register_g_object (test->private_conn, "/whatever",
test->cdo_service);
}
static void
teardown (Test *test,
gconstpointer data)
{
if (test->cdo != NULL)
{
g_object_unref (test->cdo);
test->cdo = NULL;
}
tp_dbus_daemon_release_name (test->dbus, TP_CHANNEL_DISPATCHER_BUS_NAME,
NULL);
if (test->private_dbus != NULL)
{
tp_dbus_daemon_release_name (test->private_dbus,
TP_CHANNEL_DISPATCHER_BUS_NAME, NULL);
g_object_unref (test->private_dbus);
test->private_dbus = NULL;
}
#if 0
/* not leaking this object would crash dbus-glib (fd.o #5688) */
g_object_unref (test->cdo_service);
test->cdo_service = NULL;
#endif
if (test->private_conn != NULL)
{
dbus_connection_close (dbus_g_connection_get_connection (
test->private_conn));
dbus_g_connection_unref (test->private_conn);
test->private_conn = NULL;
}
g_object_unref (test->dbus);
test->dbus = NULL;
g_main_loop_unref (test->mainloop);
test->mainloop = NULL;
}
static void
test_new (Test *test,
gconstpointer data G_GNUC_UNUSED)
{
gboolean ok;
/* CD not running */
test->cdo = tp_channel_dispatch_operation_new (test->dbus,
"/whatever", NULL, NULL);
g_assert (test->cdo == NULL);
ok = tp_dbus_daemon_request_name (test->private_dbus,
TP_CHANNEL_DISPATCHER_BUS_NAME, FALSE, NULL);
g_assert (ok);
test->cdo = tp_channel_dispatch_operation_new (test->dbus,
"not even syntactically valid", NULL, NULL);
g_assert (test->cdo == NULL);
test->cdo = tp_channel_dispatch_operation_new (test->dbus,
"/whatever", NULL, NULL);
g_assert (test->cdo != NULL);
}
static void
test_crash (Test *test,
gconstpointer data G_GNUC_UNUSED)
{
gboolean ok;
ok = tp_dbus_daemon_request_name (test->private_dbus,
TP_CHANNEL_DISPATCHER_BUS_NAME, FALSE, NULL);
g_assert (ok);
test->cdo = tp_channel_dispatch_operation_new (test->dbus, "/whatever",
NULL, NULL);
g_assert (test->cdo != NULL);
g_assert (tp_proxy_get_invalidated (test->cdo) == NULL);
tp_dbus_daemon_release_name (test->private_dbus,
TP_CHANNEL_DISPATCHER_BUS_NAME, NULL);
test_proxy_run_until_dbus_queue_processed (test->cdo);
g_assert (tp_proxy_get_invalidated (test->cdo) == NULL);
dbus_connection_close (dbus_g_connection_get_connection (
test->private_conn));
dbus_g_connection_unref (test->private_conn);
test->private_conn = NULL;
test_proxy_run_until_dbus_queue_processed (test->cdo);
g_assert (tp_proxy_get_invalidated (test->cdo) != NULL);
g_assert (tp_proxy_get_invalidated (test->cdo)->domain == TP_DBUS_ERRORS);
g_assert (tp_proxy_get_invalidated (test->cdo)->code ==
TP_DBUS_ERROR_NAME_OWNER_LOST);
}
static void
test_finished (Test *test,
gconstpointer data G_GNUC_UNUSED)
{
gboolean ok;
ok = tp_dbus_daemon_request_name (test->private_dbus,
TP_CHANNEL_DISPATCHER_BUS_NAME, FALSE, NULL);
g_assert (ok);
test->cdo = tp_channel_dispatch_operation_new (test->dbus, "/whatever",
NULL, NULL);
g_assert (test->cdo != NULL);
g_assert (tp_proxy_get_invalidated (test->cdo) == NULL);
tp_svc_channel_dispatch_operation_emit_finished (test->cdo_service);
test_proxy_run_until_dbus_queue_processed (test->cdo);
g_assert (tp_proxy_get_invalidated (test->cdo) != NULL);
g_assert (tp_proxy_get_invalidated (test->cdo)->domain == TP_DBUS_ERRORS);
g_assert (tp_proxy_get_invalidated (test->cdo)->code ==
TP_DBUS_ERROR_OBJECT_REMOVED);
}
int
main (int argc,
char **argv)
{
g_test_init (&argc, &argv, NULL);
g_test_bug_base ("http://bugs.freedesktop.org/show_bug.cgi?id=");
g_test_add ("/cdo/new", Test, NULL, setup, test_new, teardown);
g_test_add ("/cdo/crash", Test, NULL, setup, test_crash, teardown);
g_test_add ("/cdo/finished", Test, NULL, setup, test_finished, teardown);
return g_test_run ();
}