class TestEngineTimers(unittest.TestCase): def setUp(self): self.engine = Engine() def test_callback_added(self): timer = self.engine.callback(MagicMock()) self.assertTrue(timer in self.engine._callbacks) def test_loop_added(self): timer = self.engine.loop(MagicMock()) self.assertTrue(timer in self.engine._callbacks) def test_deferred_added(self): timer = self.engine.defer(10, MagicMock()) self.assertTrue(timer in self.engine._deferreds) def test_deferred_with_zero_delay(self): self.assertRaises(ValueError, self.engine.defer, 0, MagicMock()) def test_deferred_with_negative_delay(self): self.assertRaises(ValueError, self.engine.defer, -1, MagicMock()) def test_cycle_added(self): timer = self.engine.cycle(10, MagicMock()) self.assertTrue(timer in self.engine._deferreds) def test_cycle_with_zero_delay(self): self.assertRaises(ValueError, self.engine.cycle, 0, MagicMock()) def test_cycle_with_negative_delay(self): self.assertRaises(ValueError, self.engine.cycle, -1, MagicMock()) def test_remove_timer_with_no_end(self): timer = self.engine.callback(MagicMock()) self.engine._remove_timer(timer) def test_remove_nonexistent_timer_with_no_end(self): timer = MagicMock() timer.end = None self.engine._remove_timer(timer) def test_remove_timer_with_end(self): timer = self.engine.defer(10, MagicMock()) self.engine._remove_timer(timer) def test_remove_nonexistent_timer_with_end(self): timer = MagicMock() timer.end = 1 self.engine._remove_timer(timer)
class TestEngineTimers(unittest.TestCase): def setUp(self): self.engine = Engine() def test_callback_added(self): timer = self.engine.callback(MagicMock()) self.assertTrue(timer in self.engine._callbacks) def test_loop_added(self): timer = self.engine.loop(MagicMock()) self.assertTrue(timer in self.engine._callbacks) def test_deferred_added(self): timer = self.engine.defer(10, MagicMock()) self.assertTrue(timer in self.engine._deferreds) def test_deferred_with_zero_delay(self): self.assertRaises(ValueError, self.engine.defer, 0, MagicMock()) def test_deferred_with_negative_delay(self): self.assertRaises(ValueError, self.engine.defer, -1, MagicMock()) def test_cycle_added(self): timer = self.engine.cycle(10, MagicMock()) self.assertTrue(timer in self.engine._deferreds) def test_cycle_with_zero_delay(self): self.assertRaises(ValueError, self.engine.cycle, 0, MagicMock()) def test_cycle_with_negative_delay(self): self.assertRaises(ValueError, self.engine.cycle, -1, MagicMock()) def test_remove_timer_with_no_end(self): timer = self.engine.callback(MagicMock()) self.engine._remove_timer(timer) def test_remove_nonexistent_timer_with_no_end(self): timer = MagicMock() timer.end = None self.engine._remove_timer(timer) def test_remove_timer_with_end(self): timer = self.engine.defer(10, MagicMock()) self.engine._remove_timer(timer) def test_remove_nonexistent_timer_with_end(self): timer = MagicMock() timer.end = 1 self.engine._remove_timer(timer)
class TestEnginePoll(unittest.TestCase): def setUp(self): self.engine = Engine() def test_poll_updates_time(self): current_time = self.engine.latest_poll_time time.sleep(0.02) self.engine.poll(0.02) self.assertTrue(self.engine.latest_poll_time > current_time) def test_poll_executes_callbacks(self): callback = MagicMock() callback.function = MagicMock() callback.requeue = False self.engine._callbacks.append(callback) self.engine.poll(0.02) callback.function.assert_called_once_with() self.assertTrue(len(self.engine._callbacks) == 0) def test_callback_exception_doesnt_break_poll(self): callback = MagicMock() callback.function = MagicMock(side_effect=Exception) callback.requeue = False self.engine._callbacks.append(callback) try: self.engine.poll(0.02) except Exception: self.fail("Exception in callback function was not caught.") def test_keyboardinterrupt_during_callback_processing_is_raised(self): callback = MagicMock() callback.function = MagicMock(side_effect=KeyboardInterrupt) callback.requeue = False self.engine._callbacks.append(callback) self.assertRaises(KeyboardInterrupt, self.engine.poll, 0.02) def test_systemexit_during_callback_processing_is_raised(self): callback = MagicMock() callback.function = MagicMock(side_effect=SystemExit) callback.requeue = False self.engine._callbacks.append(callback) self.assertRaises(SystemExit, self.engine.poll, 0.02) def test_poll_requeues_loops(self): loop = MagicMock() loop.function = MagicMock() loop.requeue = True self.engine._callbacks.append(loop) self.engine.poll(0.02) self.assertTrue(loop in self.engine._callbacks) def test_poll_executes_deferreds(self): defer = MagicMock() defer.function = MagicMock() defer.requeue = False defer.end = self.engine.latest_poll_time - 1 self.engine._deferreds.append(defer) self.engine.poll(0.02) defer.function.assert_called_once_with() def test_deferred_exception_doesnt_break_poll(self): defer = MagicMock() defer.function = MagicMock() defer.requeue = False defer.end = self.engine.latest_poll_time - 1 self.engine._deferreds.append(defer) try: self.engine.poll(0.02) except Exception: self.fail("Exception in deferred was not caught.") def test_keyboardinterrupt_during_deferred_processing_is_raised(self): defer = MagicMock() defer.function = MagicMock(side_effect=KeyboardInterrupt) defer.requeue = False defer.end = self.engine.latest_poll_time - 1 self.engine._deferreds.append(defer) self.assertRaises(KeyboardInterrupt, self.engine.poll, 0.02) def test_systemexit_during_deferred_processing_is_raised(self): defer = MagicMock() defer.function = MagicMock(side_effect=SystemExit) defer.requeue = False defer.end = self.engine.latest_poll_time - 1 self.engine._deferreds.append(defer) self.assertRaises(SystemExit, self.engine.poll, 0.02) def test_poll_requeues_deferreds(self): cycle = MagicMock() cycle.function = MagicMock() cycle.requeue = True cycle.end = self.engine.latest_poll_time - 1 cycle.delay = 10 self.engine._deferreds.append(cycle) self.engine.poll(0.02) self.assertTrue(cycle in self.engine._deferreds) def test_poll_returns_if_timer_shuts_down_engine(self): # Pretty ugly way of testing this, to be honest. self.engine._poller.poll = MagicMock() self.engine._channels = {1: None} self.engine.callback(self.engine.stop) self.engine.poll(0.02) self.assertRaises(AssertionError, self.engine._poller.poll.assert_called_once_with) def test_poll_sleeps_for_poll_timeout(self): before = time.time() self.engine.poll(0.225) after = time.time() # It's never exactly the timeout length, but it gets very close. self.assertTrue((after - before) > 0.22) def test_poll_sleeps_until_next_deferred(self): defer = MagicMock() defer.function = MagicMock() defer.requeue = False self.engine._deferreds.append(defer) before = time.time() defer.end = before + 0.225 self.engine.poll(1) after = time.time() # Again, never going to be exact. self.assertTrue((after - before) < 0.25) def test_poller_successful(self): self.engine._channels = {1: None} self.engine._poller.poll = MagicMock() self.engine.poll(0.02) self.engine._poller.poll.assert_called_once_with(0.02) def test_poller_raises_EINTR(self): self.engine._channels = {1: None} self.engine._poller.poll = MagicMock(side_effect=Exception(errno.EINTR)) try: self.engine.poll(0.02) except Exception as err: if err.args[0] == errno.EINTR: self.fail("EINTR during polling was not caught.") def test_poller_raises_unknown(self): self.engine._channels = {1: None} self.engine._poller.poll = MagicMock(side_effect=Exception) self.assertRaises(Exception, self.engine.poll, 0.02) def test_poll_processes_events(self): channel = MagicMock() channel._handle_events = MagicMock() self.engine._channels = {1: channel} self.engine._poller.poll = MagicMock(return_value={1:Engine.ALL_EVENTS}) self.engine.poll(0.02) channel._handle_events.assert_called_once_with(Engine.ALL_EVENTS) def test_event_processing_error_doesnt_break_poll(self): channel = MagicMock() channel._handle_events = MagicMock(side_effect=Exception) self.engine._channels = {1: channel} self.engine._poller.poll = MagicMock(return_value={1:Engine.ALL_EVENTS}) try: self.engine.poll(0.02) except Exception: self.fail("Exception raised during event processing was not caught.") def test_keyboardinterrupt_during_event_processing_is_raised(self): channel = MagicMock() channel._handle_events = MagicMock(side_effect=KeyboardInterrupt) self.engine._channels = {1: channel} self.engine._poller.poll = MagicMock(return_value={1:Engine.ALL_EVENTS}) self.assertRaises(KeyboardInterrupt, self.engine.poll, 0.02) def test_systemexit_during_event_processing_is_raised(self): channel = MagicMock() channel._handle_events = MagicMock(side_effect=SystemExit) self.engine._channels = {1: channel} self.engine._poller.poll = MagicMock(return_value={1:Engine.ALL_EVENTS}) self.assertRaises(SystemExit, self.engine.poll, 0.02)
class TestTimers(unittest.TestCase): def setUp(self): self.times_called = [] self.engine = Engine() def timer(self): self.times_called.append(self.engine.latest_poll_time) def test_callback(self): timer = MagicMock() self.engine.callback(timer) self.engine.poll(0.01) self.engine.poll(0.01) self.engine.poll(0.01) timer.assert_called_once_with() def test_callback_cancel(self): timer = MagicMock() cancel_callback = self.engine.callback(timer) cancel_callback() self.engine.poll(0.01) self.engine.poll(0.01) self.engine.poll(0.01) self.assertRaises(AssertionError, timer.assert_called_with) def test_loop(self): timer = MagicMock() self.engine.loop(timer) self.engine.poll(0.01) self.engine.poll(0.01) self.engine.poll(0.01) timer.assert_has_calls([call() for _ in range(3)]) def test_loop_cancel(self): timer = MagicMock() cancel_loop = self.engine.loop(timer) self.engine.poll(0.01) self.engine.poll(0.01) timer.assert_has_calls([call() for _ in range(2)]) cancel_loop() self.engine.poll(0.01) timer.assert_has_calls([call() for _ in range(2)]) def test_defer(self): self.engine.poll(0.01) timer = MagicMock(side_effect=self.timer) expected_time = self.engine.latest_poll_time + 0.01 self.engine.defer(0.01, timer) self.engine.poll(0.2) self.engine.poll(0.2) self.engine.poll(0.2) timer.assert_called_once_with() self.assertLess(abs(expected_time - self.times_called[0]), 0.01) def test_defer_cancel(self): timer = MagicMock() cancel_defer = self.engine.defer(0.01, timer) cancel_defer() self.engine.poll(0.2) self.engine.poll(0.2) self.engine.poll(0.2) self.assertRaises(AssertionError, timer.assert_called_with) def test_cycle(self): self.engine.poll(0.01) timer = MagicMock(side_effect=self.timer) expected_times = [ self.engine.latest_poll_time + 0.01, self.engine.latest_poll_time + 0.02, self.engine.latest_poll_time + 0.03 ] self.engine.cycle(0.01, timer) self.engine.poll(0.2) self.engine.poll(0.2) self.engine.poll(0.2) if sys.platform == "win32": self.engine.poll(0.02) # See issue #40 timer.assert_has_calls([call() for _ in range(3)]) for i in range(3): self.assertLess(abs(expected_times[i] - self.times_called[i]), 0.01) def test_cycle_cancel(self): self.engine.poll(0.01) timer = MagicMock(side_effect=self.timer) expected_times = [ self.engine.latest_poll_time + 0.01, self.engine.latest_poll_time + 0.02 ] cancel_cycle = self.engine.cycle(0.01, timer) self.engine.poll(0.2) self.engine.poll(0.2) if sys.platform == "win32": self.engine.poll(0.02) # See issue #40 timer.assert_has_calls([call() for _ in range(2)]) cancel_cycle() self.engine.poll(0.2) timer.assert_has_calls([call() for _ in range(2)]) for i in range(2): self.assertLess(abs(expected_times[i] - self.times_called[i]), 0.01)
class TestEnginePoll(unittest.TestCase): def setUp(self): self.engine = Engine() def test_poll_updates_time(self): current_time = self.engine.latest_poll_time time.sleep(0.02) self.engine.poll(0.02) self.assertTrue(self.engine.latest_poll_time > current_time) def test_poll_executes_callbacks(self): callback = MagicMock() callback.function = MagicMock() callback.requeue = False self.engine._callbacks.append(callback) self.engine.poll(0.02) callback.function.assert_called_once_with() self.assertTrue(len(self.engine._callbacks) == 0) def test_callback_exception_doesnt_break_poll(self): callback = MagicMock() callback.function = MagicMock(side_effect=Exception) callback.requeue = False self.engine._callbacks.append(callback) try: self.engine.poll(0.02) except Exception: self.fail("Exception in callback function was not caught.") def test_keyboardinterrupt_during_callback_processing_is_raised(self): callback = MagicMock() callback.function = MagicMock(side_effect=KeyboardInterrupt) callback.requeue = False self.engine._callbacks.append(callback) self.assertRaises(KeyboardInterrupt, self.engine.poll, 0.02) def test_systemexit_during_callback_processing_is_raised(self): callback = MagicMock() callback.function = MagicMock(side_effect=SystemExit) callback.requeue = False self.engine._callbacks.append(callback) self.assertRaises(SystemExit, self.engine.poll, 0.02) def test_poll_requeues_loops(self): loop = MagicMock() loop.function = MagicMock() loop.requeue = True self.engine._callbacks.append(loop) self.engine.poll(0.02) self.assertTrue(loop in self.engine._callbacks) def test_poll_executes_deferreds(self): defer = MagicMock() defer.function = MagicMock() defer.requeue = False defer.end = self.engine.latest_poll_time - 1 self.engine._deferreds.append(defer) self.engine.poll(0.02) defer.function.assert_called_once_with() def test_deferred_exception_doesnt_break_poll(self): defer = MagicMock() defer.function = MagicMock() defer.requeue = False defer.end = self.engine.latest_poll_time - 1 self.engine._deferreds.append(defer) try: self.engine.poll(0.02) except Exception: self.fail("Exception in deferred was not caught.") def test_keyboardinterrupt_during_deferred_processing_is_raised(self): defer = MagicMock() defer.function = MagicMock(side_effect=KeyboardInterrupt) defer.requeue = False defer.end = self.engine.latest_poll_time - 1 self.engine._deferreds.append(defer) self.assertRaises(KeyboardInterrupt, self.engine.poll, 0.02) def test_systemexit_during_deferred_processing_is_raised(self): defer = MagicMock() defer.function = MagicMock(side_effect=SystemExit) defer.requeue = False defer.end = self.engine.latest_poll_time - 1 self.engine._deferreds.append(defer) self.assertRaises(SystemExit, self.engine.poll, 0.02) def test_poll_requeues_deferreds(self): cycle = MagicMock() cycle.function = MagicMock() cycle.requeue = True cycle.end = self.engine.latest_poll_time - 1 cycle.delay = 10 self.engine._deferreds.append(cycle) self.engine.poll(0.02) self.assertTrue(cycle in self.engine._deferreds) def test_poll_returns_if_timer_shuts_down_engine(self): # Pretty ugly way of testing this, to be honest. self.engine._poller.poll = MagicMock() self.engine._channels = {1: None} self.engine.callback(self.engine.stop) self.engine.poll(0.02) self.assertRaises(AssertionError, self.engine._poller.poll.assert_called_once_with) def test_poll_sleeps_for_poll_timeout(self): before = time.time() self.engine.poll(0.225) after = time.time() # It's never exactly the timeout length, but it gets very close. self.assertTrue((after - before) > 0.22) def test_poll_sleeps_until_next_deferred(self): defer = MagicMock() defer.function = MagicMock() defer.requeue = False self.engine._deferreds.append(defer) before = time.time() defer.end = before + 0.225 self.engine.poll(1) after = time.time() # Again, never going to be exact. self.assertTrue((after - before) < 0.25) def test_poller_successful(self): self.engine._channels = {1: None} self.engine._poller.poll = MagicMock() self.engine.poll(0.02) self.engine._poller.poll.assert_called_once_with(0.02) def test_poller_raises_EINTR(self): self.engine._channels = {1: None} self.engine._poller.poll = MagicMock( side_effect=Exception(errno.EINTR)) try: self.engine.poll(0.02) except Exception as err: if err.args[0] == errno.EINTR: self.fail("EINTR during polling was not caught.") def test_poller_raises_unknown(self): self.engine._channels = {1: None} self.engine._poller.poll = MagicMock(side_effect=Exception) self.assertRaises(Exception, self.engine.poll, 0.02) def test_poll_processes_events(self): channel = MagicMock() channel._handle_events = MagicMock() self.engine._channels = {1: channel} self.engine._poller.poll = MagicMock( return_value={1: Engine.ALL_EVENTS}) self.engine.poll(0.02) channel._handle_events.assert_called_once_with(Engine.ALL_EVENTS) def test_event_processing_error_doesnt_break_poll(self): channel = MagicMock() channel._handle_events = MagicMock(side_effect=Exception) self.engine._channels = {1: channel} self.engine._poller.poll = MagicMock( return_value={1: Engine.ALL_EVENTS}) try: self.engine.poll(0.02) except Exception: self.fail( "Exception raised during event processing was not caught.") def test_keyboardinterrupt_during_event_processing_is_raised(self): channel = MagicMock() channel._handle_events = MagicMock(side_effect=KeyboardInterrupt) self.engine._channels = {1: channel} self.engine._poller.poll = MagicMock( return_value={1: Engine.ALL_EVENTS}) self.assertRaises(KeyboardInterrupt, self.engine.poll, 0.02) def test_systemexit_during_event_processing_is_raised(self): channel = MagicMock() channel._handle_events = MagicMock(side_effect=SystemExit) self.engine._channels = {1: channel} self.engine._poller.poll = MagicMock( return_value={1: Engine.ALL_EVENTS}) self.assertRaises(SystemExit, self.engine.poll, 0.02)