/* Regression test for https://bugs.freedesktop.org/show_bug.cgi?id=15644 * * Copyright (C) 2007-2008 Collabora Ltd. * 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 #include #include #include #include #include "tests/lib/myassert.h" #include "tests/lib/simple-conn.h" #include "tests/lib/textchan-null.h" #include "tests/lib/util.h" static GMainLoop *mainloop; gboolean shutdown_finished = FALSE; gboolean invalidated = FALSE; static void on_invalidated (TpChannel *chan, guint domain, gint code, gchar *message, gpointer user_data) { TpChannel **client = user_data; MYASSERT (domain == TP_ERRORS, ": domain \"%s\"", g_quark_to_string (domain)); MYASSERT (code == TP_ERROR_CANCELLED, ": code %u", code); MYASSERT (*client == chan, "%p vs %p", *client, chan); g_object_unref (*client); *client = NULL; invalidated = TRUE; if (shutdown_finished) g_main_loop_quit (mainloop); } static gboolean disconnect (gpointer data) { tp_tests_simple_connection_inject_disconnect (data); return FALSE; } static void on_shutdown_finished (TpBaseConnection *base_conn, gpointer user_data) { shutdown_finished = TRUE; if (invalidated) g_main_loop_quit (mainloop); } int main (int argc, char **argv) { TpTestsSimpleConnection *service_conn; TpBaseConnection *service_conn_as_base; TpHandleRepoIface *contact_repo; TpTestsTextChannelNull *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); dbus = tp_tests_dbus_daemon_dup_or_die (); service_conn = TP_TESTS_SIMPLE_CONNECTION (tp_tests_object_new_static_class ( TP_TESTS_TYPE_SIMPLE_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, ""); g_signal_connect (service_conn, "shutdown-finished", G_CALLBACK (on_shutdown_finished), NULL); MYASSERT (tp_base_connection_register (service_conn_as_base, "simple", &name, &conn_path, &error), ""); g_assert_no_error (error); conn = tp_connection_new (dbus, name, conn_path, &error); MYASSERT (conn != NULL, ""); g_assert_no_error (error); MYASSERT (tp_connection_run_until_ready (conn, TRUE, &error, NULL), ""); g_assert_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); g_assert_no_error (error); chan_path = g_strdup_printf ("%s/Channel", conn_path); service_chan = TP_TESTS_TEXT_CHANNEL_NULL (tp_tests_object_new_static_class ( TP_TESTS_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); g_assert_no_error (error); tp_channel_run_until_ready (chan, &error, NULL); g_assert_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 0; }