/*
* 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 AvatarUpdatesTests : TrackerTest.TestCase
{
private IndividualAggregator _aggregator;
private bool _updated_avatar_found;
private string _updated_avatar_uri;
private LoadableIcon _updated_avatar;
private string _individual_id;
private GLib.MainLoop _main_loop;
private bool _initial_avatar_found;
private string _initial_fullname;
private string _initial_avatar_uri;
private string _contact_urn;
private string _photo_urn;
public AvatarUpdatesTests ()
{
base ("AvatarUpdates");
((!) this.tracker_backend).debug = false;
this.add_test ("avatar updates", this.test_avatar_updates);
}
public void test_avatar_updates ()
{
this._main_loop = new GLib.MainLoop (null, false);
Gee.HashMap c1 = new Gee.HashMap ();
this._initial_fullname = "persona #1";
this._initial_avatar_uri = "file:///tmp/avatar-01";
this._contact_urn = "";
this._photo_urn = "<" + this._initial_avatar_uri + ">";
this._updated_avatar_uri = "file:///tmp/avatar-02";
this._updated_avatar =
new FileIcon (File.new_for_uri (this._updated_avatar_uri));
c1.set (TrackerTest.Backend.URN, this._contact_urn);
c1.set (Trf.OntologyDefs.NCO_FULLNAME, this._initial_fullname);
c1.set (Trf.OntologyDefs.NCO_PHOTO, this._initial_avatar_uri);
((!) this.tracker_backend).add_contact (c1);
((!) this.tracker_backend).set_up ();
this._initial_avatar_found = false;
this._updated_avatar_found = false;
this._individual_id = "";
test_avatar_updates_async.begin ();
TestUtils.loop_run_with_timeout (this._main_loop);
assert (this._initial_avatar_found == true);
assert (this._updated_avatar_found == true);
}
private async void test_avatar_updates_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 ();
}
catch (GLib.Error e)
{
GLib.warning ("Error when calling prepare: %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)
{
assert (i != null);
if (i.full_name == this._initial_fullname)
{
i.notify["avatar"].connect (this._notify_avatar_cb);
this._individual_id = i.id;
var initial_avatar =
new FileIcon (File.new_for_uri (this._initial_avatar_uri));
if (i.avatar != null && i.avatar.equal (initial_avatar) == true)
{
this._initial_avatar_found = true;
((!) this.tracker_backend).remove_triplet (this._contact_urn,
Trf.OntologyDefs.NCO_PHOTO, this._photo_urn);
string photo_urn_2 = "<" + this._updated_avatar_uri;
photo_urn_2 += ">";
((!) this.tracker_backend).insert_triplet (photo_urn_2,
"a", "nfo:Image, nie:DataObject",
Trf.OntologyDefs.NIE_URL,
this._updated_avatar_uri);
((!) this.tracker_backend).insert_triplet
(this._contact_urn,
Trf.OntologyDefs.NCO_PHOTO, photo_urn_2);
}
}
}
assert (removed.size == 1);
foreach (var i in removed)
{
assert (i == null);
}
}
private void _notify_avatar_cb ()
{
var i = this._aggregator.individuals.get (this._individual_id);
if (i == null)
return;
if (i.avatar != null &&
i.avatar.equal (this._updated_avatar))
{
this._main_loop.quit ();
this._updated_avatar_found = true;
}
}
}
public int main (string[] args)
{
Test.init (ref args);
var tests = new AvatarUpdatesTests ();
tests.register ();
Test.run ();
tests.final_tear_down ();
return 0;
}