|
1 | 1 | from __future__ import absolute_import, unicode_literals
|
2 | 2 |
|
| 3 | +import time |
3 | 4 | import pytest
|
4 | 5 |
|
5 | 6 | from datetime import datetime, timedelta
|
@@ -422,6 +423,40 @@ def test_scheduler_schedules_equality_on_change(self, monkeypatch):
|
422 | 423 | monkeypatch.setattr(self.s, 'schedule_changed', lambda: True)
|
423 | 424 | assert not self.s.schedules_equal(self.s.schedule, self.s.schedule)
|
424 | 425 |
|
| 426 | + def test_heap_always_return_the_first_item(self): |
| 427 | + interval = 10 |
| 428 | + |
| 429 | + s1 = schedule(timedelta(seconds=interval)) |
| 430 | + m1 = self.create_model_interval(s1, enabled=False) |
| 431 | + m1.last_run_at = self.app.now() - timedelta(seconds=interval + 2) |
| 432 | + m1.save() |
| 433 | + m1.refresh_from_db() |
| 434 | + |
| 435 | + s2 = schedule(timedelta(seconds=interval)) |
| 436 | + m2 = self.create_model_interval(s2, enabled=True) |
| 437 | + m2.last_run_at = self.app.now() - timedelta(seconds=interval + 1) |
| 438 | + m2.save() |
| 439 | + m2.refresh_from_db() |
| 440 | + |
| 441 | + e1 = EntryTrackSave(m1, self.app) |
| 442 | + # because the disabled task e1 runs first, e2 will never be executed |
| 443 | + e2 = EntryTrackSave(m2, self.app) |
| 444 | + |
| 445 | + s = self.Scheduler(app=self.app) |
| 446 | + s.schedule.clear() |
| 447 | + s.schedule[e1.name] = e1 |
| 448 | + s.schedule[e2.name] = e2 |
| 449 | + |
| 450 | + tried = set() |
| 451 | + for _ in range(len(s.schedule) * 8): |
| 452 | + tick_interval = s.tick() |
| 453 | + if tick_interval and tick_interval > 0.0: |
| 454 | + tried.add(s._heap[0].entry.name) |
| 455 | + time.sleep(tick_interval) |
| 456 | + if s.should_sync(): |
| 457 | + s.sync() |
| 458 | + assert len(tried) == 1 and tried == set([e1.name]) |
| 459 | + |
425 | 460 |
|
426 | 461 | @pytest.mark.django_db()
|
427 | 462 | class test_models(SchedulerCase):
|
|
0 commit comments