/* * Copyright (C) 2011 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 . * * Authors: Alban Crequy * */ using LibsocialwebTest; using Folks; using Gee; using GLib; public class AggregationTests : LibsocialwebTest.TestCase { private static const string STORE_FILE_PATH = "folks-test-libsocialweb-aggregation-store.ini"; private static const string KF_RELATIONSHIPS_FILE_PATH = "folks-test-libsocialweb-aggregation-relationships.ini"; public AggregationTests () { base ("Aggregation"); this.add_test ("libsocialweb aggregation", this.test_aggregation_libsocialweb); } public override void set_up () { /* Ensure we have a primary store for linking */ Environment.set_variable ("FOLKS_BACKENDS_ALLOWED", "libsocialweb,key-file", true); Environment.set_variable ("FOLKS_PRIMARY_STORE", "key-file", true); /* Initialize an empty key file for the relationships*/ var kf_relationships_path = Path.build_filename ( Environment.get_tmp_dir (), AggregationTests.KF_RELATIONSHIPS_FILE_PATH, null); Environment.set_variable ("FOLKS_BACKEND_KEY_FILE_PATH", kf_relationships_path, true); string kf_relationships_data = "#\n"; File kf_relationships_f = File.new_for_path (kf_relationships_path); try { kf_relationships_f.replace_contents (kf_relationships_data.data, null, false, FileCreateFlags.PRIVATE, null); } catch (Error e) { error ("Could not write relationship file '%s': %s", kf_relationships_path, e.message); } /* Use a temporary key file for the BackendStore */ var kf_path = Path.build_filename (Environment.get_tmp_dir (), AggregationTests.STORE_FILE_PATH, null); FileUtils.remove (kf_path); GLib.KeyFile kf = new GLib.KeyFile (); kf.set_boolean("all-others", "enabled", false); kf.set_boolean("libsocialweb", "enabled", true); kf.set_boolean("key-file", "enabled", true); try { File backend_f = File.new_for_path (kf_path); string data = kf.to_data (); backend_f.replace_contents (data.data, null, false, FileCreateFlags.PRIVATE, null); } catch (Error e) { error ("Could not write updated backend key file '%s': %s", kf_path, e.message); } Environment.set_variable ("FOLKS_BACKEND_STORE_KEY_FILE_PATH", kf_path, true); /* Chain up to set up the LSW backend */ base.set_up (); } public void test_aggregation_libsocialweb () { var main_loop = new GLib.MainLoop (null, false); var lsw_backend = (!) this.lsw_backend; var mysocialnetwork1 = lsw_backend.add_service ("mysocialnetwork1"); var mysocialnetwork2 = lsw_backend.add_service ("mysocialnetwork2"); var signals = new DisconnectionQueue (); /* Populate mysocialnetwork1 */ signals.push (mysocialnetwork1, mysocialnetwork1.OpenViewCalled.connect((query, p, path) => { var view = mysocialnetwork1.contact_views[path]; signals.push (view, view.StartCalled.connect ( (path) => { Idle.add (() => { string text = "([('mysocialnetwork1', 'garg', %x, " + "{'id': ['garg'], 'name': ['Gargantua']})],)"; Variant v = new Variant.parsed (text, 1300792578); try { var conn = Bus.get_sync (BusType.SESSION); conn.emit_signal (null, path, "org.gnome.libsocialweb.ContactView", "ContactsAdded", v); } catch (GLib.IOError e) { assert_not_reached (); } catch (GLib.Error e) { assert_not_reached (); } return false; }); })); })); /* Populate mysocialnetwork2 */ signals.push (mysocialnetwork2, mysocialnetwork2.OpenViewCalled.connect((query, p, path) => { var view = mysocialnetwork2.contact_views[path]; signals.push (view, view.StartCalled.connect ( (path) => { Idle.add (() => { string text = "([('mysocialnetwork2', 'panta', %x, " + "{'id': ['panta'], 'name': ['Pantagruel']})],)"; Variant v = new Variant.parsed (text, 1300792579); try { var conn = Bus.get_sync (BusType.SESSION); conn.emit_signal (null, path, "org.gnome.libsocialweb.ContactView", "ContactsAdded", v); } catch (GLib.IOError e) { assert_not_reached (); } catch (GLib.Error e) { assert_not_reached (); } return false; }); })); })); var aggregator = IndividualAggregator.dup (); Individual[] individual_gathered = new Individual[0]; var handler_id = aggregator.individuals_changed_detailed.connect ((changes) => { var added = changes.get_values (); debug ("initial individuals_changed"); foreach (Individual i in added) { if (i == null) { continue; } individual_gathered += i; } if (individual_gathered.length >= 2) main_loop.quit (); }); aggregator.prepare.begin (); TestUtils.loop_run_with_timeout (main_loop, 5); aggregator.disconnect (handler_id); /* Check the aggregator got the correct data */ assert (individual_gathered.length == 2); assert ( (((Folks.NameDetails) individual_gathered[0]).nickname == "Gargantua" && ((Folks.NameDetails) individual_gathered[1]).nickname == "Pantagruel") || (((Folks.NameDetails) individual_gathered[0]).nickname == "Pantagruel" && ((Folks.NameDetails) individual_gathered[1]).nickname == "Gargantua")); /* Check the result of link_personas */ signals.push (aggregator, aggregator.individuals_changed_detailed.connect ((changes) => { var added = changes.get_values (); var removed = changes.get_keys (); debug ("individuals_changed after link: added:%u removed:%u", added.size, removed.size); assert (added.size == 2); /* should be identical */ assert (removed.size == 2); Individual? added_ind = null; foreach (var i in added) { assert (i != null); assert (added_ind == null || added_ind == i); added_ind = i; assert (i.personas.size == 3); debug ("individuals_changed: 1 individual containing %u personas", i.personas.size); } foreach (var i in removed) { assert (i != null); } main_loop.quit (); })); /* Link personas */ var personas = new HashSet (); var personas1 = new GLib.List (); foreach (var p1 in individual_gathered[0].personas) { personas.add (p1); personas1.append (p1); } var personas2 = new GLib.List (); foreach (var p2 in individual_gathered[1].personas) { personas.add (p2); personas2.append (p2); } assert (personas.size == 2); Idle.add (() => { aggregator.link_personas.begin (personas); return false; }); TestUtils.loop_run_with_timeout (main_loop, 5); signals.drain (); } } public int main (string[] args) { Test.init (ref args); var tests = new AggregationTests (); tests.register (); Test.run (); tests.final_tear_down (); return 0; }