zeitgeist team mailing list archive
-
zeitgeist team
-
Mailing list archive
-
Message #01274
[Merge] lp:~thekorn/zeitgeist/fix-595411-remote_testcases into lp:zeitgeist
Markus Korn has proposed merging lp:~thekorn/zeitgeist/fix-595411-remote_testcases into lp:zeitgeist.
Requested reviews:
Zeitgeist Framework Team (zeitgeist)
Related bugs:
#595411 Dbus Timeout when running test/remote-test.py -v ZeitgeistRemoteAPITest
https://bugs.launchpad.net/bugs/595411
This branch fixes a few issues in our testsuite:
- it always restores the values of os.environ if changed to zeitgeist specific values
- make sure to call the test methods (self.assertEquals() etc.) in the main process, and not in a callback, this exposes failures in the test report
- added RemoteTestCase.{deleteEventsAndWait,findRelatedEventsAndWait} in testutils.py
- small API CHANGE of the experimental DeleteEvents()-method: this method now returns a time-tuple describing the intervall where events were changed, otherwise there won't be any direct way to test this method (without using a monitor).
--
https://code.launchpad.net/~thekorn/zeitgeist/fix-595411-remote_testcases/+merge/30628
Your team Zeitgeist Framework Team is requested to review the proposed merge of lp:~thekorn/zeitgeist/fix-595411-remote_testcases into lp:zeitgeist.
=== modified file '_zeitgeist/engine/remote.py'
--- _zeitgeist/engine/remote.py 2010-07-01 07:34:26 +0000
+++ _zeitgeist/engine/remote.py 2010-07-22 09:54:43 +0000
@@ -308,7 +308,7 @@
@dbus.service.method(constants.DBUS_INTERFACE,
in_signature="au",
- out_signature="",
+ out_signature="(ii)",
sender_keyword="sender")
def DeleteEvents(self, event_ids, sender):
"""Delete a set of events from the log given their IDs
@@ -324,6 +324,13 @@
# have been deleted before or the IDs might even have been invalid.
self._notifications.notify_delete(
TimeRange(timestamps[0], timestamps[1]), event_ids)
+ if timestamps is None:
+ # unknown event id, see doc of delete_events()
+ return (-1, -1)
+ timestamp_start, timestamp_end = timestamps
+ timestamp_start = timestamp_start if timestamp_start is not None else -1
+ timestamp_end = timestamp_end if timestamp_end is not None else -1
+ return (timestamp_start, timestamp_end)
@dbus.service.method(constants.DBUS_INTERFACE, in_signature="", out_signature="")
def DeleteLog(self):
=== modified file 'test/engine-extension-test.py'
--- test/engine-extension-test.py 2010-07-01 07:38:58 +0000
+++ test/engine-extension-test.py 2010-07-22 09:54:43 +0000
@@ -32,10 +32,21 @@
def setUp (self):
constants.DATABASE_FILE = ":memory:"
- constants.DEFAULT_EXTENSIONS = []
+ self.save_default_ext = os.environ.get("ZEITGEIST_DEFAULT_EXTENSIONS")
+ self.save_extra_ext = os.environ.get("ZEITGEIST_EXTRA_EXTENSIONS")
+ os.environ["ZEITGEIST_DEFAULT_EXTENSIONS"] = ""
+ os.environ["ZEITGEIST_EXTRA_EXTENSIONS"] = ""
self.engine = get_engine()
def tearDown (self):
+ if self.save_default_ext is not None:
+ os.environ["ZEITGEIST_DEFAULT_EXTENSIONS"] = self.save_default_ext
+ else:
+ del os.environ["ZEITGEIST_DEFAULT_EXTENSIONS"]
+ if self.save_extra_ext is not None:
+ os.environ["ZEITGEIST_EXTRA_EXTENSIONS"] = self.save_extra_ext
+ else:
+ del os.environ["ZEITGEIST_EXTRA_EXTENSIONS"]
self.engine.close()
_zeitgeist.engine._engine = None
=== modified file 'test/engine-test.py'
--- test/engine-test.py 2010-07-01 08:04:55 +0000
+++ test/engine-test.py 2010-07-22 09:54:43 +0000
@@ -40,6 +40,8 @@
class _engineTestClass(unittest.TestCase):
def setUp (self):
+ self.save_default_ext = os.environ.get("ZEITGEIST_DEFAULT_EXTENSIONS")
+ self.save_extra_ext = os.environ.get("ZEITGEIST_EXTRA_EXTENSIONS")
os.environ["ZEITGEIST_DEFAULT_EXTENSIONS"] = ""
os.environ["ZEITGEIST_EXTRA_EXTENSIONS"] = ""
global test_event_1
@@ -55,6 +57,14 @@
self.engine = get_engine()
def tearDown (self):
+ if self.save_default_ext is not None:
+ os.environ["ZEITGEIST_DEFAULT_EXTENSIONS"] = self.save_default_ext
+ else:
+ del os.environ["ZEITGEIST_DEFAULT_EXTENSIONS"]
+ if self.save_extra_ext is not None:
+ os.environ["ZEITGEIST_EXTRA_EXTENSIONS"] = self.save_extra_ext
+ else:
+ del os.environ["ZEITGEIST_EXTRA_EXTENSIONS"]
self.engine.close()
_zeitgeist.engine._engine = None
=== modified file 'test/remote-test.py'
--- test/remote-test.py 2010-05-15 13:05:14 +0000
+++ test/remote-test.py 2010-07-22 09:54:43 +0000
@@ -252,27 +252,28 @@
self.assertEquals(1, result.pop())
def testDeleteEvents(self):
- result = []
- mainloop = gobject.MainLoop()
+ """ delete all events with actor == firefox """
events = parse_events("test/data/five_events.js")
- self.client.insert_events(events)
+ self.insertEventsAndWait(events)
event = Event()
event.actor = "firefox"
- ids = self.findEventIdsAndWait([event])
-
- def callback():
- ids = self.findEventIdsAndWait([])
- self.assertEquals(2, len(ids))
-
- self.client.delete_events(ids, callback)
+ # get event ids with actor == firefox
+ ff_ids = self.findEventIdsAndWait([event])
+ # delete this events
+ time_range = self.deleteEventsAndWait(ff_ids)
+ # got timerange of deleted events
+ self.assertEquals(2, len(time_range))
+ # get all events, the one with actor == firefox should
+ # not be there
+ ids = self.findEventIdsAndWait([])
+ self.assertEquals(2, len(ids))
+ self.assertEquals(0, len(set(ff_ids) & set(ids)))
def testFindByRandomActorAndGet(self):
- result = []
- mainloop = gobject.MainLoop()
events = parse_events("test/data/five_events.js")
- self.client.insert_events(events)
+ self.insertEventsAndWait(events)
template = Event.new_for_values(actor="/usr/bliblablu")
@@ -283,35 +284,34 @@
self.assertEquals(len(events), 0)
def testFindRelated(self):
- mainloop = gobject.MainLoop()
events = parse_events("test/data/apriori_events.js")
- self.client.insert_events(events)
-
- def callback(uris):
- mainloop.quit()
- self.assertEquals(uris, ["i2", "i1", "i3", "i5"])
-
- result = self.client.find_related_uris_for_uris(["i4"], callback, num_events=4, result_type=0)
- mainloop.run()
+ self.insertEventsAndWait(events)
+
+ uris = self.findRelatedAndWait(["i4"], num_events=4, result_type=0)
+ self.assertEquals(set(uris), set(["i2", "i1", "i3", "i5"]))
def testFindEventsForValues(self):
- mainloop = gobject.MainLoop()
+ mainloop = gobject.MainLoop() # we don't have an *AndWait-helper method
+ # for the method we would like to test,
+ # this is why we need our own local loop
events = parse_events("test/data/apriori_events.js")
- self.client.insert_events(events)
+ self.insertEventsAndWait(events)
+ result = []
def callback(events):
+ result.extend(events)
mainloop.quit()
- self.assertEquals(len(events), 1)
- self.assertEquals(events[0].actor, "firefox")
- result = self.client.find_events_for_values(callback, actor="firefox", num_events=1)
+ self.client.find_events_for_values(callback, actor="firefox", num_events=1)
mainloop.run()
+ self.assertEquals(len(result), 1)
+ self.assertEquals(result[0].actor, "firefox")
def testDataSourcesRegistry(self):
""" Ensure that the DataSourceRegistry extension is there. If we'd want
to do any actual value checking we need to change testutils.py to
use a ZEITGEIST_DATA_PATH other than ~/.local/share. """
- iface = ZeitgeistDBusInterface()
+ iface = self.client._iface # we know that client._iface is as clean as possible
registry = iface.get_extension("DataSourceRegistry", "data_source_registry")
registry.GetDataSources()
=== modified file 'test/testutils.py'
--- test/testutils.py 2010-05-15 13:05:14 +0000
+++ test/testutils.py 2010-07-22 09:54:43 +0000
@@ -181,3 +181,42 @@
self.client.get_events(event_ids, collect_events_and_quit)
mainloop.run()
return result
+
+ def deleteEventsAndWait(self, event_ids):
+ """
+ Delete events given by their id and run a loop until the result
+ containing a timetuple describing the interval of changes is
+ returned.
+
+ This method is basically just a hack to invoke an async method
+ in a blocking manner.
+ """
+ mainloop = gobject.MainLoop()
+ result = []
+
+ def collect_timestamp_and_quit(timestamps):
+ result.append(timestamps)
+ mainloop.quit()
+
+ self.client.delete_events(event_ids, collect_timestamp_and_quit)
+ mainloop.run()
+ return result[0]
+
+ def findRelatedAndWait(self, subject_uris, num_events, result_type):
+ """
+ Find related subject uris to given uris and return them.
+
+ This method is basically just a hack to invoke an async method
+ in a blocking manner.
+ """
+ mainloop = gobject.MainLoop()
+ result = []
+
+ def callback(uri_list):
+ result.extend(uri_list)
+ mainloop.quit()
+
+ self.client.find_related_uris_for_uris(subject_uris, callback,
+ num_events=num_events, result_type=result_type)
+ mainloop.run()
+ return result