build: Pass make distcheck
[zeitgeist:zeitgeist.git] / test / direct / event-test.vala
1 /* event-test.vala
2  *
3  * Copyright © 2012 Christian Dywan <christian@twotoasts.de>
4  *
5  * Based upon a C implementation (© 2010 Canonical Ltd) by:
6  *  Mikkel Kamstrup Erlandsen <mikkel.kamstrup@canonical.com>
7  *
8  * This program is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License as published by
10  * the Free Software Foundation, either version 2.1 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20  *
21  */
22
23 using Zeitgeist;
24 using Assertions;
25
26 int main (string[] argv)
27 {
28     Test.init (ref argv);
29
30     Test.add_func ("/Event/CreateEmpty", create_empty_test);
31     Test.add_func ("/Event/CreateFull", create_full_test);
32     Test.add_func ("/Event/ActorFromAppInfo", actor_from_app_info_test);
33     Test.add_func ("/Event/FromVariant", from_variant_test);
34     Test.add_func ("/Event/FromVariantWithNewFields", from_variant_with_new_fields_test);
35     Test.add_func ("/Event/EmptyToFromVariant", empty_to_from_variant_test);
36     Test.add_func ("/Event/WithOneSubjectToFromVariant", with_one_subject_to_from_variant_test);
37     Test.add_func ("/Event/3EventsToFromVariant", three_events_to_from_variant_test);
38     Test.add_func ("/Event/0EventsToFromVariant", zero_events_to_from_variant_test);
39
40     return Test.run ();
41 }
42
43 void create_empty_test ()
44 {
45     var ev = new Event ();
46
47     assert (ev.id == 0);
48     assert (ev.timestamp == 0);
49     assert_cmpstr (ev.interpretation, OperatorType.EQUAL, null);
50     assert_cmpstr (ev.manifestation, OperatorType.EQUAL, null);
51     assert_cmpstr (ev.actor, OperatorType.EQUAL, null);
52     assert_cmpstr (ev.origin, OperatorType.EQUAL, null);
53     assert_cmpint (ev.num_subjects (), OperatorType.EQUAL, 0);
54     assert (ev.payload == null);
55 }
56
57 void create_full_test ()
58 {
59     var ev = new Event.full (
60         ZG.ACCESS_EVENT, ZG.USER_ACTIVITY, "application://firefox.desktop", null);
61     ev.take_subject (new Subject.full ("http://example.com",
62             NFO.WEBSITE, NFO.REMOTE_DATA_OBJECT,
63             "text/html", "http://example.com", "example.com", "net"));
64     ev.add_subject (new Subject ());
65
66     assert (ev.id == 0);
67     assert (ev.timestamp == 0);
68     assert_cmpstr (ev.interpretation, OperatorType.EQUAL, ZG.ACCESS_EVENT);
69     assert_cmpstr (ev.manifestation, OperatorType.EQUAL, ZG.USER_ACTIVITY);
70     assert_cmpstr (ev.actor, OperatorType.EQUAL, "application://firefox.desktop");
71     assert_cmpstr (ev.origin, OperatorType.EQUAL, null);
72     assert_cmpint (ev.num_subjects (), OperatorType.EQUAL, 2);
73     assert (ev.payload == null);
74
75     var su = ev.subjects[1];
76     assert_cmpstr (su.uri, OperatorType.EQUAL, null);
77     assert_cmpstr (su.interpretation, OperatorType.EQUAL, null);
78     assert_cmpstr (su.manifestation, OperatorType.EQUAL, null);
79     assert_cmpstr (su.mimetype, OperatorType.EQUAL, null);
80     assert_cmpstr (su.origin, OperatorType.EQUAL, null);
81     assert_cmpstr (su.text, OperatorType.EQUAL, null);
82     assert_cmpstr (su.storage, OperatorType.EQUAL, null);
83     assert_cmpstr (su.current_uri, OperatorType.EQUAL, null);
84 }
85
86 void actor_from_app_info_test ()
87 {
88     var appinfo = new DesktopAppInfo.from_filename (Zeitgeist.Tests.DIR + "/test.desktop");
89     assert (appinfo is AppInfo);
90
91     var ev = new Event ();
92     ev.set_actor_from_info (appinfo);
93     assert_cmpstr (ev.actor, OperatorType.EQUAL, "application://test.desktop");
94 }
95
96 void from_variant_test ()
97 {
98     var b = new VariantBuilder (new VariantType ("(" + Utils.SIG_EVENT + ")"));
99
100     // Build event data
101     b.open (new VariantType ("as"));
102     b.add ("s", "27");
103     b.add ("s", "68");
104     b.add ("s", ZG.ACCESS_EVENT);
105     b.add ("s", ZG.USER_ACTIVITY);
106     b.add ("s", "application://foo.desktop");
107     b.close ();
108
109     // Build subjects
110     b.open (new VariantType ("aas"));
111         b.open (new VariantType ("as"));
112         b.add ("s", "file:///tmp/foo.txt");
113         b.add ("s", NFO.DOCUMENT);
114         b.add ("s", NFO.FILE_DATA_OBJECT);
115         b.add ("s", "file://tmp");
116         b.add ("s", "text/plain");
117         b.add ("s", "foo.text");
118         b.add ("s", "36e5604e-7e1b-4ebd-bb6a-184c6ea99627");
119         b.close ();
120     b.close ();
121
122     // Build playload
123     b.open (new VariantType ("ay"));
124     b.add ("y", 1);
125     b.add ("y", 2);
126     b.add ("y", 3);
127     b.close ();
128
129     var @var = b.end ();
130     Event ev;
131     try
132     {
133         ev = new Event.from_variant (@var);
134     }
135     catch (Zeitgeist.DataModelError error)
136     {
137         GLib.error (error.message);
138     }
139
140     assert (ev.id == 27);
141     assert (ev.timestamp == 68);
142     assert_cmpstr (ev.interpretation, OperatorType.EQUAL, ZG.ACCESS_EVENT);
143     assert_cmpstr (ev.manifestation, OperatorType.EQUAL, ZG.USER_ACTIVITY);
144     assert_cmpstr (ev.actor, OperatorType.EQUAL, "application://foo.desktop");
145     assert_cmpstr (ev.origin, OperatorType.EQUAL, null);
146     assert_cmpint (ev.num_subjects (), OperatorType.EQUAL, 1);
147
148     var su = ev.subjects[0];
149     assert_cmpstr (su.uri, OperatorType.EQUAL, "file:///tmp/foo.txt");
150     assert_cmpstr (su.interpretation, OperatorType.EQUAL, NFO.DOCUMENT);
151     assert_cmpstr (su.manifestation, OperatorType.EQUAL, NFO.FILE_DATA_OBJECT);
152     assert_cmpstr (su.mimetype, OperatorType.EQUAL, "text/plain");
153     assert_cmpstr (su.origin, OperatorType.EQUAL, "file://tmp");
154     assert_cmpstr (su.storage, OperatorType.EQUAL, "36e5604e-7e1b-4ebd-bb6a-184c6ea99627");
155
156     var payload = ev.payload;
157     assert (payload != null);
158     assert_cmpuint (payload.len, OperatorType.EQUAL, 3);
159     assert_cmpint (payload.data[0], OperatorType.EQUAL, 1);
160     assert_cmpint (payload.data[1], OperatorType.EQUAL, 2);
161     assert_cmpint (payload.data[2], OperatorType.EQUAL, 3);
162 }
163
164 void from_variant_with_new_fields_test ()
165 {
166     var b = new VariantBuilder (new VariantType ("(" + Utils.SIG_EVENT + ")"));
167
168     // Build event data
169     b.open (new VariantType ("as"));
170     b.add ("s", "27");
171     b.add ("s", "68");
172     b.add ("s", ZG.ACCESS_EVENT);
173     b.add ("s", ZG.USER_ACTIVITY);
174     b.add ("s", "application://foo.desktop");
175     b.add ("s", "origin");
176     b.close ();
177
178     // Build subjects
179     b.open (new VariantType ("aas"));
180         b.open (new VariantType ("as"));
181         b.add ("s", "file:///tmp/foo.txt");
182         b.add ("s", NFO.DOCUMENT);
183         b.add ("s", NFO.FILE_DATA_OBJECT);
184         b.add ("s", "file:///tmp");
185         b.add ("s", "text/plain");
186         b.add ("s", "foo.text");
187         b.add ("s", "36e5604e-7e1b-4ebd-bb6a-184c6ea99627");
188         b.add ("s", "file:///tmp/current.txt");
189         b.add ("s", "file:///tmp1");
190         b.close ();
191     b.close ();
192
193     // Build playload
194     b.open (new VariantType ("ay"));
195     b.add ("y", 1);
196     b.add ("y", 2);
197     b.add ("y", 3);
198     b.close ();
199
200     var @var = b.end ();
201     Event ev;
202     try
203     {
204         ev = new Event.from_variant (@var);
205     }
206     catch (Zeitgeist.DataModelError error)
207     {
208         GLib.error (error.message);
209     }
210
211     assert (ev.id == 27);
212     assert (ev.timestamp == 68);
213     assert_cmpstr (ev.interpretation, OperatorType.EQUAL, ZG.ACCESS_EVENT);
214     assert_cmpstr (ev.manifestation, OperatorType.EQUAL, ZG.USER_ACTIVITY);
215     assert_cmpstr (ev.actor, OperatorType.EQUAL, "application://foo.desktop");
216     assert_cmpstr (ev.origin, OperatorType.EQUAL, "origin");
217     assert_cmpint (ev.num_subjects (), OperatorType.EQUAL, 1);
218
219     var su = ev.subjects[0];
220     assert_cmpstr (su.uri, OperatorType.EQUAL, "file:///tmp/foo.txt");
221     assert_cmpstr (su.interpretation, OperatorType.EQUAL, NFO.DOCUMENT);
222     assert_cmpstr (su.manifestation, OperatorType.EQUAL, NFO.FILE_DATA_OBJECT);
223     assert_cmpstr (su.mimetype, OperatorType.EQUAL, "text/plain");
224     assert_cmpstr (su.origin, OperatorType.EQUAL, "file:///tmp");
225     assert_cmpstr (su.text, OperatorType.EQUAL, "foo.text");
226     assert_cmpstr (su.storage, OperatorType.EQUAL, "36e5604e-7e1b-4ebd-bb6a-184c6ea99627");
227     assert_cmpstr (su.current_uri, OperatorType.EQUAL, "file:///tmp/current.txt");
228     assert_cmpstr (su.current_origin, OperatorType.EQUAL, "file:///tmp1");
229
230     var payload = ev.payload;
231     assert (payload != null);
232     assert_cmpuint (payload.len, OperatorType.EQUAL, 3);
233     assert_cmpint (payload.data[0], OperatorType.EQUAL, 1);
234     assert_cmpint (payload.data[1], OperatorType.EQUAL, 2);
235     assert_cmpint (payload.data[2], OperatorType.EQUAL, 3);
236
237 }
238
239 void empty_to_from_variant_test ()
240 {
241     var orig = new Event ();
242     orig.timestamp = Timestamp.from_now();
243     Event marshalled;
244     try
245     {
246         marshalled = new Event.from_variant (orig.to_variant ());
247     }
248     catch (Zeitgeist.DataModelError error)
249     {
250         GLib.error (error.message);
251     }
252
253     assert (marshalled.id == 0);
254     assert (marshalled.timestamp == orig.timestamp);
255     assert_cmpstr (marshalled.interpretation, OperatorType.EQUAL, null);
256     assert_cmpstr (marshalled.manifestation, OperatorType.EQUAL, null);
257     assert_cmpstr (marshalled.actor, OperatorType.EQUAL, null);
258     assert_cmpstr (marshalled.origin, OperatorType.EQUAL, null);
259     assert_cmpint (marshalled.num_subjects (), OperatorType.EQUAL, 0);
260     assert (marshalled.payload == null);
261 }
262
263 void with_one_subject_to_from_variant_test ()
264 {
265     var orig = new Event.full (
266         ZG.ACCESS_EVENT, ZG.USER_ACTIVITY,
267         "application://firefox.desktop", "origin");
268     orig.take_subject (new Subject.full ("http://example.com",
269         NFO.WEBSITE, NFO.REMOTE_DATA_OBJECT,
270         "text/html", "http://example.com", "example.com", "net"));
271     orig.subjects[0].current_uri = "http://current-example.com";
272
273     var payload = new ByteArray ();
274     uint8[] byte = { 255 };
275     payload.append (byte);
276     orig.payload = payload;
277
278     var marshalled = new Event.from_variant (orig.to_variant ());
279
280     assert (marshalled.id == 0);
281     assert_cmpstr (marshalled.interpretation, OperatorType.EQUAL, ZG.ACCESS_EVENT);
282     assert_cmpstr (marshalled.manifestation, OperatorType.EQUAL, ZG.USER_ACTIVITY);
283     assert_cmpstr (marshalled.actor, OperatorType.EQUAL, "application://firefox.desktop");
284     assert_cmpstr (marshalled.origin, OperatorType.EQUAL, "origin");
285     assert_cmpint (marshalled.num_subjects (), OperatorType.EQUAL, 1);
286
287     payload = marshalled.payload;
288     assert (payload != null);
289     assert (payload.len == 1);
290     assert (payload.data[0] == 255);
291
292     var su = marshalled.subjects[0];
293     assert_cmpstr (su.uri, OperatorType.EQUAL, "http://example.com");
294     assert_cmpstr (su.interpretation, OperatorType.EQUAL, NFO.WEBSITE);
295     assert_cmpstr (su.manifestation, OperatorType.EQUAL, NFO.REMOTE_DATA_OBJECT);
296     assert_cmpstr (su.mimetype, OperatorType.EQUAL, "text/html");
297     assert_cmpstr (su.origin, OperatorType.EQUAL, "http://example.com");
298     assert_cmpstr (su.text, OperatorType.EQUAL, "example.com");
299     assert_cmpstr (su.storage, OperatorType.EQUAL, "net");
300     assert_cmpstr (su.current_uri, OperatorType.EQUAL, "http://current-example.com");
301 }
302
303 void three_events_to_from_variant_test ()
304 {
305     var events = new GenericArray<Event?> ();
306     events.add (new Event ());
307     events.add (new Event ());
308     events.add (new Event ());
309
310     var vevents = Events.to_variant (events);
311     assert (vevents.n_children () == 3);
312
313     events = Events.from_variant (vevents);
314     assert (events.length == 3);
315     assert (events.get (0) is Event);
316     assert (events.get (1) is Event);
317     assert (events.get (2) is Event);
318
319 }
320
321 void zero_events_to_from_variant_test ()
322 {
323     var events = new GenericArray<Event?> ();
324     var vevents = Events.to_variant (events);
325     assert (vevents.n_children () == 0);
326     events = Events.from_variant (vevents);
327     assert_cmpint (events.length, OperatorType.EQUAL, 0);
328 }
329
330 // vim:expandtab:ts=4:sw=4