summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2008-05-01 09:52:10 +0000
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2008-05-01 09:52:10 +0000
commita4e08d216dce3adb9dbc96ea066683ebf8a0cbe7 (patch)
tree423ad71cda801897713883185c070188f439ff51 /tests
parenta95235296caf85ebeb81b7f94309d05c563ac6e3 (diff)
Add regression test for #15644
Diffstat (limited to 'tests')
-rw-r--r--tests/dbus/Makefile.am7
-rw-r--r--tests/dbus/finalized-in-invalidated-handler.c146
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;
+}