summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--tests/dbus/Makefile.am6
-rw-r--r--tests/dbus/contacts.c288
3 files changed, 295 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index 33bb7585b..e7c46f890 100644
--- a/.gitignore
+++ b/.gitignore
@@ -68,6 +68,7 @@ tests/dbus/test-connection
tests/dbus/test-connection-getinterfaces-failure
tests/dbus/test-connection-handles
tests/dbus/test-connection-inject-bug16307
+tests/dbus/test-contacts
tests/dbus/test-dbus
tests/dbus/test-disconnection
tests/dbus/test-example-no-protocols
diff --git a/tests/dbus/Makefile.am b/tests/dbus/Makefile.am
index 6a130d471..b4b581877 100644
--- a/tests/dbus/Makefile.am
+++ b/tests/dbus/Makefile.am
@@ -5,6 +5,7 @@ noinst_PROGRAMS = \
test-connection-handles \
test-connection-inject-bug16307 \
test-connection-getinterfaces-failure \
+ test-contacts \
test-dbus \
test-disconnection \
test-example-no-protocols \
@@ -46,6 +47,11 @@ test_connection_getinterfaces_failure_LDADD = \
test_connection_getinterfaces_failure_SOURCES = \
connection-getinterfaces-failure.c
+test_contacts_LDADD = \
+ $(TP_GLIB_LIBS) \
+ ../lib/libtp-glib-tests.la
+test_contacts_SOURCES = contacts.c
+
test_dbus_LDADD = $(TP_GLIB_LIBS)
test_disconnection_LDADD = \
$(TP_GLIB_LIBS) \
diff --git a/tests/dbus/contacts.c b/tests/dbus/contacts.c
new file mode 100644
index 000000000..ae0caab51
--- /dev/null
+++ b/tests/dbus/contacts.c
@@ -0,0 +1,288 @@
+/* Feature test for TpContact creation.
+ *
+ * Code missing coverage in contact.c:
+ * - all optional features
+ * - connection becoming invalid
+ * - fatal error on the connection
+ *
+ * Copyright (C) 2008 Collabora Ltd. <http://www.collabora.co.uk/>
+ * Copyright (C) 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/connection.h>
+#include <telepathy-glib/contact.h>
+#include <telepathy-glib/dbus.h>
+#include <telepathy-glib/debug.h>
+
+#include "tests/lib/debug.h"
+#include "tests/lib/myassert.h"
+#include "tests/lib/simple-conn.h"
+#include "tests/lib/util.h"
+
+static int fail = 0;
+
+static void
+myassert_failed (void)
+{
+ fail = 1;
+}
+
+typedef struct {
+ GMainLoop *loop;
+ GError *error /* initialized to 0 */;
+ GPtrArray *contacts;
+ GArray *invalid;
+} Result;
+
+static void
+by_handle_cb (TpConnection *connection,
+ guint n_contacts,
+ TpContact * const *contacts,
+ guint n_invalid,
+ const TpHandle *invalid,
+ const GError *error,
+ gpointer user_data,
+ GObject *weak_object)
+{
+ Result *result = user_data;
+
+ g_assert (result->invalid == NULL);
+ g_assert (result->contacts == NULL);
+ g_assert (result->error == NULL);
+
+ if (error == NULL)
+ {
+ guint i;
+
+ DEBUG ("got %u contacts and %u invalid", n_contacts, n_invalid);
+
+ result->invalid = g_array_sized_new (FALSE, FALSE, sizeof (TpHandle),
+ n_invalid);
+ g_array_append_vals (result->invalid, invalid, n_invalid);
+
+ result->contacts = g_ptr_array_sized_new (n_contacts);
+
+ for (i = 0; i < n_contacts; i++)
+ {
+ TpContact *contact = contacts[i];
+
+ DEBUG ("contact #%u: %p", i, contact);
+ g_ptr_array_add (result->contacts, contact);
+ }
+ }
+ else
+ {
+ DEBUG ("got an error: %s %u: %s", g_quark_to_string (error->domain),
+ error->code, error->message);
+ result->error = g_error_copy (error);
+ }
+}
+
+static void
+finish (gpointer r)
+{
+ Result *result = r;
+
+ g_main_loop_quit (result->loop);
+}
+
+static void
+test_by_handle (SimpleConnection *service_conn,
+ TpConnection *client_conn)
+{
+ Result result = { g_main_loop_new (NULL, FALSE), NULL, NULL, NULL };
+ TpHandle handles[5] = { 0, 0, 0, 0, 0 };
+ TpHandleRepoIface *service_repo = tp_base_connection_get_handles (
+ (TpBaseConnection *) service_conn, TP_HANDLE_TYPE_CONTACT);
+ TpContact *contacts[4];
+ gpointer weak_pointers[4];
+ guint i;
+
+ g_message (G_STRFUNC);
+
+ /* arrange for some handles to exist */
+ handles[0] = tp_handle_ensure (service_repo, "alice", NULL, NULL);
+ MYASSERT (handles[0] != 0, "");
+ handles[1] = tp_handle_ensure (service_repo, "bob", NULL, NULL);
+ MYASSERT (handles[1] != 0, "");
+ /* randomly guess at a handle that shouldn't exist */
+ handles[2] = 31337;
+ MYASSERT (!tp_handle_is_valid (service_repo, 31337, NULL), "");
+ /* another valid handle */
+ handles[3] = tp_handle_ensure (service_repo, "chris", NULL, NULL);
+ MYASSERT (handles[3] != 0, "");
+ /* another invalid handle */
+ handles[4] = 12345;
+ MYASSERT (!tp_handle_is_valid (service_repo, 12345, NULL), "");
+
+ /* Make a request for the following 5 contacts:
+ * - alice
+ * - bob
+ * - invalid handle 31337
+ * - chris
+ * - invalid handle 12345
+ */
+ tp_connection_get_contacts_by_handle (client_conn,
+ 5, handles,
+ 0, NULL,
+ by_handle_cb,
+ &result, finish, NULL);
+
+ g_main_loop_run (result.loop);
+
+ MYASSERT (result.contacts->len == 3, ": %u", result.contacts->len);
+ MYASSERT (result.invalid->len == 2, ": %u", result.invalid->len);
+ MYASSERT_NO_ERROR (result.error);
+
+ MYASSERT (g_ptr_array_index (result.contacts, 0) != NULL, "");
+ MYASSERT (g_ptr_array_index (result.contacts, 1) != NULL, "");
+ MYASSERT (g_ptr_array_index (result.contacts, 2) != NULL, "");
+ contacts[0] = g_ptr_array_index (result.contacts, 0);
+ MYASSERT_SAME_UINT (tp_contact_get_handle (contacts[0]), handles[0]);
+ MYASSERT_SAME_STRING (tp_contact_get_identifier (contacts[0]), "alice");
+ contacts[1] = g_ptr_array_index (result.contacts, 1);
+ MYASSERT_SAME_UINT (tp_contact_get_handle (contacts[1]), handles[1]);
+ MYASSERT_SAME_STRING (tp_contact_get_identifier (contacts[1]), "bob");
+ contacts[3] = g_ptr_array_index (result.contacts, 2);
+ MYASSERT_SAME_UINT (tp_contact_get_handle (contacts[3]), handles[3]);
+ MYASSERT_SAME_STRING (tp_contact_get_identifier (contacts[3]), "chris");
+
+ /* clean up before doing the second request */
+ g_array_free (result.invalid, TRUE);
+ result.invalid = NULL;
+ g_ptr_array_free (result.contacts, TRUE);
+ result.contacts = NULL;
+ g_assert (result.error == NULL);
+
+ /* Replace one of the invalid handles with a valid one */
+ handles[2] = tp_handle_ensure (service_repo, "dora", NULL, NULL);
+ MYASSERT (handles[2] != 0, "");
+
+ /* Make a request for the following 4 contacts:
+ * - alice (TpContact exists)
+ * - bob (TpContact exists)
+ * - dora (TpContact needs to be created)
+ * - chris (TpContact exists)
+ */
+ tp_connection_get_contacts_by_handle (client_conn,
+ 4, handles,
+ 0, NULL,
+ by_handle_cb,
+ &result, finish, NULL);
+
+ g_main_loop_run (result.loop);
+
+ /* assert that we got the same contacts back */
+
+ MYASSERT (result.contacts->len == 4, ": %u", result.contacts->len);
+ MYASSERT (result.invalid->len == 0, ": %u", result.invalid->len);
+ MYASSERT_NO_ERROR (result.error);
+
+ /* 0, 1 and 3 we already have a reference to */
+ MYASSERT (g_ptr_array_index (result.contacts, 0) == contacts[0], "");
+ g_object_unref (g_ptr_array_index (result.contacts, 0));
+ MYASSERT (g_ptr_array_index (result.contacts, 1) == contacts[1], "");
+ g_object_unref (g_ptr_array_index (result.contacts, 1));
+ MYASSERT (g_ptr_array_index (result.contacts, 3) == contacts[3], "");
+ g_object_unref (g_ptr_array_index (result.contacts, 3));
+
+ /* 2 we don't */
+ contacts[2] = g_ptr_array_index (result.contacts, 2);
+ MYASSERT_SAME_UINT (tp_contact_get_handle (contacts[2]), handles[2]);
+ MYASSERT_SAME_STRING (tp_contact_get_identifier (contacts[2]), "dora");
+
+ /* clean up refs to contacts and assert that they aren't leaked */
+
+ for (i = 0; i < 4; i++)
+ {
+ weak_pointers[i] = contacts[i];
+ g_object_add_weak_pointer ((GObject *) contacts[i],weak_pointers +i);
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ g_object_unref (contacts[i]);
+ MYASSERT (weak_pointers[i] == NULL, ": %u", i);
+ }
+
+ /* wait for ReleaseHandles to run */
+ test_connection_run_until_dbus_queue_processed (client_conn);
+
+ /* unref all the handles we created service-side */
+ tp_handle_unref (service_repo, handles[0]);
+ MYASSERT (!tp_handle_is_valid (service_repo, handles[0], NULL), "");
+ tp_handle_unref (service_repo, handles[1]);
+ MYASSERT (!tp_handle_is_valid (service_repo, handles[1], NULL), "");
+ tp_handle_unref (service_repo, handles[2]);
+ MYASSERT (!tp_handle_is_valid (service_repo, handles[2], NULL), "");
+ tp_handle_unref (service_repo, handles[3]);
+ MYASSERT (!tp_handle_is_valid (service_repo, handles[3], NULL), "");
+
+ /* remaining cleanup */
+ g_main_loop_unref (result.loop);
+ g_array_free (result.invalid, TRUE);
+ g_ptr_array_free (result.contacts, TRUE);
+ g_assert (result.error == NULL);
+}
+
+int
+main (int argc,
+ char **argv)
+{
+ TpDBusDaemon *dbus;
+ SimpleConnection *service_conn;
+ TpBaseConnection *service_conn_as_base;
+ gchar *name;
+ gchar *conn_path;
+ GError *error = NULL;
+ TpConnection *client_conn;
+
+ /* Setup */
+
+ g_type_init ();
+ tp_debug_set_flags ("all");
+ dbus = tp_dbus_daemon_new (tp_get_bus ());
+
+ 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);
+
+ client_conn = tp_connection_new (dbus, name, conn_path, &error);
+ MYASSERT (client_conn != NULL, "");
+ MYASSERT_NO_ERROR (error);
+ MYASSERT (tp_connection_run_until_ready (client_conn, TRUE, &error, NULL),
+ "");
+ MYASSERT_NO_ERROR (error);
+
+ /* Tests */
+
+ test_by_handle (service_conn, client_conn);
+
+ /* Teardown */
+
+ MYASSERT (tp_cli_connection_run_disconnect (client_conn, -1, &error, NULL),
+ "");
+ MYASSERT_NO_ERROR (error);
+
+ service_conn_as_base = NULL;
+ g_object_unref (service_conn);
+ g_free (name);
+ g_free (conn_path);
+
+ g_object_unref (dbus);
+
+ return fail;
+}