def mock_manager(use_clock=False): """ Returns an instance of repositories.Manager with a mock database, an empty shelf (using a dict instead of an actual shelf instance), and an example repository """ repostore = repositories.RepositoryStore({}) repostore._shelf = { 'repo_a': { 'id': 'repo_a', 'service': { 'location': 'http://a.test' } } } queue = Queue.Queue() notification_q = repositories.Notification(queue) scheduler = repositories.Scheduler() scheduler._use_clock = use_clock if use_clock: scheduler._time = iter(frange(0, 100000, 0.5)).next notification_q.connect_with(scheduler) manager = repositories.Manager(Mock(), repostore, scheduler) manager.db.add_entities.return_value = make_future({'errors': []}) return scheduler, repostore, manager
def test_scheduler_waits(): scheduler = repositories.Scheduler() scheduler._time = lambda: 0 # schedule repo0 after repo1 # then reschedule repo0 before repo1 yield scheduler.schedule('repo0', 1.0) yield scheduler.schedule('repo1', 0.75) yield scheduler.schedule('repo0', 0.5) scheduler._time = lambda: 0 result = yield scheduler.get() assert result == [] scheduler._time = lambda: 0.6 result = yield scheduler.get() assert result == ['repo0'] scheduler._time = lambda: 0.65 result = yield scheduler.get() assert result == [] scheduler._time = lambda: 0.8 result = yield scheduler.get() assert result == ['repo1'] scheduler._time = lambda: 1.1 result = yield scheduler.get() assert result == [] scheduler._time = lambda: 20 result = yield scheduler.get() assert result == []
def test_scheduler_schedule_new_repo(): scheduler = repositories.Scheduler() scheduler._time = lambda: 0 yield scheduler.schedule('repo0', 0) result = yield scheduler.get() assert result == ['repo0']
def test_schedule_fetch_in_the_future(): scheduler = repositories.Scheduler() scheduler._time = lambda: 1000 scheduler._items = {'a': [2000, 'a']} scheduler._priority_q = [[2000, 'a']] yield scheduler.schedule('a', 100) assert scheduler._items['a'][0] == 1100
def test_not_enough_items(): scheduler = repositories.Scheduler() scheduler._time = lambda: 0 yield scheduler.schedule('repo0', 1) scheduler._time = lambda: 2 result = yield scheduler.get(5) assert result == ['repo0']
def test_get_multiple_items(): scheduler = repositories.Scheduler() scheduler._time = lambda: 0 yield scheduler.schedule('repo0', 1) yield scheduler.schedule('repo1', 2) scheduler._time = lambda: 2 result = yield scheduler.get(2) assert result == ['repo0', 'repo1']
def test_get_rescheduled_in_the_future(): scheduler = repositories.Scheduler() scheduler._time = lambda: 0 yield scheduler.schedule('repo0', 0) yield scheduler.schedule('repo1', 1) yield scheduler.schedule('repo0', 2) scheduler._time = lambda: 1 result = yield scheduler.get(5) assert result == ['repo1']
def test_scheduler_receives_notification(): queue = Queue.Queue() notification_q = repositories.Notification(queue) scheduler = repositories.Scheduler() notification_q.connect_with(scheduler) scheduler._time = lambda: 0 notification_q.put_nowait('repo0') yield notification_q._check_for_notifications() scheduler._time = lambda: repositories.options.notify_min_delay result = yield scheduler.get() assert result == ['repo0']
def test_scheduler_respects_order(): scheduler = repositories.Scheduler() # time is 0 when scheduling and then goes up by one scheduler._time = iter([0, 0, 0, 1, 2, 3]).next scheduler._sleep = lambda x: None yield scheduler.schedule('repo0', 3) yield scheduler.schedule('repo1', 1) yield scheduler.schedule('repo2', 2) result = yield scheduler.get() assert result == ['repo1'] result = yield scheduler.get() assert result == ['repo2'] result = yield scheduler.get() assert result == ['repo0']
def test_get_limited_multiple_items(): scheduler = repositories.Scheduler() scheduler._time = lambda: 0 yield scheduler.schedule('repo0', 1) yield scheduler.schedule('repo1', 2) yield scheduler.schedule('repo2', 3) scheduler._time = lambda: 3 result = yield scheduler.get(2) assert result == ['repo0', 'repo1'] # check 3 would have been included next result = yield scheduler.get(2) assert result == ['repo2']
def test_scheduler_notification_in_same_batch_get_merged(): queue = Queue.Queue() notification_q = repositories.Notification(queue) scheduler = repositories.Scheduler() scheduler._time = lambda: 0 notification_q.connect_with(scheduler) notification_q.put_nowait('repo0') notification_q.put_nowait('repo1') for i in range(10): notification_q.put_nowait('repo0') yield notification_q._check_for_notifications() scheduler._time = lambda: repositories.options.notify_min_delay result = yield scheduler.get(3) assert set(result) == {'repo0', 'repo1'}
def test_scheduler_reschedule(): scheduler = repositories.Scheduler() # time is 0 when scheduling and then goes up by one scheduler._time = iter([0, 0, 0, 1, 2, 3]).next scheduler._sleep = lambda x: None # schedule repo0 after repo1 # then reschedule repo0 before repo1 yield scheduler.schedule('repo0', 3) yield scheduler.schedule('repo1', 2) yield scheduler.schedule('repo0', 1) result = yield scheduler.get() assert result == ['repo0'] result = yield scheduler.get() assert result == ['repo1'] result = yield scheduler.get() assert result == []
def test_get_rescheduled_multiple_items(): scheduler = repositories.Scheduler() scheduler._time = lambda: 0 yield scheduler.schedule('repo0', 10) yield scheduler.schedule('repo1', 2) yield scheduler.schedule('repo2', 3) yield scheduler.schedule('repo0', 2) yield scheduler.schedule('repo1', 1) scheduler._time = lambda: 5 result = yield scheduler.get(5) assert result == ['repo1', 'repo0', 'repo2'] # check nothing would have been included next result = yield scheduler.get(2) assert result == []
def test_scheduler_get_empty(): scheduler = repositories.Scheduler() result = yield scheduler.get() assert result == []