task handler remove_all method created. task handler server restart unit test created.

Added method remove_all to task handler. (intended for unit testing)
Created a method to mimic a server restart for the purpose of task handler.

test_delay unit test passes.
This commit is contained in:
davewiththenicehat 2021-04-19 17:16:37 -04:00
parent a61577b8f3
commit 58308adea6
2 changed files with 49 additions and 12 deletions

View file

@ -341,6 +341,30 @@ class TaskHandler(object):
del d
return True
def remove_all(self, save=True, cancel=True):
"""
Remove all tasks.
By default tasks are canceled and removed from the database also.
Arguments:
save=True (bool): Should changes to persistent tasks be saved to database.
cancel=True (bool): Cancel scheduled tasks before removing it from task handler.
Returns:
True (bool): if the removal completed successfully.
"""
tasks_ids = tuple(self.tasks.keys())
for task_id in tasks_ids:
if cancel:
self.cancel(task_id)
del self.tasks[task_id]
tasks_ids = tuple(self.to_save.keys())
for task_id in tasks_ids:
del self.to_save[task_id]
if save:
self.save()
return True
def do_task(self, task_id):
"""
Execute the task (call its callback).

View file

@ -417,32 +417,30 @@ class TestDelay(EvenniaTest):
# test automated removal of stale tasks.
t = utils.delay(timedelay, dummy_func, self.char1.dbref, persistent=True)
t.cancel()
task_id = t.get_id()
self.assertFalse(t.active())
_TASK_HANDLER.clock.advance(timedelay) # make time pass
self.assertTrue(task_id in _TASK_HANDLER.to_save)
self.assertTrue(task_id in _TASK_HANDLER.tasks)
self.assertTrue(t.get_id() in _TASK_HANDLER.to_save)
self.assertTrue(t.get_id() in _TASK_HANDLER.tasks)
# add a task to test automatic removal
_TASK_HANDLER._now = datetime.now() + timedelta(seconds=_TASK_HANDLER.stale_timeout + 6) # task handler time to 6 seconds after stale timeout
t2 = utils.delay(timedelay, dummy_func, self.char1.dbref, persistent=True)
self.assertFalse(task_id in _TASK_HANDLER.to_save)
self.assertFalse(task_id in _TASK_HANDLER.tasks)
self.assertFalse(t.get_id() in _TASK_HANDLER.to_save)
self.assertFalse(t.get_id() in _TASK_HANDLER.tasks)
self.assertEqual(self.char1.ndb.dummy_var, False)
# test manual cleanup
t2.cancel()
_TASK_HANDLER.clock.advance(timedelay) # advance twisted reactor time past callback time
_TASK_HANDLER._now = datetime.now() + timedelta(seconds=30) # set TaskHandler's time to 30 seconnds from now
task_id = t2.get_id()
# test before stale_timeout time
_TASK_HANDLER.clean_stale_tasks() # cleanup of stale tasks in in the save method
# still in the task handler because stale timeout has not been reached
self.assertTrue(task_id in _TASK_HANDLER.to_save)
self.assertTrue(task_id in _TASK_HANDLER.tasks)
self.assertTrue(t2.get_id() in _TASK_HANDLER.to_save)
self.assertTrue(t2.get_id() in _TASK_HANDLER.tasks)
# advance past stale timeout
_TASK_HANDLER._now = datetime.now() + timedelta(seconds=_TASK_HANDLER.stale_timeout + 6) # task handler time to 6 seconds after stale timeout
_TASK_HANDLER.clean_stale_tasks() # cleanup of stale tasks in in the save method
self.assertFalse(task_id in _TASK_HANDLER.to_save)
self.assertFalse(task_id in _TASK_HANDLER.tasks)
self.assertFalse(t2.get_id() in _TASK_HANDLER.to_save)
self.assertFalse(t2.get_id() in _TASK_HANDLER.tasks)
self.char1.ndb.dummy_var = False
_TASK_HANDLER._now = False
# if _TASK_HANDLER.stale_timeout is 0 or less, automatic cleanup should not run
@ -459,8 +457,23 @@ class TestDelay(EvenniaTest):
self.assertTrue(t.get_id() in _TASK_HANDLER.to_save)
self.assertTrue(t.get_id() in _TASK_HANDLER.tasks)
self.assertEqual(self.char1.ndb.dummy_var, False)
t.remove()
t2.remove()
_TASK_HANDLER.remove_all()
self.char1.ndb.dummy_var = False
_TASK_HANDLER._now = False
# replicate a restart
_TASK_HANDLER.remove_all()
_TASK_HANDLER.save()
self.assertFalse(_TASK_HANDLER.tasks)
self.assertFalse(_TASK_HANDLER.to_save)
# create a persistent task.
t = utils.delay(timedelay, dummy_func, self.char1.dbref, persistent=True)
_TASK_HANDLER.save()
_TASK_HANDLER.remove_all(False) # remove all tasks, do not save this change.
_TASK_HANDLER.clock.advance(timedelay) # advance twisted reactor time past callback time
self.assertEqual(self.char1.ndb.dummy_var, False) # task has not run
_TASK_HANDLER.load()
_TASK_HANDLER.create_delays()
_TASK_HANDLER.clock.advance(timedelay) # Clock must advance to trigger, even if past timedelay
self.assertEqual(self.char1.ndb.dummy_var, 'dummy_func ran')
_TASK_HANDLER.remove_all()
self.char1.ndb.dummy_var = False