[folks] eds test: add test for specific behavior of linkable properties



commit 7638419cc279f36886434344f391ca39b374a6a4
Author: Travis Reitter <travis reitter collabora co uk>
Date:   Fri Dec 28 09:31:57 2012 -0800

    eds test: add test for specific behavior of linkable properties
    
    This splits out a subtle and complicated linkable-properties bug discovered
    by the set-emails test where changing the emails (which happen to be a
    linkable property in the EDS backend) causes an unnecessary Edsf.Persona
    creation and removal cycle.
    
    The set-* tests are meant to confirm that reading and writing the given
    property works, so seperating this should let us simplify those tests
    slightly yet focus on the secondary details we care about in a specific test
    case.

 tests/eds/Makefile.am              |    5 +
 tests/eds/linkable-properties.vala |  175 ++++++++++++++++++++++++++++++++++++
 tests/eds/set-emails.vala          |    8 --
 3 files changed, 180 insertions(+), 8 deletions(-)
---
diff --git a/tests/eds/Makefile.am b/tests/eds/Makefile.am
index 2718960..7585fb4 100644
--- a/tests/eds/Makefile.am
+++ b/tests/eds/Makefile.am
@@ -75,6 +75,7 @@ noinst_PROGRAMS = \
 	set-properties-race \
 	set-birthday \
 	set-roles \
+	linkable-properties \
 	link-personas-diff-stores \
 	enable-disable-stores \
 	create-remove-stores \
@@ -153,6 +154,10 @@ set_avatar_SOURCES = \
 	set-avatar.vala \
 	$(NULL)
 
+linkable_properties_SOURCES = \
+	linkable-properties.vala \
+	$(NULL)
+
 set_emails_SOURCES = \
 	set-emails.vala \
 	$(NULL)
diff --git a/tests/eds/linkable-properties.vala b/tests/eds/linkable-properties.vala
new file mode 100644
index 0000000..68fcf5c
--- /dev/null
+++ b/tests/eds/linkable-properties.vala
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2012 Collabora Ltd.
+ *
+ * This library is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Authors: Raul Gutierrez Segales <raul gutierrez segales collabora co uk>
+ *          Travis Reitter <travis reitter collabora co uk>
+ *
+ */
+
+using EdsTest;
+using Folks;
+using Gee;
+
+public class LinkablePropertiesTests : Folks.TestCase
+{
+  private EdsTest.Backend _eds_backend;
+  private IndividualAggregator _aggregator;
+  private GLib.MainLoop _main_loop;
+  private bool _found_before_update;
+  private bool _found_after_update;
+
+  public LinkablePropertiesTests ()
+    {
+      base ("LinkableProperties");
+
+      this.add_test ("expected behavior from linkable properties",
+          this.test_linkable_properties_excess_individuals);
+    }
+
+  public override void set_up ()
+    {
+      this._eds_backend = new EdsTest.Backend ();
+      this._eds_backend.set_up ();
+
+      /* We configure eds as the primary store */
+      var config_val = "eds:%s".printf (this._eds_backend.address_book_uid);
+      Environment.set_variable ("FOLKS_PRIMARY_STORE", config_val, true);
+    }
+
+  public override void tear_down ()
+    {
+      this._eds_backend.tear_down ();
+    }
+
+  /* Ensure that changes to linkable properties do not result in excessive
+   * Individual constructions and destructions.
+   *
+   * This test is intended to remove those concerns from the other, more-basic
+   * property tests.
+   */
+  void test_linkable_properties_excess_individuals ()
+    {
+      Gee.HashMap<string, Value?> c1 = new Gee.HashMap<string, Value?> ();
+      this._main_loop = new GLib.MainLoop (null, false);
+      Value? v;
+
+      this._found_before_update = false;
+      this._found_after_update = false;
+
+      this._eds_backend.reset ();
+
+      v = Value (typeof (string));
+      v.set_string ("bernie h. innocenti");
+      c1.set ("full_name", (owned) v);
+      this._eds_backend.add_contact (c1);
+
+      this._test_linkable_properties_excess_individuals_async.begin ();
+
+      Timeout.add_seconds (5, () =>
+        {
+          this._main_loop.quit ();
+          assert_not_reached ();
+        });
+
+      this._main_loop.run ();
+
+      assert (this._found_before_update);
+      assert (this._found_after_update);
+    }
+
+  private async void _test_linkable_properties_excess_individuals_async ()
+    {
+      yield this._eds_backend.commit_contacts_to_addressbook ();
+
+      var store = BackendStore.dup ();
+      yield store.prepare ();
+      this._aggregator = new IndividualAggregator ();
+      this._aggregator.individuals_changed_detailed.connect
+          (this._individuals_changed_cb);
+      try
+        {
+          yield this._aggregator.prepare ();
+        }
+      catch (GLib.Error e)
+        {
+          GLib.warning ("Error when calling prepare: %s\n", e.message);
+        }
+    }
+
+  private void _individuals_changed_cb (
+       MultiMap<Individual?, Individual?> changes)
+    {
+      var added = changes.get_values ();
+      var removed = changes.get_keys ();
+
+      foreach (Individual i in added)
+        {
+          assert (i != null);
+
+          var name = (Folks.NameDetails) i;
+
+          if (name.full_name == "bernie h. innocenti")
+            {
+              i.notify["email-addresses"].connect (this._notify_emails_cb);
+              this._found_before_update = true;
+
+              foreach (var p in i.personas)
+                {
+                  var emails = new HashSet<EmailFieldDetails> (
+                      (GLib.HashFunc) EmailFieldDetails.hash,
+                      (GLib.EqualFunc) EmailFieldDetails.equal);
+                  var email_1 = new EmailFieldDetails ("bernie example org");
+                  email_1.set_parameter (AbstractFieldDetails.PARAM_TYPE,
+                      AbstractFieldDetails.PARAM_TYPE_OTHER);
+                  emails.add (email_1);
+                  ((EmailDetails) p).email_addresses = emails;
+                }
+            }
+        }
+
+      assert (removed.size == 1);
+
+      foreach (var i in removed)
+        {
+          assert (i == null);
+        }
+    }
+
+  private void _notify_emails_cb (Object individual_obj, ParamSpec ps)
+    {
+      Folks.Individual i = (Folks.Individual) individual_obj;
+      foreach (var e in i.email_addresses)
+        {
+          if (e.value == "bernie example org")
+            {
+              this._found_after_update = true;
+              this._main_loop.quit ();
+            }
+        }
+    }
+}
+
+public int main (string[] args)
+{
+  Test.init (ref args);
+
+  TestSuite root = TestSuite.get_root ();
+  root.add_suite (new LinkablePropertiesTests ().get_suite ());
+
+  Test.run ();
+
+  return 0;
+}
diff --git a/tests/eds/set-emails.vala b/tests/eds/set-emails.vala
index 8f4ce3d..823aef0 100644
--- a/tests/eds/set-emails.vala
+++ b/tests/eds/set-emails.vala
@@ -104,7 +104,6 @@ public class SetEmailsTests : Folks.TestCase
        MultiMap<Individual?, Individual?> changes)
     {
       var added = changes.get_values ();
-      var removed = changes.get_keys ();
 
       foreach (Individual i in added)
         {
@@ -130,13 +129,6 @@ public class SetEmailsTests : Folks.TestCase
                 }
             }
         }
-
-      assert (removed.size == 1);
-
-      foreach (var i in removed)
-        {
-          assert (i == null);
-        }
     }
 
   private void _notify_emails_cb (Object individual_obj, ParamSpec ps)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]