/* * 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: Raul Gutierrez Segales * */ using Folks; using Gee; public class RemovePersonaTests : EdsTest.TestCase { private GLib.MainLoop _main_loop; private IndividualAggregator _aggregator; private string _persona_fullname; private bool _persona_removed; private bool _individual_removed; private string _individual_id; private PersonaStore _pstore; private string _persona_id; private Individual _individual; private bool _added_persona = false; public RemovePersonaTests () { base ("RemovePersonaTests"); this.add_test ("test removing personas from e-d-s ", this.test_remove_persona); } public void test_remove_persona () { this._main_loop = new GLib.MainLoop (null, false); this._persona_fullname = "persona #1"; this._persona_removed = false; this._individual_removed = false; this._test_remove_persona_async.begin (); TestUtils.loop_run_with_timeout (this._main_loop); assert (this._persona_removed == true); assert (this._individual_removed == true); } private async void _test_remove_persona_async () { var store = BackendStore.dup (); yield store.prepare (); this._aggregator = IndividualAggregator.dup (); this._aggregator.individuals_changed_detailed.connect (this._individuals_changed_cb); try { yield this._aggregator.prepare (); this._pstore = null; foreach (var backend in store.enabled_backends.values) { this._pstore = (Edsf.PersonaStore) backend.persona_stores.get ( this.eds_backend.address_book_uid); if (this._pstore != null) break; } assert (this._pstore != null); this._pstore.notify["is-prepared"].connect (this._notify_pstore_cb); this._try_to_add (); } catch (GLib.Error e) { GLib.warning ("Error when calling prepare: %s\n", e.message); } } private void _notify_pstore_cb (Object _pstore, ParamSpec ps) { this._try_to_add (); } private void _try_to_add () { if (this._pstore.is_prepared && this._added_persona == false) { this._added_persona = true; this._add_persona.begin (); } } private async void _add_persona () { HashTable details = new HashTable (str_hash, str_equal); Value? v1 = Value (typeof (string)); v1.set_string (this._persona_fullname); details.insert (Folks.PersonaStore.detail_key (PersonaDetail.FULL_NAME), (owned) v1); try { yield this._aggregator.add_persona_from_details (null, this._pstore, details); } catch (Folks.IndividualAggregatorError e) { GLib.warning ("[RemovePersonaError] add_persona_from_details: %s\n", e.message); } } private void _individuals_changed_cb ( MultiMap changes) { var added = changes.get_values (); var removed = changes.get_keys (); foreach (var i in added) { if (i == null) { continue; } if (i.full_name == this._persona_fullname) { this._individual_id = i.id; /* Only examine the first persona */ foreach (var p in i.personas) { this._persona_id = p.iid; break; } this._individual = i; if (this._pstore.personas.has_key (this._persona_id) == true) { this._pstore.personas_changed.connect (this._personas_cb); this._aggregator.remove_individual.begin (this._individual); } } } foreach (var i in removed) { if (i == null) { continue; } if (i.id == this._individual_id) { this._individual_removed = true; } } } private void _personas_cb () { if (this._pstore.personas.has_key (this._persona_id) == false) { this._persona_removed = true; this._main_loop.quit (); } } } public int main (string[] args) { Test.init (ref args); var tests = new RemovePersonaTests (); tests.register (); Test.run (); tests.final_tear_down (); return 0; }