/* Basic test for the text mixin and the echo example CM. * * 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 #include "tests/lib/echo-chan.h" #include "tests/lib/echo-conn.h" #include "tests/lib/myassert.h" #include "tests/lib/util.h" static guint received_count = 0; static guint last_received_id = 0; static guint last_received_time = 0; static guint last_received_sender = 0; static guint last_received_type = 0; static guint last_received_flags = 0; static gchar *last_received_text = NULL; static guint sent_count = 0; static guint last_sent_type = 0; static gchar *last_sent_text = NULL; static void on_sent (TpChannel *chan, guint timestamp, guint type, const gchar *text, gpointer data, GObject *object) { g_message ("%p: Sent: time %u, type %u, text '%s'", chan, timestamp, type, text); sent_count++; last_sent_type = type; g_free (last_sent_text); last_sent_text = g_strdup (text); } static void on_received (TpChannel *chan, guint id, guint timestamp, guint sender, guint type, guint flags, const gchar *text, gpointer data, GObject *object) { TpHandleRepoIface *contact_repo = data; g_message ("%p: Received #%u: time %u, sender %u '%s', type %u, flags %u, " "text '%s'", chan, id, timestamp, sender, tp_handle_inspect (contact_repo, sender), type, flags, text); received_count++; last_received_id = id; last_received_time = timestamp; last_received_sender = sender; last_received_type = type; last_received_flags = flags; g_free (last_received_text); last_received_text = g_strdup (text); } int main (int argc, char **argv) { TpTestsEchoConnection *service_conn; TpBaseConnection *service_conn_as_base; TpHandleRepoIface *contact_repo; TpTestsEchoChannel *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"); */ dbus = tp_tests_dbus_daemon_dup_or_die (); service_conn = TP_TESTS_ECHO_CONNECTION (tp_tests_object_new_static_class ( TP_TESTS_TYPE_ECHO_CONNECTION, "account", "me@example.com", "protocol", "example", 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, "example", &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); 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); /* FIXME: exercise RequestChannel rather than just pasting on a channel */ chan_path = g_strdup_printf ("%s/Channel", conn_path); service_chan = TP_TESTS_ECHO_CHANNEL (tp_tests_object_new_static_class ( TP_TESTS_TYPE_ECHO_CHANNEL, "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); MYASSERT (tp_cli_channel_type_text_connect_to_received (chan, on_received, g_object_ref (contact_repo), g_object_unref, NULL, NULL) != NULL, ""); MYASSERT (tp_cli_channel_type_text_connect_to_sent (chan, on_sent, NULL, NULL, NULL, NULL) != NULL, ""); sent_count = 0; received_count = 0; tp_cli_channel_type_text_run_send (chan, -1, TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL, "Hello, world!", &error, NULL); g_assert_no_error (error); tp_tests_proxy_run_until_dbus_queue_processed (conn); MYASSERT (sent_count == 1, ": %u != 1", sent_count); MYASSERT (received_count == 1, ": %u != 1", received_count); MYASSERT (last_sent_type == TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL, ": %u != NORMAL", last_sent_type); MYASSERT (!tp_strdiff (last_sent_text, "Hello, world!"), "'%s' != '%s'", last_sent_text, "Hello, world!"); MYASSERT (last_received_type == TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL, ": %u != NORMAL", last_received_type); MYASSERT (last_received_flags == 0, ": %u != 0", last_received_flags); MYASSERT (last_received_sender == handle, ": %u != %u", last_received_sender, handle); MYASSERT (!tp_strdiff (last_received_text, "You said: Hello, world!"), "'%s'", last_received_text); g_print ("\n\n==== Closing channel (it will respawn) ====\n"); { gboolean dead; TpHandle new_initiator; MYASSERT (tp_cli_channel_run_close (chan, -1, &error, NULL), ""); g_assert_no_error (error); MYASSERT (tp_proxy_get_invalidated (chan) != NULL, ""); g_object_get (service_chan, "channel-destroyed", &dead, "initiator-handle", &new_initiator, NULL); MYASSERT (!dead, ""); g_assert_cmpuint (new_initiator, ==, handle); } g_print ("\n\n==== Re-creating TpChannel ====\n"); g_object_unref (chan); 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_print ("\n\n==== Listing messages ====\n"); { GPtrArray *messages; GValueArray *structure; tp_cli_channel_type_text_run_list_pending_messages (chan, -1, FALSE, &messages, &error, NULL); g_assert_no_error (error); g_assert_cmpuint (messages->len, ==, 1); structure = g_ptr_array_index (messages, 0); g_assert_cmpuint (g_value_get_uint (structure->values + 0), ==, last_received_id); g_assert_cmpuint (g_value_get_uint (structure->values + 1), ==, last_received_time); g_assert_cmpuint (g_value_get_uint (structure->values + 2), ==, handle); g_assert_cmpuint (g_value_get_uint (structure->values + 3), ==, TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL); g_assert_cmpuint (g_value_get_uint (structure->values + 4), ==, TP_CHANNEL_TEXT_MESSAGE_FLAG_RESCUED); g_assert_cmpstr (g_value_get_string (structure->values + 5), ==, "You said: Hello, world!"); g_print ("Freeing\n"); g_boxed_free (TP_ARRAY_TYPE_PENDING_TEXT_MESSAGE_LIST, messages); } g_print ("\n\n==== Destroying channel ====\n"); { gboolean dead; MYASSERT (tp_cli_channel_interface_destroyable_run_destroy (chan, -1, &error, NULL), ""); g_assert_no_error (error); MYASSERT (tp_proxy_get_invalidated (chan) != NULL, ""); g_object_get (service_chan, "channel-destroyed", &dead, NULL); MYASSERT (dead, ""); } g_print ("\n\n==== End of tests ====\n"); MYASSERT (tp_cli_connection_run_disconnect (conn, -1, &error, NULL), ""); g_assert_no_error (error); tp_handle_unref (contact_repo, handle); g_object_unref (chan); g_object_unref (conn); g_object_unref (service_chan); service_conn_as_base = NULL; g_object_unref (service_conn); g_object_unref (dbus); g_free (name); g_free (conn_path); g_free (chan_path); g_free (last_sent_text); g_free (last_received_text); return 0; }