diff options
author | Brendan McCollam <brendan@mccoll.am> | 2014-07-15 09:26:56 +0300 |
---|---|---|
committer | Alex Grönholm <alex.gronholm@nextday.fi> | 2014-07-15 09:27:20 +0300 |
commit | dea45080a8dbe06a998fe825731cbb425311bee0 (patch) | |
tree | a6449297840fa0540616b3cc0ed0d70f6f44f9e0 | |
parent | 79854975aca5c9473a71f6677725d9556eaf66db (diff) | |
download | apscheduler-dea45080a8dbe06a998fe825731cbb425311bee0.tar.gz |
Fixed BlockingScheduler, BackgroundScheduler and GeventScheduler incorrectly waiting MAX_WAIT_TIME when wait_seconds is 0
-rw-r--r-- | apscheduler/schedulers/blocking.py | 2 | ||||
-rw-r--r-- | tests/test_schedulers.py | 20 |
2 files changed, 21 insertions, 1 deletions
diff --git a/apscheduler/schedulers/blocking.py b/apscheduler/schedulers/blocking.py index 306860f..2720822 100644 --- a/apscheduler/schedulers/blocking.py +++ b/apscheduler/schedulers/blocking.py @@ -25,7 +25,7 @@ class BlockingScheduler(BaseScheduler): def _main_loop(self): while self.running: wait_seconds = self._process_jobs() - self._event.wait(wait_seconds or self.MAX_WAIT_TIME) + self._event.wait(wait_seconds if wait_seconds is not None else self.MAX_WAIT_TIME) self._event.clear() def wakeup(self): diff --git a/tests/test_schedulers.py b/tests/test_schedulers.py index 8f4b40e..ee75ad6 100644 --- a/tests/test_schedulers.py +++ b/tests/test_schedulers.py @@ -902,6 +902,12 @@ class TestBlockingScheduler(SchedulerImplementationTestBase): return BlockingScheduler() @pytest.fixture + def mock_event_scheduler(self, scheduler): + scheduler._event = MagicMock() + scheduler._event.clear.side_effect = StopIteration() + return scheduler + + @pytest.fixture def start_scheduler(self, request, scheduler): def cleanup(): if scheduler.running: @@ -912,6 +918,20 @@ class TestBlockingScheduler(SchedulerImplementationTestBase): thread = Thread(target=scheduler.start) return thread.start + @pytest.mark.parametrize('wait_seconds,expected_wait', [[0, 0], [None, 4294967], [728, 728]], + ids=['zero', 'none', 'positive']) + def test_main_loop_wait_seconds_zero(self, mock_event_scheduler, wait_seconds, expected_wait): + """Tests that _main_loop() correctly handles the condition where `wait_seconds` is 0.""" + + mock_event_scheduler._process_jobs = MagicMock(return_value=wait_seconds) + mock_event_scheduler._stopped = False + try: # We need this to break out of the infinite while loop + mock_event_scheduler._main_loop() + except StopIteration: + pass + + mock_event_scheduler._event.wait.assert_called_with(expected_wait) + class TestBackgroundScheduler(SchedulerImplementationTestBase): @pytest.fixture |