/* * 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; using SocialWebClient; public class DummyLswTests : LibsocialwebTest.TestCase { public DummyLswTests () { base ("DummyLsw"); this.add_test ("dummy libsocialweb", this.test_dummy_libsocialweb); } public void test_dummy_libsocialweb () { var main_loop = new GLib.MainLoop (null, false); var lsw_backend = (!) this.lsw_backend; var mysocialnetwork = lsw_backend.add_service ("mysocialnetwork"); var p = new GLib.HashTable (null, null); var signals = new DisconnectionQueue (); try { var view_path = mysocialnetwork.OpenView("feed", p); var conn = Bus.get_sync (BusType.SESSION); conn.get_proxy .begin ( "org.gnome.libsocialweb", view_path, 0, null, (v) => { LibsocialwebTest.ContactView view = (LibsocialwebTest.ContactView)v; view.Start.begin (); mysocialnetwork.contact_views[view_path].ContactsAdded (new LibsocialwebTest.LibsocialwebContactViewTest .ContactsAddedElement[0]); mysocialnetwork.contact_views[view_path].ContactsAdded (new LibsocialwebTest.LibsocialwebContactViewTest .ContactsAddedElement[0]); main_loop.quit (); }); } catch (GLib.IOError e) { assert_not_reached (); } TestUtils.loop_run_with_timeout (main_loop, 5); /* Test adding two contacts */ string view_path = ""; signals.push (mysocialnetwork, mysocialnetwork.OpenViewCalled.connect((query, p, path) => { debug ("mysocialnetwork.OpenViewCalled.connect"); view_path = path; var view = mysocialnetwork.contact_views[path]; signals.push (view, view.StartCalled.connect ( (path) => { debug ("OpenViewCalled.connect"); Idle.add (() => { string text = "([('mysocialnetwork', 'id01', %x, " + "{'id': ['id01'], 'name': ['Gargantua'], " + "'X-foo': ['secret']}), " + "('mysocialnetwork', 'id02', %x, " + "{'id': ['id02'], 'name': ['Pantagruel']})],)"; Variant v = new Variant.parsed (text, 1300792578, 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? i1 = null; Individual? i2 = null; var handler_id = aggregator.individuals_changed_detailed.connect ((changes) => { var added = changes.get_values (); var removed = changes.get_keys (); debug ("Aggregator got some data!"); assert (added.size == 2); assert (removed.size == 1); foreach (var i in added) { string nickname = ((Folks.NameDetails) i).nickname; if (nickname == "Gargantua") i1 = i; if (nickname == "Pantagruel") i2 = i; } foreach (var i in removed) { assert (i == null); } main_loop.quit (); }); aggregator.prepare.begin (); TestUtils.loop_run_with_timeout (main_loop, 5); aggregator.disconnect (handler_id); assert (i1 != null); assert (i2 != null); Folks.Persona persona1 = null; Folks.Persona persona2 = null; foreach (var p1 in i1.personas) { persona1 = p1; break; } foreach (var p2 in i2.personas) { persona2 = p2; break; } assert (persona1 is Swf.Persona); assert (persona2 is Swf.Persona); Contact contact1 = ((Swf.Persona) persona1).lsw_contact; Contact contact2 = ((Swf.Persona) persona2).lsw_contact; assert (contact1 != null); assert (contact2 != null); assert (contact1.get_value ("id") == "id01"); assert (contact1.get_value ("X-foo") == "secret"); assert (contact1.get_value ("X-bar") == null); assert (contact2.get_value ("id") == "id02"); assert (contact2.get_value ("X-foo") == null); /* Test changing a contact */ Idle.add (() => { string text = "([('mysocialnetwork', 'id01', %x, " + "{'id': ['id01'], 'name': ['Rabelais'], " + "'X-foo': ['secret'], 'X-bar': ['bar']})],)"; Variant v = new Variant.parsed (text, 1300792581); try { var conn = Bus.get_sync (BusType.SESSION); conn.emit_signal (null, view_path, "org.gnome.libsocialweb.ContactView", "ContactsChanged", v); } catch (GLib.IOError e) { assert_not_reached (); } catch (GLib.Error e) { assert_not_reached (); } return false; }); handler_id = i1.notify["nickname"].connect ( () => { debug ("Aggregator changed some data!"); string nickname = ((Folks.NameDetails) i1).nickname; assert (nickname == "Rabelais"); assert (contact1.get_value ("id") == "id01"); assert (contact1.get_value ("X-foo") == "secret"); assert (contact1.get_value ("X-bar") == "bar"); main_loop.quit (); }); TestUtils.loop_run_with_timeout (main_loop, 5); i1.disconnect (handler_id); /* Test deleting two contacts */ Idle.add (() => { string text = "([('mysocialnetwork', 'id01'), " + "('mysocialnetwork', 'id02')],)"; Variant v = new Variant.parsed (text); try { var conn = Bus.get_sync (BusType.SESSION); conn.emit_signal (null, view_path, "org.gnome.libsocialweb.ContactView", "ContactsRemoved", v); } catch (GLib.IOError e) { assert_not_reached (); } catch (GLib.Error e) { assert_not_reached (); } return false; }); handler_id = aggregator.individuals_changed_detailed.connect ((changes) => { var added = changes.get_values (); var removed = changes.get_keys (); debug ("Aggregator deleted some data!"); assert (added.size == 2); assert (removed.size == 2); foreach (var i in removed) { assert (i != null); string nickname = ((Folks.NameDetails) i).nickname; debug ("deleted nickname: %s", nickname); } foreach (var i in added) { assert (i == null); } main_loop.quit (); }); TestUtils.loop_run_with_timeout (main_loop, 5); aggregator.disconnect (handler_id); } } public int main (string[] args) { Test.init (ref args); var tests = new DummyLswTests (); tests.register (); Test.run (); tests.final_tear_down (); return 0; }