2
# -.- coding: utf-8 -.-
6
# Copyright © 2009-2011 Seif Lotfy <seif@lotfy.com>
7
# Copyright © 2009-2011 Siegfried-Angel Gevatter Pujals <siegfried@gevatter.com>
8
# Copyright © 2009-2011 Mikkel Kamstrup Erlandsen <mikkel.kamstrup@gmail.com>
9
# Copyright © 2009-2011 Markus Korn <thekorn@gmx.de>
10
# Copyright © 2011 Collabora Ltd.
11
# By Siegfried-Angel Gevatter Pujals <siegfried@gevatter.com>
12
# By Seif Lotfy <seif@lotfy.com>
14
# This program is free software: you can redistribute it and/or modify
15
# it under the terms of the GNU Lesser General Public License as published by
16
# the Free Software Foundation, either version 2.1 of the License, or
17
# (at your option) any later version.
19
# This program is distributed in the hope that it will be useful,
20
# but WITHOUT ANY WARRANTY; without even the implied warranty of
21
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22
# GNU Lesser General Public License for more details.
24
# You should have received a copy of the GNU Lesser General Public License
25
# along with this program. If not, see <http://www.gnu.org/licenses/>.
36
from subprocess import Popen, PIPE
40
from dbus.mainloop.glib import DBusGMainLoop
41
DBusGMainLoop(set_as_default=True)
42
from dbus.exceptions import DBusException
44
from zeitgeist.datamodel import (Event, Subject, Interpretation, Manifestation,
45
TimeRange, StorageState, DataSource, NULL_EVENT, ResultType)
48
from testutils import parse_events, import_events
50
TEST_ACTOR = "/usr/share/applications/gnome-about.desktop"
52
# FIXME: move this to a .js file
54
def create_test_event_1():
57
ev.interpretation = Manifestation.USER_ACTIVITY
58
ev.manifestation = Interpretation.CREATE_EVENT
61
subj.uri = u"test://mytest"
62
subj.manifestation = "lala"
63
subj.interpretation = "tinky winky"
64
subj.origin = "test://"
65
subj.mimetype = "YOMAMA"
67
subj.storage = "MyStorage"
68
subj.current_uri = u"test://mytest"
70
ev.append_subject(subj)
74
class ZeitgeistEngineTest(testutils.RemoteTestCase):
76
def testSingleInsertGet(self):
77
test_event_1 = create_test_event_1()
78
# Insert item and event
79
ids = self.insertEventsAndWait([test_event_1])
80
self.assertEquals(1, len(ids))
82
result = self.getEventsAndWait(ids)
83
resulting_event = result.pop()
84
self.assertEquals(len(resulting_event), len(test_event_1))
86
# fixing id, the initial event does not have any id set
87
test_event_1[0][0] = ids[0]
88
resulting_event[2] = ""
90
self.assertEqual(resulting_event, test_event_1)
92
def testInsertGetWithoutTimestamp(self):
93
# We test two things, that Event creates a default timestamp
94
# and that the engine provides one for us if don't do our selves
96
subj = Subject.new_for_values(interpretation="foo://interp",
97
manifestation="foo://manif",
99
ev = Event.new_for_values(interpretation="foo://bar",
100
manifestation="foo://quiz",
101
actor="actor://myself",
104
# Assert that timestamp is set
105
self.assertTrue(ev.timestamp)
107
# Clear the timestamp and insert event
109
ids = self.insertEventsAndWait([ev])
110
result = self.getEventsAndWait(ids)
112
self.assertEquals(1, len(result))
113
resulting_event = Event(result.pop())
114
self.assertEquals("foo://bar", resulting_event.interpretation)
115
self.assertTrue(resulting_event.timestamp) # We should have a timestamp again
117
def testDuplicateEventInsertion(self):
118
self.testSingleInsertGet()
120
# Inserting the same event again should be ok, but not
122
self.testSingleInsertGet()
124
# Find all events, and make sure that this is exactly one event
125
result = self.findEventIdsAndWait([])
126
self.assertEquals(1, len(result))
127
self.assertEquals(1, result[0]) # The single event must have id 1
129
def testDeleteSingle(self):
130
self.testSingleInsertGet()
131
self.deleteEventsAndWait([1])
132
result = self.getEventsAndWait([1])
133
self.assertEquals(0, len(filter(None, result)))
135
def testIllegalPredefinedEventId(self):
137
event[0][0] = str(23) # This is illegal, we assert the erro later
139
event.interpretation = Manifestation.USER_ACTIVITY
140
event.manifestation = Interpretation.CREATE_EVENT
141
event.actor = "/usr/share/applications/gnome-about.desktop"
144
subject.uri = "file:///tmp/file.txt"
145
subject.manifestation = Manifestation.FILE_DATA_OBJECT
146
subject.interpretation = Interpretation.DOCUMENT
147
subject.origin = "test://"
148
subject.mimetype = "text/plain"
149
subject.text = "This subject has no text"
150
subject.storage = "368c991f-8b59-4018-8130-3ce0ec944157" # UUID of home partition
152
event.append_subject(subject)
154
# Insert item and event
155
ids = self.insertEventsAndWait([event,])
156
self.assertEquals(len(ids), 1)
157
# event is not inserted, id == 0 means error
158
self.assertEquals(ids[0], 0)
159
# check if really not events were inserted
160
ids = self.findEventIdsAndWait([])
161
self.assertEquals(len(ids), 0)
163
def testGetNonExisting(self):
164
events = self.getEventsAndWait([23,45,65])
165
self.assertEquals(3, len(events))
166
for ev in events : self.assertEquals(None, ev)
168
def testGetDuplicateEventIds(self):
169
ids = import_events("test/data/five_events.js", self)
170
self.assertEquals(5, len(ids))
172
events = self.getEventsAndWait([1, 1])
173
self.assertEqual(2, len(events))
174
self.assertEqual(2, len(filter(None, events))) #FIXME:FAILS HERE
175
self.assertTrue(events[0].id == events[1].id == 1)
177
def testFindEventsId(self):
178
test_event_1 = create_test_event_1()
179
self.testSingleInsertGet()
180
result = self.findEventIdsAndWait([])
181
self.assertEquals(1, len(result))
182
test_event_1[0][0] = 1
183
self.assertEqual(result[0], test_event_1.id)
185
def testFindNothing(self):
186
result = self.findEventIdsAndWait([])
187
self.assertEquals(0, len(result))
189
def testFindNothingBackwards(self):
190
result = self.findEventIdsAndWait([], timerange=(1000000,1))
191
self.assertEquals(0, len(result))
193
def testFindFilteredByEventButNotSubject(self):
194
# revision rainct@ubuntu.com-20091128164327-j8ez3fsifd1gygkr (1185)
195
# Fix _build_templates so that it works when the Subject is empty.
196
self.testSingleInsertGet()
197
result = self.findEventIdsAndWait([Event.new_for_values(interpretation=Interpretation.LEAVE_EVENT)])
198
self.assertEquals(0, len(result))
200
def testFindFive(self):
201
import_events("test/data/five_events.js", self)
202
result = self.findEventIdsAndWait([])
203
self.assertEquals(5, len(result))
205
def testFindFiveWithStorageState(self):
206
import_events("test/data/five_events.js", self)
207
# The event's storage is unknown, so we get them back always.
208
result = self.findEventIdsAndWait([], storage_state = 1)
209
self.assertEquals(5, len(result))
210
result = self.findEventIdsAndWait([], storage_state = 0)
211
self.assertEquals(5, len(result))
213
def testFindWithNonExistantActor(self):
214
# Bug 496109: filtering by timerange and a non-existing actor gave an
216
import_events("test/data/twenty_events.js", self)
217
# The event's storage is unknown, so we get them back always.
218
result = self.findEventIdsAndWait([Event.new_for_values(actor="fake://foobar")])
219
self.assertEquals(0, len(result))
221
def testFindWithSubjectText(self):
222
import_events("test/data/five_events.js", self)
223
result = self.findEventIdsAndWait([Event.new_for_values(subject_text='this is not real')])
224
self.assertEquals(0, len(result))
225
result = self.findEventIdsAndWait([Event.new_for_values(subject_text='some text')])
226
self.assertEquals(1, len(result))
227
result = self.findEventIdsAndWait([Event.new_for_values(subject_text='this *')])
228
self.assertEquals(0, len(result)) #We don't support wildcards for text
229
result = self.findEventIdsAndWait([Event.new_for_values(subject_text='this item *')])
230
self.assertEquals(1, len(result))
232
def testSortFindByTimeAsc(self):
233
import_events("test/data/twenty_events.js", self)
234
result = self.findEventIdsAndWait([], num_events = 2, result_type = ResultType.LeastRecentEvents)
235
event1 = self.getEventsAndWait([result[0]])[0]
236
event2 = self.getEventsAndWait([result[1]])[0]
237
self.assertEquals(True, event1.timestamp < event2.timestamp)
239
def testSortFindByTimeDesc(self):
240
import_events("test/data/twenty_events.js", self)
241
result = self.findEventIdsAndWait([], num_events = 2, result_type = ResultType.MostRecentEvents)
242
event1 = self.getEventsAndWait([result[0]])[0]
243
event2 = self.getEventsAndWait([result[1]])[0]
244
self.assertEquals(True, event1.timestamp > event2.timestamp)
246
def testFindWithActor(self):
247
test_event_1 = create_test_event_1()
248
self.testSingleInsertGet()
250
event_template = Event.new_for_values(actor=TEST_ACTOR, subjects=[subj,])
251
result = self.findEventIdsAndWait([event_template], num_events = 0, result_type = 1)
252
self.assertEquals(1, len(result))
253
test_event_1[0][0] = 1
254
self.assertEqual(result[0], test_event_1.id)
256
def testFindWithInterpretation(self):
257
import_events("test/data/five_events.js", self)
259
event_template = Event.new_for_values(interpretation="stfu:OpenEvent", subjects=[subj])
260
result = self.findEventIdsAndWait([event_template], num_events = 0, result_type = 1)
261
self.assertEquals(2, len(result))
262
events = self.getEventsAndWait(result)
264
self.assertEqual(event.interpretation, "stfu:OpenEvent")
266
def testFindEventTwoInterpretations(self):
267
import_events("test/data/twenty_events.js", self)
268
result = self.findEventIdsAndWait([
269
Event.new_for_values(interpretation="stfu:OpenEvent"),
270
Event.new_for_values(interpretation="stfu:EvilEvent")],
271
timerange = (102, 117), num_events = 0, result_type = 0)
272
self.assertEquals(15, len(result))
274
def testFindWithFakeInterpretation(self):
275
import_events("test/data/twenty_events.js", self)
276
result = self.findEventIdsAndWait([Event.new_for_values(interpretation="this-is-not-an-intrprettin")],
277
num_events = 0, result_type = 0)
278
self.assertEquals(0, len(result))
280
def testFindWithManifestation(self):
281
import_events("test/data/five_events.js", self)
283
event_template = Event.new_for_values(manifestation="stfu:EpicFailActivity", subjects=[subj])
285
result = self.findEventIdsAndWait([event_template],
286
num_events = 0, result_type = 1)
287
self.assertEquals(1, len(result))
288
events = self.getEventsAndWait(result)
290
self.assertEqual(event.manifestation, "stfu:EpicFailActivity")
292
def testFindWithEventOrigin(self):
293
import_events("test/data/twenty_events.js", self)
294
event_template = Event.new_for_values(origin="origin3")
295
result = self.findEventIdsAndWait([event_template],
296
num_events = 0, result_type = 1)
297
events = self.getEventsAndWait(result)
299
self.assertTrue(len(events) > 0)
300
self.assertTrue(all(ev.origin == "origin3" for ev in events))
302
def testFindWithEventOriginNegatedWildcard(self):
303
import_events("test/data/twenty_events.js", self)
304
event_template = Event.new_for_values(origin="!origin*")
305
result = self.findEventIdsAndWait([event_template],
306
num_events = 0, result_type = 1)
307
events = self.getEventsAndWait(result)
309
self.assertTrue(len(events) > 0)
310
self.assertFalse(any(ev.origin.startswith("origin") for ev in events))
312
def testFindWithSubjectOrigin(self):
313
import_events("test/data/five_events.js", self)
314
subj = Subject.new_for_values(origin="file:///tmp")
315
event_template = Event.new_for_values(subjects=[subj])
316
result = self.findEventIdsAndWait([event_template], num_events = 0, result_type = 1)
317
events = self.getEventsAndWait(result)
319
test = any(subj.origin == "file:///tmp" for subj in event.subjects)
320
self.assertTrue(test)
322
def testFindMultipleEvents(self):
323
import_events("test/data/five_events.js", self)
324
subj1 = Subject.new_for_values(uri="file:///home/foo.txt")
325
event_template1 = Event.new_for_values(subjects=[subj1])
326
subj2 = Subject.new_for_values(uri="file:///tmp/foo.txt")
327
event_template2 = Event.new_for_values(subjects=[subj2])
328
result = self.findEventIdsAndWait([event_template1, event_template2], num_events = 0, result_type = 4)
329
self.assertEquals(2, len(result))
330
events = self.getEventsAndWait(result)
332
def testGetWithMultipleSubjects(self):
333
subj1 = Subject.new_for_values(uri="file:///tmp/foo.txt")
334
subj2 = Subject.new_for_values(uri="file:///tmp/loo.txt")
335
event_template = Event.new_for_values(subjects=[subj1, subj2])
336
result = self.insertEventsAndWait([event_template])
337
events = self.getEventsAndWait(result)
338
self.assertEquals(2, len(events[0].subjects))
339
self.assertEquals("file:///tmp/foo.txt", events[0].subjects[0].uri)
340
self.assertEquals("file:///tmp/loo.txt", events[0].subjects[1].uri)
342
def testFindEventIdsWithMultipleSubjects(self):
343
subj1 = Subject.new_for_values(uri="file:///tmp/foo.txt")
344
subj2 = Subject.new_for_values(uri="file:///tmp/loo.txt")
345
event = Event.new_for_values(subjects=[subj1, subj2])
346
orig_ids = self.insertEventsAndWait([event])
347
result_ids = self.findEventIdsAndWait([Event()], num_events = 0, result_type = 1)
348
self.assertEquals(orig_ids, list(result_ids)) #FIXME: We need subjects of the same event to be merged
350
def testFindEventsEventTemplate(self):
351
import_events("test/data/five_events.js", self)
352
subj = Subject.new_for_values(interpretation="stfu:Bee")
353
subj1 = Subject.new_for_values(interpretation="stfu:Bar")
354
event_template = Event.new_for_values(subjects=[subj, subj1])
355
result = self.findEventIdsAndWait(
357
timerange = (0, 200),
360
self.assertEquals(0, len(result)) # no subject with two different
361
# interpretations at the same time
362
subj = Subject.new_for_values(uri="file:///tmp/foo.txt")
363
subj1 = Subject.new_for_values(interpretation="stfu:Image")
364
event_template = Event.new_for_values(subjects=[subj, subj1])
365
result = self.findEventIdsAndWait(
367
timerange = (0, 200),
370
self.assertEquals(1, len(result))
372
def testJsonImport(self):
373
import_events("test/data/single_event.js", self)
374
results = self.getEventsAndWait([1])
375
self.assertEquals(1, len(results))
377
self.assertEquals(1, ev.id)
378
self.assertEquals("123", ev.timestamp)
379
self.assertEquals("stfu:OpenEvent", ev.interpretation)
380
self.assertEquals("stfu:UserActivity", ev.manifestation)
381
self.assertEquals("firefox", ev.actor)
382
self.assertEquals(1, len(ev.subjects))
384
subj = ev.subjects[0]
385
self.assertEquals("file:///tmp/foo.txt", subj.uri)
386
self.assertEquals("stfu:Document", subj.interpretation)
387
self.assertEquals("stfu:File", subj.manifestation)
388
self.assertEquals("text/plain", subj.mimetype)
389
self.assertEquals("this item has no text... rly!", subj.text)
390
self.assertEquals("368c991f-8b59-4018-8130-3ce0ec944157", subj.storage)
392
def testInsertSubjectOptionalAttributes(self):
393
ev = Event.new_for_values(
395
interpretation=Interpretation.ACCESS_EVENT,
396
manifestation=Manifestation.USER_ACTIVITY,
399
subj = Subject.new_for_values(
401
interpretation=Interpretation.DOCUMENT,
402
manifestation=Manifestation.FILE_DATA_OBJECT,
404
ev.append_subject(subj)
406
ids = self.insertEventsAndWait([ev,])
407
result = self.getEventsAndWait(ids)
408
self.assertEquals(len(ids), len(result))
410
def testEventWithoutSubject(self):
411
ev = Event.new_for_values(timestamp=123,
412
interpretation=Interpretation.ACCESS_EVENT,
413
manifestation=Manifestation.USER_ACTIVITY,
415
ids = self.insertEventsAndWait([ev,])
416
self.assertEquals(len(ids), 1)
417
# event is not inserted, id == 0 means error
418
self.assertEquals(ids[0], 0)
419
# check if really not events were inserted
420
ids = self.findEventIdsAndWait([ev],
422
result_type = ResultType.MostRecentEvents)
423
self.assertEquals(len(ids), 0)
425
def testUnicodeEventInsert(self):
426
# Insert and get a unicode event
427
ids = import_events("test/data/unicode_event.js", self)
428
self.assertEquals(len(ids), 1)
429
result = self.getEventsAndWait(ids)
430
self.assertEquals(1, len(result))
432
self.assertEquals(1, len(event.subjects))
433
self.assertEquals(u"hällö, I'm gürmen - åge drikker øl - ☠", event.subjects[0].text)
434
self.assertEquals(u"http://live.gnome.org/☠", event.subjects[0].uri)
436
# update the event we got from the DB's timestamp and insert
437
# it again, we want to to test some ping-pong back and forth
438
event[0][Event.Id] = "" #FIXME: It used to be None but it did not work until i passed an empty string
439
event.timestamp = str(243)
440
ids = self.insertEventsAndWait([event])
441
result = self.getEventsAndWait(ids)
442
self.assertEquals(1, len(result))
444
self.assertEquals(1, len(event.subjects))
445
self.assertEquals(u"hällö, I'm gürmen - åge drikker øl - ☠", event.subjects[0].text)
446
self.assertEquals(u"http://live.gnome.org/☠", event.subjects[0].uri)
448
# try and find a unicode event, we use unicode and not
449
# inconsequently on deliberation
450
subj = Subject.new_for_values(text="hällö, I'm gürmen - åge drikker øl - ☠",
451
origin="file:///åges_øl í",
452
uri=u"http://live.gnome.org/☠")
453
event_template = Event.new_for_values(subjects=[subj,])
456
result = self.findEventIdsAndWait([event_template],
460
self.assertEquals(len(result), 1)
462
def testEventWithBinaryPayload(self):
465
ev.actor = "application:///firefox.desktop"
466
ev.manifestation = Manifestation.USER_ACTIVITY
467
ev.interpretation = Interpretation.ACCESS_EVENT
468
subject.uri = "http://www.google.com"
469
subject.interpretation = Interpretation #InterPretation.UNKNOWN
470
subject.manifestation = Manifestation #Manifestation.WEB_HISTORY
472
subject.mimetype = "text/html"
475
ev.subjects.append(subject)
478
<Content name="Telepathy" class="Text">
479
<header>johnsmith@foo.bar</header>
481
John: Here is a talking point
482
You: Ok that looks fine
484
<launcher command="{application} johnsmith@foo.bar"/>
487
ev.payload = sampleString.encode("UTF-8")
488
ids = self.insertEventsAndWait([ev])
489
_ev = self.getEventsAndWait(ids)[0]
490
_ev.payload = "".join(map(str, _ev.payload)).decode('utf-8')
491
self.assertEquals(ev.payload, _ev.payload)
493
# Note: engine.insert_events() sets the id of the Event objects
495
self.assertEquals(ev.payload, _ev.payload)
497
def testQueryByParent (self):
498
ev = Event.new_for_values(subject_interpretation=Interpretation.AUDIO)
499
_ids = self.insertEventsAndWait([ev])
501
tmpl = Event.new_for_values(subject_interpretation=Interpretation.MEDIA)
502
ids = self.findEventIdsAndWait([tmpl],
504
result_type = ResultType.MostRecentEvents)
506
self.assertEquals(1, len(ids))
507
self.assertEquals(_ids, list(ids))
509
def testNegation(self):
510
import_events("test/data/five_events.js", self)
512
template = Event.new_for_values(
513
interpretation = "!stfu:OpenEvent"
515
ids = self.findEventIdsAndWait([template,],
517
result_type = ResultType.MostRecentEvents
519
self.assertEquals(3, len(ids))
521
template = Event.new_for_values(
522
manifestation = "!stfu:YourActivity"
524
ids = self.findEventIdsAndWait([template,],
526
result_type = ResultType.MostRecentEvents
528
self.assertEquals(4, len(ids))
530
template = Event.new_for_values(
533
ids = self.findEventIdsAndWait([template,],
535
result_type = ResultType.MostRecentEvents
537
self.assertEquals(2, len(ids))
539
template = Event.new_for_values(
540
subject_uri = "!file:///tmp/foo.txt"
542
ids = self.findEventIdsAndWait([template,],
544
result_type = ResultType.MostRecentEvents
546
self.assertEquals(3, len(ids))
548
template = Event.new_for_values(
549
subject_interpretation = "!stfu:Document"
551
ids = self.findEventIdsAndWait([template,],
553
result_type = ResultType.MostRecentEvents
555
self.assertEquals(4, len(ids))
557
template = Event.new_for_values(
558
subject_manifestation = "!stfu:File"
560
ids = self.findEventIdsAndWait([template,],
562
result_type = ResultType.MostRecentEvents
564
self.assertEquals(1, len(ids))
566
template = Event.new_for_values(
567
subject_origin = "!file:///tmp"
569
ids = self.findEventIdsAndWait([template,],
571
result_type = ResultType.MostRecentEvents
573
self.assertEquals(1, len(ids))
575
template = Event.new_for_values(
576
subject_mimetype = "!text/plain"
578
ids = self.findEventIdsAndWait([template,],
580
result_type = ResultType.MostRecentEvents
582
self.assertEquals(2, len(ids))
584
# the next two fields do not support negation, '!' is treated as
587
template = Event.new_for_values(
588
subject_text = "!boo"
590
ids = self.findEventIdsAndWait([template,],
592
result_type = ResultType.MostRecentEvents
594
self.assertEquals(0, len(ids))
596
# searching by subject_storage is not working
597
#~ template = Event.new_for_values(
598
#~ subject_storage = "!boo"
600
#~ ids = self.engine.find_eventids(TimeRange.always(),
601
#~ [template,], StorageState.Any, 10, ResultType.MostRecentEvents
603
#~ self.assertEquals(0, len(ids))
605
def testNegationCombination(self):
606
import_events("test/data/five_events.js", self)
608
template = Event.new_for_values(
609
interpretation = "!stfu:OpenEvent",
612
ids = self.findEventIdsAndWait([template,],
614
result_type = ResultType.MostRecentEvents
616
self.assertEquals(2, len(ids))
618
template = Event.new_for_values(
619
interpretation = "!stfu:OpenEvent",
620
manifestation = "!stfu:YourActivity"
622
ids = self.findEventIdsAndWait([template,],
624
result_type = ResultType.MostRecentEvents
626
self.assertEquals(3, len(ids))
628
def testFindStorageNotExistant(self):
630
Event.new_for_values(timestamp=1000, subject_storage="sometext"),
631
Event.new_for_values(timestamp=2000, subject_storage="anotherplace")
633
ids_in = self.insertEventsAndWait(events)
634
template = Event.new_for_values(subject_storage="xxx")
635
results = self.findEventIdsAndWait([template,],
637
result_type = ResultType.MostRecentEvents
639
self.assertEquals(0, len(results))
641
def testFindStorage(self):
643
Event.new_for_values(timestamp=1000, subject_storage="sometext"),
644
Event.new_for_values(timestamp=2000, subject_storage="anotherplace")
646
ids_in = self.insertEventsAndWait(events)
647
template = Event.new_for_values(subject_storage="sometext")
648
results = self.findEventIdsAndWait([template,],
650
result_type = ResultType.MostRecentEvents
652
self.assertEquals(1, len(results))
654
def testWildcard(self):
655
import_events("test/data/five_events.js", self)
657
template = Event.new_for_values(
660
ids = self.findEventIdsAndWait([template,],
662
result_type = ResultType.MostRecentEvents
664
self.assertEquals(2, len(ids))
666
template = Event.new_for_values(
669
ids = self.findEventIdsAndWait([template,],
671
result_type = ResultType.MostRecentEvents
673
self.assertEquals(3, len(ids))
675
template = Event.new_for_values(
676
subject_mimetype = "text/*"
678
ids = self.findEventIdsAndWait([template,],
680
result_type = ResultType.MostRecentEvents
682
self.assertEquals(3, len(ids))
684
template = Event.new_for_values(
685
subject_uri = "http://*"
687
ids = self.findEventIdsAndWait([template,],
689
result_type = ResultType.MostRecentEvents
691
self.assertEquals(1, len(ids))
693
template = Event.new_for_values(
694
subject_current_uri = "http://*"
696
ids = self.findEventIdsAndWait([template,],
698
result_type = ResultType.MostRecentEvents
700
self.assertEquals(1, len(ids))
702
template = Event.new_for_values(
703
subject_origin = "file://*"
705
ids = self.findEventIdsAndWait([template,],
707
result_type = ResultType.MostRecentEvents
709
self.assertEquals(4, len(ids))
711
class ResultTypeTest(testutils.RemoteTestCase):
713
def testResultTypesMostRecentEvents(self):
714
import_events("test/data/five_events.js", self)
716
# MostRecentEvents - new -> old
717
ids = self.findEventIdsAndWait([],
719
result_type = ResultType.MostRecentEvents
721
events = self.getEventsAndWait(ids)
723
event.id for event in sorted(events,
724
cmp=lambda x, y: cmp(int(x.timestamp), int(y.timestamp)),
728
self.assertEquals(list(ids), sorted_event_ids)
730
def testResultTypesLeastRecentEvents(self):
731
import_events("test/data/five_events.js", self)
733
# LeastRecentEvents - old -> new
734
ids = self.findEventIdsAndWait([],
736
result_type = ResultType.LeastRecentEvents)
737
events = self.getEventsAndWait(ids)
739
event.id for event in sorted(events,
740
cmp=lambda x, y: cmp(int(x.timestamp), int(y.timestamp)))
742
self.assertEquals(list(ids), sorted_event_ids)
744
def testResultTypesMostPopularActor(self):
745
import_events("test/data/twenty_events.js", self)
747
ids = self.findEventIdsAndWait([],
749
result_type = ResultType.MostPopularActor)
750
events = self.getEventsAndWait(ids)
751
self.assertEquals([e[0][4] for e in events], ["firefox", "icedove",
753
self.assertEquals([e.timestamp for e in events], ["119", "114", "105"])
755
def testResultTypesMostPopularActor2(self):
756
import_events("test/data/twenty_events.js", self)
758
ids = self.findEventIdsAndWait([],
759
timerange = (105,107),
761
result_type = ResultType.MostPopularActor)
762
events = self.getEventsAndWait(ids)
763
self.assertEquals(len(events), 2)
764
self.assertEquals([e[0][4] for e in events], ["firefox", "frobnicator"])
765
self.assertEquals([e.timestamp for e in events], ["107", "105"])
767
def testResultTypesLeastPopularActor(self):
768
import_events("test/data/twenty_events.js", self)
770
ids = self.findEventIdsAndWait([],
772
result_type = ResultType.LeastPopularActor)
773
events = self.getEventsAndWait(ids)
775
self.assertEquals([e[0][4] for e in events], ["frobnicator", "icedove",
777
self.assertEquals([e.timestamp for e in events], ["105", "114", "119"])
779
def testResultTypesLeastPopularActor2(self):
780
import_events("test/data/twenty_events.js", self)
782
ids = self.findEventIdsAndWait([],
783
timerange = (105,107),
785
result_type = ResultType.LeastPopularActor)
786
events = self.getEventsAndWait(ids)
788
self.assertEquals(len(events), 2)
789
self.assertEquals([e[0][4] for e in events], ["frobnicator", "firefox"])
790
self.assertEquals([e.timestamp for e in events], ["105", "107"])
792
def testResultTypesMostRecentSubject(self):
793
import_events("test/data/five_events.js", self)
795
ids = self.findEventIdsAndWait([],
797
result_type = ResultType.MostRecentSubjects)
798
events = self.getEventsAndWait(ids)
800
self.assertEquals([e.timestamp for e in events],
801
["163", "153", "143", "123"])
803
def testResultTypesLeastRecentSubject(self):
804
import_events("test/data/five_events.js", self)
806
ids = self.findEventIdsAndWait([],
808
result_type = ResultType.LeastRecentSubjects)
809
events = self.getEventsAndWait(ids)
810
self.assertEquals([e.timestamp for e in events],
811
["123", "143", "153", "163"])
813
def testResultTypesMostPopularSubject(self):
814
import_events("test/data/five_events.js", self)
816
ids = self.findEventIdsAndWait([],
818
result_type = ResultType.MostPopularSubjects)
819
events = self.getEventsAndWait(ids)
820
self.assertEquals([e.timestamp for e in events],
821
["143", "163", "153", "123"])
823
def testResultTypesLeastPopularSubject(self):
824
import_events("test/data/five_events.js", self)
826
ids = self.findEventIdsAndWait([],
828
result_type = ResultType.LeastPopularSubjects)
829
events = self.getEventsAndWait(ids)
831
self.assertEquals([e.timestamp for e in events],
832
["123", "153", "163", "143"])
834
def testResultTypesMostRecentCurrentUri(self):
835
import_events("test/data/five_events.js", self)
836
import_events("test/data/five_events_ext_move.js", self)
838
ids = self.findEventIdsAndWait([],
840
result_type = ResultType.MostRecentCurrentUri)
841
events = self.getEventsAndWait(ids)
843
self.assertEquals([e.timestamp for e in events],
844
["200", "153", "123"])
846
def testResultTypesLeastRecentCurrentUri(self):
847
import_events("test/data/five_events.js", self)
848
import_events("test/data/five_events_ext_move.js", self)
850
ids = self.findEventIdsAndWait([],
852
result_type = ResultType.LeastRecentCurrentUri)
853
events = self.getEventsAndWait(ids)
854
self.assertEquals([e.timestamp for e in events],
855
["123", "153", "200"])
857
def testResultTypesMostPopularCurrentUri(self):
858
import_events("test/data/five_events.js", self)
859
import_events("test/data/five_events_ext_move.js", self)
861
ids = self.findEventIdsAndWait([],
863
result_type = ResultType.MostPopularCurrentUri)
864
events = self.getEventsAndWait(ids)
865
self.assertEquals([e.timestamp for e in events],
866
["200", "123", "153"])
868
def testResultTypesLeastPopularCurrentUri(self):
869
import_events("test/data/five_events.js", self)
870
import_events("test/data/five_events_ext_move.js", self)
872
ids = self.findEventIdsAndWait([],
874
result_type = ResultType.LeastPopularCurrentUri)
875
events = self.getEventsAndWait(ids)
876
self.assertEquals([e.timestamp for e in events],
877
["153", "123", "200"]) #Zeitgeist 0.8 does this test wrong.
878
#This is the expected results
880
def testResultTypesMostRecentActor(self):
881
import_events("test/data/twenty_events.js", self)
883
ids = self.findEventIdsAndWait([],
885
result_type = ResultType.MostRecentActor)
886
events = self.getEventsAndWait(ids)
888
self.assertEquals([e.timestamp for e in events], ["119", "114", "105"])
890
def testResultTypesMostRecentActor2(self):
891
import_events("test/data/twenty_events.js", self)
893
ids = self.findEventIdsAndWait([],
894
timerange = (105, 107),
896
result_type = ResultType.MostRecentActor)
897
events = self.getEventsAndWait(ids)
899
self.assertEquals([e.timestamp for e in events], ["107", "105"])
901
def testResultTypesOldestActorBug641968(self):
903
Event.new_for_values(timestamp=1, actor="boo", subject_uri="tmp/boo"),
904
Event.new_for_values(timestamp=2, actor="boo", subject_uri="home/boo"),
905
Event.new_for_values(timestamp=3, actor="bar", subject_uri="tmp/boo"),
906
Event.new_for_values(timestamp=4, actor="baz", subject_uri="tmp/boo"),
908
self.insertEventsAndWait(events)
910
# Get the least recent actors
911
ids = self.findEventIdsAndWait([],
913
result_type = ResultType.OldestActor)
914
events = self.getEventsAndWait(ids)
915
self.assertEquals(list(ids), [1, 3, 4])
917
# Get the least recent actors for "home/boo"
918
template = Event.new_for_values(subject_uri="home/boo")
919
ids = self.findEventIdsAndWait([template],
921
result_type = ResultType.OldestActor)
922
self.assertEquals(list(ids), [2])
924
# Let's also try the same with MostRecentActor... Although there
925
# should be no problem here.
926
template = Event.new_for_values(subject_uri="home/boo")
927
ids = self.findEventIdsAndWait([template],
929
result_type = ResultType.OldestActor)
930
self.assertEquals(list(ids), [2])
932
def testResultTypesOldestActor(self):
933
import_events("test/data/twenty_events.js", self)
935
ids = self.findEventIdsAndWait(
936
[Event.new_for_values(subject_manifestation="stfu:File")],
938
result_type = ResultType.OldestActor)
939
events = self.getEventsAndWait(ids)
940
self.assertEquals([e.timestamp for e in events], ["100", "101", "105"])
942
def testResultTypesLeastRecentActor(self):
943
import_events("test/data/twenty_events.js", self)
945
ids = self.findEventIdsAndWait(
946
[Event.new_for_values(subject_manifestation="stfu:File")],
948
result_type = ResultType.LeastRecentActor)
949
events = self.getEventsAndWait(ids)
951
self.assertEquals([e.timestamp for e in events], ['105', '114', '119'])
953
def testResultTypesLeastRecentActor2(self):
954
# The same test as before, but this time with fewer events so that
955
# it is actually understandable.
957
Event.new_for_values(timestamp=1, actor="gedit", subject_uri="oldFile"),
958
Event.new_for_values(timestamp=2, actor="banshee", subject_uri="oldMusic"),
959
Event.new_for_values(timestamp=3, actor="banshee", subject_uri="newMusic"),
960
Event.new_for_values(timestamp=4, actor="gedit", subject_uri="newFile"),
962
self.insertEventsAndWait(events)
964
ids = self.findEventIdsAndWait([],
966
result_type = ResultType.LeastRecentActor)
967
recv_events = self.getEventsAndWait(ids)
968
self.assertEquals([e.timestamp for e in recv_events], ['3', '4'])
970
def testResultTypesMostPopularEventOrigin(self):
971
import_events("test/data/twenty_events.js", self)
973
ids = self.findEventIdsAndWait([],
975
result_type = ResultType.MostPopularEventOrigin)
976
events = self.getEventsAndWait(ids)
978
self.assertEquals([e[0][5] for e in events],
979
["origin1", "origin3", "origin2"])
980
self.assertEquals([e.timestamp for e in events], ["102", "103", "100"])
982
def testResultTypesLeastPopularEventOrigin(self):
983
import_events("test/data/twenty_events.js", self)
985
ids = self.findEventIdsAndWait([],
987
result_type = ResultType.LeastPopularEventOrigin)
988
events = self.getEventsAndWait(ids)
990
self.assertEquals([e[0][5] for e in events],
991
["origin2", "origin3", "origin1"])
992
self.assertEquals([e.timestamp for e in events], ["100", "103", "102"])
994
def testResultTypesMostRecentEventOrigin(self):
995
import_events("test/data/twenty_events.js", self)
997
ids = self.findEventIdsAndWait([],
999
result_type = ResultType.MostRecentEventOrigin)
1000
events = self.getEventsAndWait(ids)
1002
self.assertEquals([e.timestamp for e in events], ["103", "102", "100"])
1004
def testResultTypesLeastRecentEventOrigin(self):
1005
import_events("test/data/twenty_events.js", self)
1007
ids = self.findEventIdsAndWait([],
1009
result_type = ResultType.LeastRecentEventOrigin)
1010
events = self.getEventsAndWait(ids)
1012
self.assertEquals([e.timestamp for e in events], ["100", "102", "103"])
1014
def testResultTypesMostPopularSubjectOrigin(self):
1015
import_events("test/data/twenty_events.js", self)
1017
ids = self.findEventIdsAndWait([],
1019
result_type = ResultType.MostPopularOrigin)
1020
events = self.getEventsAndWait(ids)
1022
self.assertEquals([e[1][0][3] for e in events], ["file:///tmp", "file:///home",
1024
self.assertEquals([e.timestamp for e in events], ["116", "118", "119"])
1026
def testResultTypesLeastPopularSubjectOrigin(self):
1027
import_events("test/data/twenty_events.js", self)
1029
ids = self.findEventIdsAndWait([],
1031
result_type = ResultType.LeastPopularOrigin)
1032
events = self.getEventsAndWait(ids)
1034
self.assertEquals([e[1][0][3] for e in events], ["file:///etc", "file:///home",
1036
self.assertEquals([e.timestamp for e in events], ["119", "118", "116"])
1038
def testResultTypesMostRecentSubjectOrigin(self):
1039
import_events("test/data/twenty_events.js", self)
1041
ids = self.findEventIdsAndWait([],
1043
result_type = ResultType.MostRecentOrigin)
1044
events = self.getEventsAndWait(ids)
1046
self.assertEquals([e.timestamp for e in events], ["119", "118", "116"])
1048
def testResultTypesLeastRecentSubjectOrigin(self):
1049
import_events("test/data/twenty_events.js", self)
1051
ids = self.findEventIdsAndWait([],
1053
result_type = ResultType.LeastRecentOrigin)
1054
events = self.getEventsAndWait(ids)
1056
self.assertEquals([e.timestamp for e in events], ["116", "118", "119"])
1058
def testResultTypesMostRecentMimeType(self):
1059
import_events("test/data/twenty_events.js", self)
1061
ids = self.findEventIdsAndWait([],
1063
result_type = ResultType.MostRecentMimeType)
1064
events = self.getEventsAndWait(ids)
1066
self.assertEquals([e.timestamp for e in events], ['119', '114', '110', '107'])
1068
def testResultTypesLeastRecentMimeType(self):
1069
import_events("test/data/twenty_events.js", self)
1071
ids = self.findEventIdsAndWait([],
1073
result_type = ResultType.LeastRecentMimeType)
1074
events = self.getEventsAndWait(ids)
1076
self.assertEquals([e.timestamp for e in events], ['107', '110', '114', '119'])
1078
def testResultTypesMostPopularMimeType(self):
1079
import_events("test/data/twenty_events.js", self)
1081
ids = self.findEventIdsAndWait([],
1083
result_type = ResultType.MostPopularMimeType)
1084
events = self.getEventsAndWait(ids)
1086
self.assertEquals([e.timestamp for e in events], ['119', '110', '107', '114'])
1088
def testResultTypesLeastPopularMimeType(self):
1089
import_events("test/data/twenty_events.js", self)
1091
ids = self.findEventIdsAndWait([],
1093
result_type = ResultType.LeastPopularMimeType)
1094
events = self.getEventsAndWait(ids)
1096
self.assertEquals([e.timestamp for e in events], ['114', '107', '110', '119'])
1098
def testResultTypesMostRecentSubjectInterpretation(self):
1099
import_events("test/data/twenty_events.js", self)
1101
ids = self.findEventIdsAndWait([],
1103
result_type = ResultType.MostRecentSubjectInterpretation)
1104
events = self.getEventsAndWait(ids)
1106
self.assertEquals([e.timestamp for e in events], ['119', '118', '116', '106'])
1108
def testResultTypesLeastRecentSubjectInterpretation(self):
1109
import_events("test/data/twenty_events.js", self)
1111
ids = self.findEventIdsAndWait([],
1113
result_type = ResultType.LeastRecentSubjectInterpretation)
1114
events = self.getEventsAndWait(ids)
1116
self.assertEquals([e.timestamp for e in events], ['106', '116', '118', '119'])
1118
def testResultTypesMostPopularSubjectInterpretation(self):
1119
import_events("test/data/twenty_events.js", self)
1121
ids = self.findEventIdsAndWait([],
1123
result_type = ResultType.MostPopularSubjectInterpretation)
1124
events = self.getEventsAndWait(ids)
1126
self.assertEquals([e.timestamp for e in events], ['119', '116', '106', '118'])
1128
def testResultTypesLeastPopularSubjectInterpretation(self):
1129
import_events("test/data/twenty_events.js", self)
1131
ids = self.findEventIdsAndWait([],
1133
result_type = ResultType.LeastPopularSubjectInterpretation)
1134
events = self.getEventsAndWait(ids)
1136
self.assertEquals([e.timestamp for e in events], ['118', '106', '116', '119'])
1138
if __name__ == "__main__":