build: Pass make distcheck
[zeitgeist:zeitgeist.git] / test / c / test-event.c
1 /*
2  * Copyright © 2010 Canonical Ltd.
3  *             By Mikkel Kamstrup Erlandsen <mikkel.kamstrup@canonical.com>
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 3 as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  *
17  */
18
19 #include <glib.h>
20 #include <glib-object.h>
21 #include <gio/gdesktopappinfo.h>
22
23 #include "zeitgeist.h"
24
25
26 typedef struct
27 {
28 } Fixture;
29
30 static void setup    (Fixture *fix, gconstpointer data);
31 static void teardown (Fixture *fix, gconstpointer data);
32
33 static const gchar *old_xdg_data_dirs = NULL;
34
35 static void
36 setup (Fixture *fix, gconstpointer data)
37 {
38   if (old_xdg_data_dirs != NULL)
39     old_xdg_data_dirs = g_getenv ("XDG_DATA_DIRS");
40   g_setenv ("XDG_DATA_DIRS", TEST_DIR, TRUE);
41 }
42
43 static void
44 teardown (Fixture *fix, gconstpointer data)
45 {
46   g_setenv ("XDG_DATA_DIRS", old_xdg_data_dirs, TRUE);
47 }
48
49 static void
50 test_create_empty (Fixture *fix, gconstpointer data)
51 {
52   ZeitgeistEvent *ev;
53
54   ev = zeitgeist_event_new ();
55
56   g_assert_cmpint (0, ==, zeitgeist_event_get_id (ev));
57   g_assert_cmpint (0, ==, zeitgeist_event_get_timestamp (ev));
58   g_assert_cmpstr (NULL, ==, zeitgeist_event_get_interpretation (ev));
59   g_assert_cmpstr (NULL, ==, zeitgeist_event_get_manifestation (ev));
60   g_assert_cmpstr (NULL, ==, zeitgeist_event_get_actor (ev));
61   g_assert_cmpstr (NULL, ==, zeitgeist_event_get_origin (ev));
62   g_assert_cmpint (0, ==, zeitgeist_event_num_subjects (ev));
63   g_assert (zeitgeist_event_get_payload (ev) == NULL);
64
65   g_object_unref (ev);
66 }
67
68 static void
69 test_create_full (Fixture *fix, gconstpointer data)
70 {
71   ZeitgeistEvent *ev;
72   ZeitgeistSubject *su;
73
74   /* Test with two subjects, one of them empty */
75   ev = zeitgeist_event_new_full (
76                    ZEITGEIST_ZG_ACCESS_EVENT,
77                    ZEITGEIST_ZG_USER_ACTIVITY,
78                    "application://firefox.desktop",
79                    NULL,
80                    zeitgeist_subject_new_full ("http://example.com",
81                                                ZEITGEIST_NFO_WEBSITE,
82                                                ZEITGEIST_NFO_REMOTE_DATA_OBJECT,
83                                                "text/html",
84                                                "http://example.com",
85                                                "example.com",
86                                                "net"),
87                    zeitgeist_subject_new (),
88                    NULL);
89
90   g_assert_cmpint (0, ==, zeitgeist_event_get_id (ev));
91   g_assert_cmpint (0, ==, zeitgeist_event_get_timestamp (ev));
92   g_assert_cmpstr (ZEITGEIST_ZG_ACCESS_EVENT,==, zeitgeist_event_get_interpretation (ev));
93   g_assert_cmpstr (ZEITGEIST_ZG_USER_ACTIVITY, ==, zeitgeist_event_get_manifestation (ev));
94   g_assert_cmpstr ("application://firefox.desktop", ==, zeitgeist_event_get_actor (ev));
95   g_assert (zeitgeist_event_get_origin (ev) == NULL);
96   g_assert_cmpint (2, ==, zeitgeist_event_num_subjects (ev));
97   g_assert (zeitgeist_event_get_payload (ev) == NULL);
98
99   su = zeitgeist_event_get_subject (ev, 0);
100   g_assert_cmpstr ("http://example.com", ==, zeitgeist_subject_get_uri(su));
101   g_assert_cmpstr (ZEITGEIST_NFO_WEBSITE, ==, zeitgeist_subject_get_interpretation (su));
102   g_assert_cmpstr (ZEITGEIST_NFO_REMOTE_DATA_OBJECT, ==, zeitgeist_subject_get_manifestation (su));
103   g_assert_cmpstr ("text/html", ==, zeitgeist_subject_get_mimetype (su));
104   g_assert_cmpstr ("http://example.com", ==, zeitgeist_subject_get_origin (su));
105   g_assert_cmpstr ("example.com", ==, zeitgeist_subject_get_text (su));
106   g_assert_cmpstr ("net", ==, zeitgeist_subject_get_storage (su));
107   g_assert (NULL == zeitgeist_subject_get_current_uri (su));
108
109   su = zeitgeist_event_get_subject (ev, 1);
110   g_assert (zeitgeist_subject_get_uri(su) == NULL);
111   g_assert (zeitgeist_subject_get_interpretation (su) == NULL);
112   g_assert (zeitgeist_subject_get_manifestation (su) == NULL);
113   g_assert (zeitgeist_subject_get_mimetype (su) == NULL);
114   g_assert (zeitgeist_subject_get_origin (su) == NULL);
115   g_assert (zeitgeist_subject_get_text (su) == NULL);
116   g_assert (zeitgeist_subject_get_storage (su) == NULL);
117   g_assert (zeitgeist_subject_get_current_uri (su) == NULL);
118
119   g_object_unref (ev);
120 }
121
122 static void
123 test_actor_from_info (Fixture *fix, gconstpointer data)
124 {
125   ZeitgeistEvent *ev;
126   GAppInfo       *appinfo;
127
128   appinfo = G_APP_INFO (g_desktop_app_info_new_from_filename (TEST_DIR"/test.desktop"));
129   g_assert (G_IS_APP_INFO (appinfo));
130
131   ev = zeitgeist_event_new ();
132   zeitgeist_event_set_actor_from_info (ev, appinfo);
133
134   g_assert_cmpstr ("application://test.desktop", ==, zeitgeist_event_get_actor (ev));
135 }
136
137 static void
138 test_from_variant (Fixture *fix, gconstpointer data)
139 {
140   GVariant *var;
141   GVariantBuilder b;
142   ZeitgeistEvent *ev;
143   ZeitgeistSubject *su;
144   GByteArray *payload;
145   GError **error;
146
147   error = NULL;
148   g_variant_builder_init (&b, G_VARIANT_TYPE ("(" ZEITGEIST_EVENT_SIGNATURE ")"));
149
150   /* Build event data */
151   g_variant_builder_open (&b, G_VARIANT_TYPE ("as"));
152   g_variant_builder_add (&b, "s", "27");
153   g_variant_builder_add (&b, "s", "68");
154   g_variant_builder_add (&b, "s", ZEITGEIST_ZG_ACCESS_EVENT);
155   g_variant_builder_add (&b, "s", ZEITGEIST_ZG_USER_ACTIVITY);
156   g_variant_builder_add (&b, "s", "application://foo.desktop");
157   g_variant_builder_close (&b);
158
159   /* Build subjects */
160   g_variant_builder_open (&b, G_VARIANT_TYPE ("aas"));
161     {
162       g_variant_builder_open (&b, G_VARIANT_TYPE ("as"));
163       g_variant_builder_add (&b, "s", "file:///tmp/foo.txt");
164       g_variant_builder_add (&b, "s", ZEITGEIST_NFO_DOCUMENT);
165       g_variant_builder_add (&b, "s", ZEITGEIST_NFO_FILE_DATA_OBJECT);
166       g_variant_builder_add (&b, "s", "file:///tmp");
167       g_variant_builder_add (&b, "s", "text/plain");
168       g_variant_builder_add (&b, "s", "foo.txt");
169       g_variant_builder_add (&b, "s", "36e5604e-7e1b-4ebd-bb6a-184c6ea99627");
170       g_variant_builder_close (&b);
171     }
172   g_variant_builder_close (&b);
173
174   /* Build payload */
175   g_variant_builder_open (&b, G_VARIANT_TYPE ("ay"));
176   g_variant_builder_add (&b, "y", 1);
177   g_variant_builder_add (&b, "y", 2);
178   g_variant_builder_add (&b, "y", 3);
179   g_variant_builder_close (&b);
180
181   var = g_variant_builder_end (&b);
182   error = NULL;
183   ev = zeitgeist_event_new_from_variant (var, error); // var freed
184
185   g_assert_cmpint (27, ==, zeitgeist_event_get_id (ev));
186   g_assert_cmpint (68, ==, zeitgeist_event_get_timestamp (ev));
187   g_assert_cmpstr (ZEITGEIST_ZG_ACCESS_EVENT,==, zeitgeist_event_get_interpretation (ev));
188   g_assert_cmpstr (ZEITGEIST_ZG_USER_ACTIVITY, ==, zeitgeist_event_get_manifestation (ev));
189   g_assert_cmpstr ("application://foo.desktop", ==, zeitgeist_event_get_actor (ev));
190   g_assert (zeitgeist_event_get_origin (ev) == NULL);
191   g_assert_cmpint (1, ==, zeitgeist_event_num_subjects (ev));
192
193   su = zeitgeist_event_get_subject (ev, 0);
194   g_assert_cmpstr ("file:///tmp/foo.txt", ==, zeitgeist_subject_get_uri(su));
195   g_assert_cmpstr (ZEITGEIST_NFO_DOCUMENT, ==, zeitgeist_subject_get_interpretation (su));
196   g_assert_cmpstr (ZEITGEIST_NFO_FILE_DATA_OBJECT, ==, zeitgeist_subject_get_manifestation (su));
197   g_assert_cmpstr ("text/plain", ==, zeitgeist_subject_get_mimetype (su));
198   g_assert_cmpstr ("file:///tmp", ==, zeitgeist_subject_get_origin (su));
199   g_assert_cmpstr ("foo.txt", ==, zeitgeist_subject_get_text (su));
200   g_assert_cmpstr ("36e5604e-7e1b-4ebd-bb6a-184c6ea99627", ==, zeitgeist_subject_get_storage (su));
201   g_assert (zeitgeist_subject_get_current_uri (su) == NULL);
202
203   payload = zeitgeist_event_get_payload (ev);
204   g_assert (payload != NULL);
205   g_assert_cmpint (3, ==, payload->len);
206   g_assert_cmpint (1, ==, payload->data[0]);
207   g_assert_cmpint (2, ==, payload->data[1]);
208   g_assert_cmpint (3, ==, payload->data[2]);
209
210   g_object_unref (ev);
211 }
212
213 static void
214 test_from_variant_with_new_fields (Fixture *fix, gconstpointer data)
215 {
216   GVariant *var;
217   GVariantBuilder b;
218   ZeitgeistEvent *ev;
219   ZeitgeistSubject *su;
220   GByteArray *payload;
221   GError *error;
222
223   g_variant_builder_init (&b, G_VARIANT_TYPE ("(" ZEITGEIST_EVENT_SIGNATURE ")"));
224
225   /* Build event data */
226   g_variant_builder_open (&b, G_VARIANT_TYPE ("as"));
227   g_variant_builder_add (&b, "s", "27");
228   g_variant_builder_add (&b, "s", "68");
229   g_variant_builder_add (&b, "s", ZEITGEIST_ZG_ACCESS_EVENT);
230   g_variant_builder_add (&b, "s", ZEITGEIST_ZG_USER_ACTIVITY);
231   g_variant_builder_add (&b, "s", "application://foo.desktop");
232   g_variant_builder_add (&b, "s", "origin");
233   g_variant_builder_close (&b);
234
235   /* Build subjects */
236   g_variant_builder_open (&b, G_VARIANT_TYPE ("aas"));
237     {
238       g_variant_builder_open (&b, G_VARIANT_TYPE ("as"));
239       g_variant_builder_add (&b, "s", "file:///tmp/foo.txt");
240       g_variant_builder_add (&b, "s", ZEITGEIST_NFO_DOCUMENT);
241       g_variant_builder_add (&b, "s", ZEITGEIST_NFO_FILE_DATA_OBJECT);
242       g_variant_builder_add (&b, "s", "file:///tmp");
243       g_variant_builder_add (&b, "s", "text/plain");
244       g_variant_builder_add (&b, "s", "foo.txt");
245       g_variant_builder_add (&b, "s", "36e5604e-7e1b-4ebd-bb6a-184c6ea99627");
246       g_variant_builder_add (&b, "s", "file:///tmp/current.txt");
247       g_variant_builder_close (&b);
248     }
249   g_variant_builder_close (&b);
250
251   /* Build payload */
252   g_variant_builder_open (&b, G_VARIANT_TYPE ("ay"));
253   g_variant_builder_add (&b, "y", 1);
254   g_variant_builder_add (&b, "y", 2);
255   g_variant_builder_add (&b, "y", 3);
256   g_variant_builder_close (&b);
257
258   var = g_variant_builder_end (&b);
259   error = NULL;
260   ev = zeitgeist_event_new_from_variant (var, &error); // var freed
261
262   g_assert_cmpint (27, ==, zeitgeist_event_get_id (ev));
263   g_assert_cmpint (68, ==, zeitgeist_event_get_timestamp (ev));
264   g_assert_cmpstr (ZEITGEIST_ZG_ACCESS_EVENT,==, zeitgeist_event_get_interpretation (ev));
265   g_assert_cmpstr (ZEITGEIST_ZG_USER_ACTIVITY, ==, zeitgeist_event_get_manifestation (ev));
266   g_assert_cmpstr ("application://foo.desktop", ==, zeitgeist_event_get_actor (ev));
267   g_assert_cmpstr ("origin", ==, zeitgeist_event_get_origin (ev));
268   g_assert_cmpint (1, ==, zeitgeist_event_num_subjects (ev));
269
270   su = zeitgeist_event_get_subject (ev, 0);
271   g_assert_cmpstr ("file:///tmp/foo.txt", ==, zeitgeist_subject_get_uri(su));
272   g_assert_cmpstr (ZEITGEIST_NFO_DOCUMENT, ==, zeitgeist_subject_get_interpretation (su));
273   g_assert_cmpstr (ZEITGEIST_NFO_FILE_DATA_OBJECT, ==, zeitgeist_subject_get_manifestation (su));
274   g_assert_cmpstr ("text/plain", ==, zeitgeist_subject_get_mimetype (su));
275   g_assert_cmpstr ("file:///tmp", ==, zeitgeist_subject_get_origin (su));
276   g_assert_cmpstr ("foo.txt", ==, zeitgeist_subject_get_text (su));
277   g_assert_cmpstr ("36e5604e-7e1b-4ebd-bb6a-184c6ea99627", ==, zeitgeist_subject_get_storage (su));
278   g_assert_cmpstr ("file:///tmp/current.txt", ==, zeitgeist_subject_get_current_uri (su));
279
280   payload = zeitgeist_event_get_payload (ev);
281   g_assert (payload != NULL);
282   g_assert_cmpint (3, ==, payload->len);
283   g_assert_cmpint (1, ==, payload->data[0]);
284   g_assert_cmpint (2, ==, payload->data[1]);
285   g_assert_cmpint (3, ==, payload->data[2]);
286
287   g_object_unref (ev);
288 }
289
290 static void
291 test_empty_to_from_variant (Fixture *fix, gconstpointer data)
292 {
293   ZeitgeistEvent *orig, *marshalled;
294   GError *error;
295
296   orig = zeitgeist_event_new ();
297   error = NULL;
298   marshalled = zeitgeist_event_new_from_variant (zeitgeist_event_to_variant (orig), &error);
299
300   g_assert_cmpint (0, ==, zeitgeist_event_get_id (marshalled));
301   // FIXME g_assert_cmpint (zeitgeist_event_get_timestamp (orig), ==, zeitgeist_event_get_timestamp (marshalled));
302   g_assert (zeitgeist_event_get_interpretation (marshalled) == NULL);
303   g_assert (zeitgeist_event_get_manifestation (marshalled) == NULL);
304   g_assert (zeitgeist_event_get_actor (marshalled) == NULL);
305   g_assert (zeitgeist_event_get_origin (marshalled) == NULL);
306   g_assert_cmpint (0, ==, zeitgeist_event_num_subjects (marshalled));
307   g_assert (zeitgeist_event_get_payload (marshalled) == NULL);
308
309   g_object_unref (orig);
310   g_object_unref (marshalled);
311 }
312
313 static void
314 test_with_one_subject_to_from_variant (Fixture *fix, gconstpointer data)
315 {
316   ZeitgeistEvent   *orig, *marshalled;
317   ZeitgeistSubject *su;
318   GByteArray       *payload;
319   guint8            byte;
320   GError           *error;
321
322   orig = zeitgeist_event_new_full (
323                    ZEITGEIST_ZG_ACCESS_EVENT,
324                    ZEITGEIST_ZG_USER_ACTIVITY,
325                    "application://firefox.desktop",
326                    "origin",
327                    zeitgeist_subject_new_full ("http://example.com",
328                                                ZEITGEIST_NFO_WEBSITE,
329                                                ZEITGEIST_NFO_REMOTE_DATA_OBJECT,
330                                                "text/html",
331                                                "http://example.com",
332                                                "example.com",
333                                                "net"),
334                    NULL);
335   // FIXME: this line should be removed. We need to fix the setting the timestamp
336   zeitgeist_event_set_timestamp(orig, 123);
337
338   // Set current_uri
339   zeitgeist_subject_set_current_uri (
340       zeitgeist_event_get_subject (orig, 0), "http://current-example.com");
341
342   payload = g_byte_array_new ();
343   byte = 255;
344   g_byte_array_append (payload, &byte, 1);
345   zeitgeist_event_set_payload (orig, payload); // steals payload
346
347   error = NULL;
348   marshalled = zeitgeist_event_new_from_variant (zeitgeist_event_to_variant (orig), &error);
349
350   g_assert_cmpint (0, ==, zeitgeist_event_get_id (marshalled));
351   g_assert_cmpint (123, ==, zeitgeist_event_get_timestamp (marshalled));
352   g_assert_cmpstr (ZEITGEIST_ZG_ACCESS_EVENT,==, zeitgeist_event_get_interpretation (marshalled));
353   g_assert_cmpstr (ZEITGEIST_ZG_USER_ACTIVITY, ==, zeitgeist_event_get_manifestation (marshalled));
354   g_assert_cmpstr ("application://firefox.desktop", ==, zeitgeist_event_get_actor (marshalled));
355   g_assert_cmpstr ("origin", ==, zeitgeist_event_get_origin (marshalled));
356   g_assert_cmpint (1, ==, zeitgeist_event_num_subjects (marshalled));
357
358   payload = zeitgeist_event_get_payload (marshalled);
359   g_assert (payload != NULL);
360   g_assert_cmpint (1, ==, payload->len);
361   g_assert_cmpint (255, ==, payload->data[0]);
362
363   su = zeitgeist_event_get_subject (marshalled, 0);
364   g_assert_cmpstr ("http://example.com", ==, zeitgeist_subject_get_uri(su));
365   g_assert_cmpstr (ZEITGEIST_NFO_WEBSITE, ==, zeitgeist_subject_get_interpretation (su));
366   g_assert_cmpstr (ZEITGEIST_NFO_REMOTE_DATA_OBJECT, ==, zeitgeist_subject_get_manifestation (su));
367   g_assert_cmpstr ("text/html", ==, zeitgeist_subject_get_mimetype (su));
368   g_assert_cmpstr ("http://example.com", ==, zeitgeist_subject_get_origin (su));
369   g_assert_cmpstr ("example.com", ==, zeitgeist_subject_get_text (su));
370   g_assert_cmpstr ("net", ==, zeitgeist_subject_get_storage (su));
371   g_assert_cmpstr ("http://current-example.com", ==, zeitgeist_subject_get_current_uri (su));
372
373   g_object_unref (orig);
374   g_object_unref (marshalled);
375 }
376
377 static void
378 test_3_events_to_from_variant (Fixture *fix, gconstpointer data)
379 {
380   GPtrArray      *events;
381   GVariant       *vevents;
382   GError         *error;
383
384   events = g_ptr_array_sized_new (3);
385
386   g_ptr_array_add (events, zeitgeist_event_new ());
387   g_ptr_array_add (events, zeitgeist_event_new ());
388   g_ptr_array_add (events, zeitgeist_event_new ());
389
390   vevents = zeitgeist_events_to_variant (events); // events ref stolen
391   g_assert_cmpint (3, ==, g_variant_n_children (vevents));
392
393   error = NULL;
394   events = zeitgeist_events_from_variant (vevents, &error); // vevents ref stolen
395   g_assert_cmpint (3, ==, events->len);
396   g_assert (ZEITGEIST_IS_EVENT (g_ptr_array_index (events, 0)));
397   g_assert (ZEITGEIST_IS_EVENT (g_ptr_array_index (events, 1)));
398   g_assert (ZEITGEIST_IS_EVENT (g_ptr_array_index (events, 2)));
399
400   g_ptr_array_unref (events);
401 }
402
403 static void
404 test_0_events_to_from_variant (Fixture *fix, gconstpointer data)
405 {
406   GPtrArray      *events;
407   GVariant       *vevents;
408   GError         *error;
409
410   events = g_ptr_array_new ();
411
412   vevents = zeitgeist_events_to_variant (events); // events ref stolen
413   g_assert_cmpint (0, ==, g_variant_n_children (vevents));
414
415   error = NULL;
416   events = zeitgeist_events_from_variant (vevents, &error); // vevents ref stolen
417   g_assert_cmpint (0, ==, events->len);
418
419   g_ptr_array_unref (events);
420 }
421
422 int
423 main (int   argc,
424       char *argv[])
425 {
426   g_type_init();
427   g_test_init (&argc, &argv, NULL);
428
429   g_test_add ("/Zeitgeist/Event/CreateEmpty", Fixture, NULL,
430               setup, test_create_empty, teardown);
431   g_test_add ("/Zeitgeist/Event/CreateFull", Fixture, NULL,
432               setup, test_create_full, teardown);
433   g_test_add ("/Zeitgeist/Event/ActorFromInfo", Fixture, NULL,
434               setup, test_actor_from_info, teardown);
435   g_test_add ("/Zeitgeist/Event/FromVariant", Fixture, NULL,
436                 setup, test_from_variant, teardown);
437   g_test_add ("/Zeitgeist/Event/FromVariantWithNewFields", Fixture, NULL,
438                 setup, test_from_variant_with_new_fields, teardown);
439   g_test_add ("/Zeitgeist/Event/EmptyToFromVariant", Fixture, NULL,
440               setup, test_empty_to_from_variant, teardown);
441   g_test_add ("/Zeitgeist/Event/WithOneSubjectToFromVariant", Fixture, NULL,
442                 setup, test_with_one_subject_to_from_variant, teardown);
443   g_test_add ("/Zeitgeist/Event/3EventsToFromVariant", Fixture, NULL,
444                   setup, test_3_events_to_from_variant, teardown);
445   g_test_add ("/Zeitgeist/Event/0EventsToFromVariant", Fixture, NULL,
446                   setup, test_0_events_to_from_variant, teardown);
447
448   return g_test_run();
449 }