Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
0
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)