[next] telepathy-glib: Add regression test for avatar data problem

Xavier Claessens xclaesse at kemper.freedesktop.org
Fri May 11 08:49:42 PDT 2012


Module: telepathy-glib
Branch: next
Commit: 143b5ad6c4c9e17fff22652eaf93a45eb54b9596
URL:    http://cgit.freedesktop.org/telepathy/telepathy-glib/commit/?id=143b5ad6c4c9e17fff22652eaf93a45eb54b9596

Author: Xavier Claessens <xavier.claessens at collabora.co.uk>
Date:   Fri May 11 16:17:03 2012 +0200

Add regression test for avatar data problem

---

 tests/dbus/contacts.c |  140 +++++++++++++++++++++++++++++++++---------------
 1 files changed, 96 insertions(+), 44 deletions(-)

diff --git a/tests/dbus/contacts.c b/tests/dbus/contacts.c
index 617f0b9..b35e007 100644
--- a/tests/dbus/contacts.c
+++ b/tests/dbus/contacts.c
@@ -532,22 +532,22 @@ test_avatar_requirements (Fixture *f,
   g_main_loop_unref (result.loop);
 }
 
-static GFile *
+static TpContact *
 create_contact_with_fake_avatar (TpTestsContactsConnection *service_conn,
     TpConnection *client_conn,
-    const gchar *id)
+    const gchar *id,
+    gboolean request_avatar)
 {
   Result result = { g_main_loop_new (NULL, FALSE), NULL, NULL, NULL };
   TpHandleRepoIface *service_repo = tp_base_connection_get_handles (
       (TpBaseConnection *) service_conn, TP_HANDLE_TYPE_CONTACT);
-  TpContactFeature features[] = { TP_CONTACT_FEATURE_AVATAR_DATA };
+  TpContactFeature feature;
   const gchar avatar_data[] = "fake-avatar-data";
   const gchar avatar_token[] = "fake-avatar-token";
   const gchar avatar_mime_type[] = "fake-avatar-mime-type";
   TpContact *contact;
   TpHandle handle;
   GArray *array;
-  GFile *avatar_file;
   gchar *content = NULL;
 
   handle = tp_handle_ensure (service_repo, id, NULL, NULL);
@@ -557,35 +557,46 @@ create_contact_with_fake_avatar (TpTestsContactsConnection *service_conn,
   tp_tests_contacts_connection_change_avatar_data (service_conn, handle, array,
       avatar_mime_type, avatar_token);
 
+  if (request_avatar)
+    feature = TP_CONTACT_FEATURE_AVATAR_DATA;
+  else
+    feature = TP_CONTACT_FEATURE_AVATAR_TOKEN;
+
   tp_connection_get_contacts_by_handle (client_conn,
       1, &handle,
-      G_N_ELEMENTS (features), features,
+      1, &feature,
       by_handle_cb,
       &result, finish, NULL);
   g_main_loop_run (result.loop);
   g_assert_no_error (result.error);
 
-  contact = g_ptr_array_index (result.contacts, 0);
-  if (tp_contact_get_avatar_file (contact) == NULL)
-    {
-      g_signal_connect_swapped (contact, "notify::avatar-file",
-          G_CALLBACK (finish), &result);
-      g_main_loop_run (result.loop);
-    }
+  contact = g_object_ref (g_ptr_array_index (result.contacts, 0));
 
-  g_assert_cmpstr (tp_contact_get_avatar_mime_type (contact), ==,
-      avatar_mime_type);
   g_assert_cmpstr (tp_contact_get_avatar_token (contact), ==, avatar_token);
 
-  avatar_file = tp_contact_get_avatar_file (contact);
-  g_assert (avatar_file != NULL);
-  g_file_load_contents (avatar_file, NULL, &content, NULL, NULL, &result.error);
-  g_assert_no_error (result.error);
-  g_assert_cmpstr (content, ==, avatar_data);
-  g_free (content);
+  if (request_avatar)
+    {
+      GFile *avatar_file;
+
+      /* If we requested avatar, it could come later */
+      if (tp_contact_get_avatar_file (contact) == NULL)
+        {
+          g_signal_connect_swapped (contact, "notify::avatar-file",
+              G_CALLBACK (finish), &result);
+          g_main_loop_run (result.loop);
+        }
 
-  /* Keep avatar_file alive after contact destruction */
-  g_object_ref (avatar_file);
+      g_assert_cmpstr (tp_contact_get_avatar_mime_type (contact), ==,
+          avatar_mime_type);
+
+      avatar_file = tp_contact_get_avatar_file (contact);
+      g_assert (avatar_file != NULL);
+      g_file_load_contents (avatar_file, NULL, &content, NULL, NULL,
+          &result.error);
+      g_assert_no_error (result.error);
+      g_assert_cmpstr (content, ==, avatar_data);
+      g_free (content);
+    }
 
   reset_result (&result);
   g_main_loop_unref (result.loop);
@@ -593,7 +604,7 @@ create_contact_with_fake_avatar (TpTestsContactsConnection *service_conn,
   tp_handle_unref (service_repo, handle);
   g_array_unref (array);
 
-  return avatar_file;
+  return contact;
 }
 
 static void
@@ -652,29 +663,19 @@ haze_remove_directory (const gchar *path)
   return ret;
 }
 
-#define RAND_STR_LEN 6
-
 static void
 test_avatar_data (Fixture *f,
     gconstpointer unused G_GNUC_UNUSED)
 {
   TpTestsContactsConnection *service_conn = f->service_conn;
   TpConnection *client_conn = f->client_conn;
-  gchar *dir;
   gboolean avatar_retrieved_called;
   GError *error = NULL;
-  GFile *file1, *file2;
+  TpContact *contact1, *contact2;
   TpProxySignalConnection *signal_id;
 
   g_message (G_STRFUNC);
 
-  /* Make sure g_get_user_cache_dir() returns a tmp directory, to not mess up
-   * user's cache dir. */
-  dir = g_dir_make_tmp ("tp-glib-tests-XXXXXX", &error);
-  g_assert_no_error (error);
-  g_setenv ("XDG_CACHE_HOME", dir, TRUE);
-  g_assert_cmpstr (g_get_user_cache_dir (), ==, dir);
-
   /* Check if AvatarRetrieved gets called */
   signal_id = tp_cli_connection_interface_avatars_connect_to_avatar_retrieved (
       client_conn, avatar_retrieved_cb, &avatar_retrieved_called, NULL, NULL,
@@ -684,24 +685,58 @@ test_avatar_data (Fixture *f,
   /* First time we create a contact, avatar should not be in cache, so
    * AvatarRetrived should be called */
   avatar_retrieved_called = FALSE;
-  file1 = create_contact_with_fake_avatar (service_conn, client_conn,
-      "fake-id1");
+  contact1 = create_contact_with_fake_avatar (service_conn, client_conn,
+      "fake-id1", TRUE);
   g_assert (avatar_retrieved_called);
+  g_assert (contact1 != NULL);
+  g_assert (tp_contact_get_avatar_file (contact1) != NULL);
 
   /* Second time we create a contact, avatar should be in cache now, so
    * AvatarRetrived should NOT be called */
   avatar_retrieved_called = FALSE;
-  file2 = create_contact_with_fake_avatar (service_conn, client_conn,
-      "fake-id2");
+  contact2 = create_contact_with_fake_avatar (service_conn, client_conn,
+      "fake-id2", TRUE);
   g_assert (!avatar_retrieved_called);
+  g_assert (contact2 != NULL);
+  g_assert (tp_contact_get_avatar_file (contact2) != NULL);
 
-  g_assert (g_file_equal (file1, file2));
-  g_assert (haze_remove_directory (dir));
+  g_assert (g_file_equal (
+      tp_contact_get_avatar_file (contact1),
+      tp_contact_get_avatar_file (contact2)));
 
   tp_proxy_signal_connection_disconnect (signal_id);
-  g_object_unref (file1);
-  g_object_unref (file2);
-  g_free (dir);
+  g_object_unref (contact1);
+  g_object_unref (contact2);
+}
+
+static void
+test_avatar_data_after_token (Fixture *f,
+    gconstpointer unused G_GNUC_UNUSED)
+{
+  TpTestsContactsConnection *service_conn = f->service_conn;
+  TpConnection *client_conn = f->client_conn;
+  const gchar *id = "avatar-data-after-token";
+  TpContact *contact1, *contact2;
+
+  g_message (G_STRFUNC);
+
+  /* Create a contact with AVATAR_TOKEN feature */
+  contact1 = create_contact_with_fake_avatar (service_conn, client_conn, id,
+      FALSE);
+  g_assert (contact1 != NULL);
+  g_assert (tp_contact_get_avatar_file (contact1) == NULL);
+
+  /* Now create the same contact with AVATAR_DATA feature */
+  contact2 = create_contact_with_fake_avatar (service_conn, client_conn, id,
+      TRUE);
+  g_assert (contact2 != NULL);
+  g_assert (tp_contact_get_avatar_file (contact2) != NULL);
+
+  g_assert (contact1 == contact2);
+
+  /* Cleanup */
+  g_object_unref (contact1);
+  g_object_unref (contact2);
 }
 
 static void
@@ -2924,9 +2959,20 @@ int
 main (int argc,
       char **argv)
 {
+  gint ret;
+  gchar *dir;
+  GError *error = NULL;
+
   tp_tests_init (&argc, &argv);
   g_test_bug_base ("http://bugs.freedesktop.org/show_bug.cgi?id=");
 
+  /* Make sure g_get_user_cache_dir() returns a tmp directory, to not mess up
+   * user's cache dir. */
+  dir = g_dir_make_tmp ("tp-glib-tests-XXXXXX", &error);
+  g_assert_no_error (error);
+  g_setenv ("XDG_CACHE_HOME", dir, TRUE);
+  g_assert_cmpstr (g_get_user_cache_dir (), ==, dir);
+
 #define ADD(x) \
   g_test_add ("/contacts/" #x, Fixture, NULL, setup, test_ ## x, teardown)
 
@@ -2940,6 +2986,7 @@ main (int argc,
   ADD (by_id);
   ADD (avatar_requirements);
   ADD (avatar_data);
+  ADD (avatar_data_after_token);
   ADD (contact_info);
   ADD (dup_if_possible);
   ADD (subscription_states);
@@ -2969,5 +3016,10 @@ main (int argc,
   g_test_add ("/contacts/self-contact", Fixture, NULL,
       setup_no_connect, test_self_contact, teardown);
 
-  return g_test_run ();
+  ret = g_test_run ();
+
+  g_assert (haze_remove_directory (dir));
+  g_free (dir);
+
+  return ret;
 }



More information about the telepathy-commits mailing list