From 58308adea6e8e2b18339b0ec802958719f3e2def Mon Sep 17 00:00:00 2001 From: davewiththenicehat <54369722+davewiththenicehat@users.noreply.github.com> Date: Mon, 19 Apr 2021 17:16:37 -0400 Subject: [PATCH] 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. --- evennia/scripts/taskhandler.py | 24 ++++++++++++++++++++ evennia/utils/tests/test_utils.py | 37 +++++++++++++++++++++---------- 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/evennia/scripts/taskhandler.py b/evennia/scripts/taskhandler.py index 214d1e3f8a..c9233adbd8 100644 --- a/evennia/scripts/taskhandler.py +++ b/evennia/scripts/taskhandler.py @@ -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). diff --git a/evennia/utils/tests/test_utils.py b/evennia/utils/tests/test_utils.py index 53ec661521..5c71fe19bf 100644 --- a/evennia/utils/tests/test_utils.py +++ b/evennia/utils/tests/test_utils.py @@ -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