def test_repeating(self): PERIOD = 0.1 TIMES = 3 invokations = [0, 0] invoked = threading.Event() def _work(): invokations[0] += 1 invokations[1] = monotonic_time() if invokations[0] == TIMES: invoked.set() op = periodic.Operation(_work, period=PERIOD, scheduler=self.sched, executor=self.exc) op.start() invoked.wait(PERIOD * TIMES + PERIOD) # depending on timing, _work may be triggered one more time. # nothing prevents this, although is unlikely. # we don't care of this case op.stop() self.assertTrue(invoked.is_set()) self.assertTrue(TIMES <= invokations[0] <= TIMES + 1)
def test_repeating_after_block(self): PERIOD = 0.1 TIMES = 5 BLOCK_AT = 2 invokations = [0, 0] executions = [0, 0] done = threading.Event() def _work(): invokations[0] += 1 invokations[1] = monotonic_time() if invokations[0] == BLOCK_AT: # must be > (PERIOD * TIMES) ~= forever time.sleep(10 * PERIOD * TIMES) executions[0] += 1 executions[1] = monotonic_time() if invokations[0] == TIMES: done.set() op = periodic.Operation(_work, period=PERIOD, scheduler=self.sched, executor=self.exc) op.start() done.wait(PERIOD * TIMES + PERIOD) # depending on timing, _work may be triggered one more time. # nothing prevents this, although is unlikely. # we don't care of this case op.stop() self.assertTrue(done.is_set()) self.assertTrue(executions[1] >= invokations[1]) self.assertTrue(TIMES <= invokations[0] <= TIMES + 1) # one execution never completed self.assertEqual(executions[0], invokations[0] - 1)
def test_start_twice(self): def _work(): pass op = periodic.Operation(_work, period=1.0, scheduler=self.sched, executor=self.exc) op.start() self.assertRaises(AssertionError, op.start)
def test_start(self): invoked = threading.Event() def _work(): invoked.set() op = periodic.Operation(_work, period=1.0, scheduler=self.sched, executor=self.exc) op.start() invoked.wait(0.5) self.assertTrue(invoked.is_set())
def test_stop(self): PERIOD = 0.1 invokations = [0] def _work(): invokations[0] = monotonic_time() op = periodic.Operation(_work, period=PERIOD, scheduler=self.sched, executor=self.exc) op.start() time.sleep(PERIOD * 2) # avoid pathological case on which nothing ever runs self.assertTrue(invokations[0] > 0) op.stop() # cooldown. Let's try to avoid scheduler mistakes. time.sleep(PERIOD) stop = monotonic_time() self.assertTrue(stop > invokations[0])