diff options
author | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2008-05-01 09:52:10 +0000 |
---|---|---|
committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2008-05-01 09:52:10 +0000 |
commit | a4e08d216dce3adb9dbc96ea066683ebf8a0cbe7 (patch) | |
tree | 423ad71cda801897713883185c070188f439ff51 /tests | |
parent | a95235296caf85ebeb81b7f94309d05c563ac6e3 (diff) |
Add regression test for #15644
Diffstat (limited to 'tests')
-rw-r--r-- | tests/dbus/Makefile.am | 7 | ||||
-rw-r--r-- | tests/dbus/finalized-in-invalidated-handler.c | 146 |
2 files changed, 153 insertions, 0 deletions
diff --git a/tests/dbus/Makefile.am b/tests/dbus/Makefile.am index 283efe72c..d8462f037 100644 --- a/tests/dbus/Makefile.am +++ b/tests/dbus/Makefile.am @@ -5,6 +5,7 @@ noinst_PROGRAMS = \ test-dbus \ test-disconnection \ test-example-no-protocols \ + test-finalized-in-invalidated-handler \ test-handle-set \ test-invalidated-while-invoking-signals \ test-properties \ @@ -33,6 +34,12 @@ test_disconnection_LDADD = \ ../lib/libtp-glib-tests.la test_example_no_protocols_LDADD = $(TP_GLIB_LIBS) +test_finalized_in_invalidated_handler_SOURCES = \ + finalized-in-invalidated-handler.c +test_finalized_in_invalidated_handler_LDADD = \ + $(TP_GLIB_LIBS) \ + ../lib/libtp-glib-tests.la + test_handle_set_SOURCES = handle-set.c test_handle_set_LDADD = $(TP_GLIB_LIBS) diff --git a/tests/dbus/finalized-in-invalidated-handler.c b/tests/dbus/finalized-in-invalidated-handler.c new file mode 100644 index 000000000..ac64ec419 --- /dev/null +++ b/tests/dbus/finalized-in-invalidated-handler.c @@ -0,0 +1,146 @@ +/* Regression test for https://bugs.freedesktop.org/show_bug.cgi?id=15644 + * + * Copyright (C) 2007-2008 Collabora Ltd. <http://www.collabora.co.uk/> + * Copyright (C) 2007-2008 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 <telepathy-glib/channel.h> +#include <telepathy-glib/connection.h> +#include <telepathy-glib/dbus.h> +#include <telepathy-glib/debug.h> +#include <telepathy-glib/interfaces.h> + +#include "tests/lib/myassert.h" +#include "tests/lib/simple-conn.h" +#include "tests/lib/textchan-null.h" + +static int fail = 0; +static GMainLoop *mainloop; + +static void +myassert_failed (void) +{ + fail = 1; +} + +static void +on_invalidated (TpChannel *chan, + guint domain, + gint code, + gchar *message, + gpointer user_data) +{ + TpChannel **client = user_data; + + MYASSERT (domain == TP_ERRORS_DISCONNECTED, ": domain \"%s\"", + g_quark_to_string (domain)); + MYASSERT (code == TP_CONNECTION_STATUS_REASON_REQUESTED, ": code %u", code); + + MYASSERT (*client == chan, "%p vs %p", *client, chan); + g_object_unref (*client); + *client = NULL; + + g_main_loop_quit (mainloop); +} + +static gboolean +disconnect (gpointer data) +{ + simple_connection_inject_disconnect (data); + + return FALSE; +} + +int +main (int argc, + char **argv) +{ + SimpleConnection *service_conn; + TpBaseConnection *service_conn_as_base; + TpHandleRepoIface *contact_repo; + TestTextChannelNull *service_chan; + TpDBusDaemon *dbus; + TpConnection *conn; + TpChannel *chan; + GError *error = NULL; + gchar *name; + gchar *conn_path; + gchar *chan_path; + TpHandle handle; + + g_type_init (); + tp_debug_set_flags ("all"); + mainloop = g_main_loop_new (NULL, FALSE); + + service_conn = SIMPLE_CONNECTION (g_object_new (SIMPLE_TYPE_CONNECTION, + "account", "me@example.com", + "protocol", "simple", + NULL)); + service_conn_as_base = TP_BASE_CONNECTION (service_conn); + MYASSERT (service_conn != NULL, ""); + MYASSERT (service_conn_as_base != NULL, ""); + + MYASSERT (tp_base_connection_register (service_conn_as_base, "simple", + &name, &conn_path, &error), ""); + MYASSERT_NO_ERROR (error); + + dbus = tp_dbus_daemon_new (tp_get_bus ()); + conn = tp_connection_new (dbus, name, conn_path, &error); + MYASSERT (conn != NULL, ""); + MYASSERT_NO_ERROR (error); + + MYASSERT (tp_connection_run_until_ready (conn, TRUE, &error, NULL), ""); + MYASSERT_NO_ERROR (error); + + /* Paste on a channel */ + + contact_repo = tp_base_connection_get_handles (service_conn_as_base, + TP_HANDLE_TYPE_CONTACT); + MYASSERT (contact_repo != NULL, ""); + + handle = tp_handle_ensure (contact_repo, "them@example.org", NULL, &error); + MYASSERT_NO_ERROR (error); + chan_path = g_strdup_printf ("%s/Channel", conn_path); + + service_chan = TEST_TEXT_CHANNEL_NULL (g_object_new ( + TEST_TYPE_TEXT_CHANNEL_NULL, + "connection", service_conn, + "object-path", chan_path, + "handle", handle, + NULL)); + + chan = tp_channel_new (conn, chan_path, TP_IFACE_CHANNEL_TYPE_TEXT, + TP_HANDLE_TYPE_CONTACT, handle, &error); + MYASSERT_NO_ERROR (error); + + tp_channel_run_until_ready (chan, &error, NULL); + MYASSERT_NO_ERROR (error); + + g_signal_connect (chan, "invalidated", G_CALLBACK (on_invalidated), + &chan); + + g_idle_add (disconnect, service_conn); + + g_main_loop_run (mainloop); + + g_message ("Cleaning up"); + + tp_handle_unref (contact_repo, handle); + g_object_unref (conn); + g_assert (chan == NULL); + + g_object_unref (service_chan); + service_conn_as_base = NULL; + g_object_unref (service_conn); + g_object_unref (dbus); + g_main_loop_unref (mainloop); + g_free (name); + g_free (conn_path); + g_free (chan_path); + + return fail; +} |