/* * 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 Tracker.Sparql; using TrackerTest; using Folks; using Gee; public class AddPersonaTests : TrackerTest.TestCase { private GLib.MainLoop _main_loop; private IndividualAggregator _aggregator; private string _persona_fullname; private string _persona_nickname; private string _family_name; private string _given_name; private HashTable _properties_found; private string _persona_iid; private LoadableIcon _avatar; private string _birthday; private DateTime _bday; private string _email_1; private string _email_2; private string _im_addr_1; private string _im_addr_2; private string _note_1; private string _phone_1; private string _phone_2; private string _title_1; private string _organisation_1; private string _role_1; private PostalAddressFieldDetails _postal_address_fd; private string _po_box = "12345"; private string _locality = "locality"; private string _postal_code = "code"; private string _street = "some street"; private string _extension = "some extension"; private string _country = "some country"; private string _region = "some region"; private string _url_1 = "http://www-1.example.org"; private string _url_2 = "http://www-1.example.org"; private Trf.PersonaStore _pstore; private bool _added_persona = false; public AddPersonaTests () { base ("AddPersonaTests"); this.add_test ("test adding personas to Tracker ", this.test_add_persona); } public void test_add_persona () { this._main_loop = new GLib.MainLoop (null, false); this._persona_fullname = "persona #1"; this._persona_nickname = "nickname"; this._family_name = "family"; this._given_name = "given"; this._persona_iid = ""; var _avatar_path = Folks.TestUtils.get_source_test_data ( "data/avatar-01.jpg"); this._avatar = new FileIcon (File.new_for_path (_avatar_path)); this._birthday = "2001-10-26T20:32:52Z"; this._email_1 = "someone-1@example.org"; this._email_2 = "someone-2@example.org"; this._im_addr_1 = "someone-1@jabber.example.org"; this._im_addr_2 = "someone-2@jabber.example.org"; this._note_1 = "this is a note"; this._phone_1 = "12345"; this._phone_2 = "54321"; this._title_1 = "CFO"; this._organisation_1 = "Example Inc."; this._role_1 = "Role"; var address = new PostalAddress (this._po_box, this._extension, this._street, this._locality, this._region, this._postal_code, this._country, null, null); this._postal_address_fd = new PostalAddressFieldDetails (address); TimeVal t = TimeVal (); t.from_iso8601 (this._birthday); this._bday = new DateTime.from_timeval_utc (t); this._properties_found = new HashTable (str_hash, str_equal); this._properties_found.insert ("full_name", false); this._properties_found.insert ("nickname", false); this._properties_found.insert ("is_favourite", false); this._properties_found.insert ("structured_name", false); this._properties_found.insert ("avatar", false); this._properties_found.insert ("birthday", false); this._properties_found.insert ("gender", false); this._properties_found.insert ("email-1", false); this._properties_found.insert ("email-2", false); this._properties_found.insert ("im-addr-1", false); this._properties_found.insert ("im-addr-2", false); this._properties_found.insert ("note-1", false); this._properties_found.insert ("phone-1", false); this._properties_found.insert ("phone-2", false); this._properties_found.insert ("role-1", false); this._properties_found.insert ("postal-address-1", false); this._properties_found.insert ("url-1", false); this._properties_found.insert ("url-2", false); this._test_add_persona_async.begin (); TestUtils.loop_run_with_timeout (this._main_loop); foreach (var k in this._properties_found.get_values ()) { assert (k); } } private async void _test_add_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 = (Trf.PersonaStore) backend.persona_stores.get ("tracker"); 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 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); Value? v2 = Value (typeof (string)); v2.set_string (this._persona_nickname); details.insert (Folks.PersonaStore.detail_key (PersonaDetail.NICKNAME), (owned) v2); Value? v3 = Value (typeof (bool)); v3.set_boolean (true); details.insert ( Folks.PersonaStore.detail_key (PersonaDetail.IS_FAVOURITE), (owned) v3); Value? v4 = Value (typeof (StructuredName)); StructuredName sname = new StructuredName (this._family_name, this._given_name, null, null, null); v4.set_object (sname); details.insert ( Folks.PersonaStore.detail_key (PersonaDetail.STRUCTURED_NAME), (owned) v4); Value? v5 = Value (typeof (LoadableIcon)); v5.set_object (this._avatar); details.insert (Folks.PersonaStore.detail_key (PersonaDetail.AVATAR), (owned) v5); Value? v6 = Value (typeof (DateTime)); TimeVal t = TimeVal (); t.from_iso8601 (this._birthday); DateTime dobj = new DateTime.from_timeval_utc (t); v6.set_boxed (dobj); details.insert (Folks.PersonaStore.detail_key (PersonaDetail.BIRTHDAY), (owned) v6); Value? v7 = Value (typeof (Folks.Gender)); v7.set_enum (Folks.Gender.MALE); details.insert (Folks.PersonaStore.detail_key (PersonaDetail.GENDER), (owned) v7); Value? v8 = Value (typeof (Set)); var emails = new HashSet ( AbstractFieldDetails.hash_static, AbstractFieldDetails.equal_static); var email_1 = new EmailFieldDetails (this._email_1); emails.add (email_1); var email_2 = new EmailFieldDetails (this._email_2); emails.add (email_2); v8.set_object (emails); details.insert ( Folks.PersonaStore.detail_key (PersonaDetail.EMAIL_ADDRESSES), (owned) v8); Value? v9 = Value (typeof (MultiMap)); var im_addrs = new HashMultiMap (null, null, AbstractFieldDetails.hash_static, AbstractFieldDetails.equal_static); im_addrs.set ("jabber", new ImFieldDetails (this._im_addr_1)); im_addrs.set ("yahoo", new ImFieldDetails (this._im_addr_2)); v9.set_object (im_addrs); details.insert ( Folks.PersonaStore.detail_key (PersonaDetail.IM_ADDRESSES), v9); Value? v10 = Value (typeof (Set)); var notes = new HashSet ( AbstractFieldDetails.hash_static, AbstractFieldDetails.equal_static); NoteFieldDetails note_fd_1 = new NoteFieldDetails (this._note_1); notes.add (note_fd_1); v10.set_object (notes); details.insert (Folks.PersonaStore.detail_key (PersonaDetail.NOTES), (owned) v10); Value? v11 = Value (typeof (Set)); var phones = new HashSet ( AbstractFieldDetails.hash_static, AbstractFieldDetails.equal_static); var phone_1 = new PhoneFieldDetails (this._phone_1); phones.add (phone_1); var phone_2 = new PhoneFieldDetails (this._phone_2); phones.add (phone_2); v11.set_object (phones); details.insert ( Folks.PersonaStore.detail_key (PersonaDetail.PHONE_NUMBERS), (owned) v11); Value? v12 = Value (typeof (Set)); var role_fds = new HashSet ( AbstractFieldDetails.hash_static, AbstractFieldDetails.equal_static); var r1 = new Role (this._title_1, this._organisation_1); r1.role = this._role_1; var role_fd1 = new RoleFieldDetails (r1); role_fds.add (role_fd1); v12.set_object (role_fds); details.insert (Folks.PersonaStore.detail_key (PersonaDetail.ROLES), (owned) v12); Value? v13 = Value (typeof (Set)); var postal_addresses = new HashSet ( AbstractFieldDetails.hash_static, AbstractFieldDetails.equal_static); var postal_a = new PostalAddress (this._po_box, this._extension, this._street, this._locality, this._region, this._postal_code, this._country, null, null); var postal_a_fd = new PostalAddressFieldDetails (postal_a); postal_addresses.add (postal_a_fd); v13.set_object (postal_addresses); details.insert ( Folks.PersonaStore.detail_key (PersonaDetail.POSTAL_ADDRESSES), (owned) v13); Value? v14 = Value (typeof (Set)); var urls = new HashSet ( AbstractFieldDetails.hash_static, AbstractFieldDetails.equal_static); var url_1 = new UrlFieldDetails (this._url_1); urls.add (url_1); var url_2 = new UrlFieldDetails (this._url_2); urls.add (url_2); v14.set_object (urls); details.insert (Folks.PersonaStore.detail_key (PersonaDetail.URLS), (owned) v14); try { Trf.Persona persona = (Trf. Persona) yield this._aggregator.add_persona_from_details (null, this._pstore, details); this._persona_iid = persona.iid; } catch (Folks.IndividualAggregatorError e) { GLib.warning ("[AddPersonaError] add_persona_from_details: %s\n", e.message); } } private void _individuals_changed_cb ( MultiMap changes) { var added = changes.get_values (); foreach (var i in added) { assert (i != null); if (i.is_user == false) { /* NOTE: * we also listen to the Trf.Persona's structured-name * because if only one of its property is updated * Individual won't fire a notification. */ foreach (var p in i.personas) { if (p is NameDetails && ((NameDetails) p).structured_name != null) { p.notify["structured-name"].connect (this._notify_persona_sname); } } i.notify["full-name"].connect (this._notify_cb); i.notify["nickname"].connect (this._notify_cb); i.notify["avatar"].connect (this._notify_cb); i.notify["is-favourite"].connect (this._notify_cb); i.notify["structured-name"].connect (this._notify_cb); i.notify["family-name"].connect (this._notify_cb); i.notify["given-name"].connect (this._notify_cb); i.notify["avatar"].connect (this._notify_cb); i.notify["birthday"].connect (this._notify_cb); i.notify["gender"].connect (this._notify_cb); i.notify["email-addresses"].connect (this._notify_cb); i.notify["im-addresses"].connect (this._notify_cb); i.notify["notes"].connect (this._notify_cb); i.notify["phone-numbers"].connect (this._notify_cb); i.notify["roles"].connect (this._notify_cb); i.notify["postal-addresses"].connect (this._notify_cb); i.notify["urls"].connect (this._notify_cb); this._check_properties (i); } } } private void _notify_cb (Object individual_obj, ParamSpec ps) { Folks.Individual i = (Folks.Individual) individual_obj; this._check_properties (i); } private void _notify_persona_sname (Object persona_p, ParamSpec ps) { Trf.Persona persona = (Trf.Persona) persona_p; this._check_sname (persona.structured_name); this._exit_if_all_properties_found (); } 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 void _check_properties (Individual i) { if (i.full_name == this._persona_fullname) this._properties_found.replace ("full_name", true); if (i.nickname == this._persona_nickname) this._properties_found.replace ("nickname", true); if (i.is_favourite) this._properties_found.replace ("is_favourite", true); if (i.structured_name != null) { this._check_sname (i.structured_name); } if (i.birthday != null && i.birthday.compare (this._bday) == 0) this._properties_found.replace ("birthday", true); if (i.gender == Gender.MALE) this._properties_found.replace ("gender", true); foreach (var e in i.email_addresses) { if (e.value == this._email_1) { this._properties_found.replace ("email-1", true); } else if (e.value == this._email_2) { this._properties_found.replace ("email-2", true); } } foreach (var proto in i.im_addresses.get_keys ()) { var addrs = i.im_addresses.get (proto); foreach (var a in addrs) { if (a.value == this._im_addr_1) this._properties_found.replace ("im-addr-1", true); else if (a.value == this._im_addr_2) this._properties_found.replace ("im-addr-2", true); } } foreach (var n in i.notes) { if (n.equal (new NoteFieldDetails (this._note_1))) { this._properties_found.replace ("note-1", true); } } foreach (var phone_fd in i.phone_numbers) { if (phone_fd.equal (new PhoneFieldDetails (this._phone_1))) { this._properties_found.replace ("phone-1", true); } else if (phone_fd.equal (new PhoneFieldDetails (this._phone_2))) { this._properties_found.replace ("phone-2", true); } } foreach (var role_fd in i.roles) { var role_expected = new Role (this._title_1, this._organisation_1); role_expected.role = this._role_1; var role_fd_expected = new RoleFieldDetails (role_expected); if (role_fd.equal (role_fd_expected)) this._properties_found.replace ("role-1", true); } foreach (var pafd in i.postal_addresses) { this._postal_address_fd.id = pafd.id; if (pafd.equal (this._postal_address_fd)) this._properties_found.replace ("postal-address-1", true); } foreach (var u in i.urls) { if (u.value == this._url_1) this._properties_found.replace ("url-1", true); if (u.value == this._url_2) this._properties_found.replace ("url-2", true); } if (i.avatar != null) { /* arbitrary icon size, but it might as well be on the small side */ TestUtils.loadable_icons_content_equal.begin (i.avatar, this._avatar, 100, (obj, result) => { if (TestUtils.loadable_icons_content_equal.end (result)) this._properties_found.replace ("avatar", true); this._exit_if_all_properties_found (); }); } this._exit_if_all_properties_found (); } private void _exit_if_all_properties_found () { foreach (var k in this._properties_found.get_keys ()) { var v = this._properties_found.lookup (k); if (v == false) return; } this._main_loop.quit (); } private void _check_sname (StructuredName sname) { if (sname.family_name == this._family_name && sname.given_name == this._given_name) this._properties_found.replace ("structured_name", true); } } public int main (string[] args) { Test.init (ref args); var tests = new AddPersonaTests (); tests.register (); Test.run (); tests.final_tear_down (); return 0; }