def test_priority(pool): dummy1 = create_dummy('dummy1') sched.meta.assign_val(dummy1, priority=3) dummy2 = create_dummy('dummy2') sched.meta.assign_val(dummy2, priority=4) s = sched.Sched([dummy2, dummy1]) res = list(s.run(pool())) assert res == [TaskRes(dummy1), TaskRes(dummy2)] sched.meta.assign_val(dummy1, priority=4) sched.meta.assign_val(dummy2, priority=3) s = sched.Sched([dummy2, dummy1]) res = list(s.run(pool())) assert res == [TaskRes(dummy2), TaskRes(dummy1)]
def test_kwargs(pool): dummy1 = create_dummy_with_kwargs('dummy1') args = {'testargs': 1234} sched.meta.assign_val(dummy1, kwargs=args) s = sched.Sched([dummy1]) res = list(s.run(pool())) assert res == [TaskRes(dummy1, ret=args)]
def test_shared_kwargs(pool): dummy1 = create_dummy_shared_kwargs('dummy1', 1234) args = {'testargs': 2345} sched.meta.assign_val(dummy1, kwargs=args) s = sched.Sched([dummy1]) res = list(s.run(pool())) assert res == [TaskRes(dummy1, shared={'dummy1': 1234}, ret=args)]
def test_return_exception(pool): dummy1 = create_dummy_with_exception('dummy1', NameError()) s = sched.Sched([dummy1]) res = list(s.run(pool())) dummy1res = res[0] assert dummy1res.task == dummy1 assert dummy1res.excinfo.type == NameError assert isinstance(dummy1res.excinfo.val, NameError)
def test_requires_provides(pool): dummy1 = create_dummy('dummy1') sched.meta.assign_val(dummy1, requires=['dep'], priority=1) dummy2 = create_dummy('dummy2') sched.meta.assign_val(dummy2, provides=['dep'], priority=2) s = sched.Sched([dummy2, dummy1]) res = list(s.run(pool())) assert res == [TaskRes(dummy2), TaskRes(dummy1)]
def test_add_tasks(pool): dummy1 = create_dummy('dummy1') dummy2 = create_dummy('dummy2') s = sched.Sched([dummy1]) s.add_tasks([dummy2]) res = list(s.run(pool())) assert TaskRes(dummy1) in res assert TaskRes(dummy2) in res
def test_claims(pool): q = mp.Queue() dummy1 = create_dummy_that_types('dummy1') sched.meta.assign_val(dummy1, claims=['res'], priority=1, kwargs={'q': q}) dummy2 = create_dummy_that_types('dummy2') sched.meta.assign_val(dummy2, claims=['res'], priority=2, kwargs={'q': q}) s = sched.Sched([dummy1, dummy2]) res = list(s.run(pool(workers=1))) assert res == [TaskRes(dummy1), TaskRes(dummy2)] output = ''.join(map(lambda x: q.get(), range(q.qsize()))) assert output == '1111122222' #s.add_tasks([dummy1, dummy2]) s = sched.Sched([dummy1, dummy2]) res = list(s.run(pool(workers=2))) assert TaskRes(dummy1) in res assert TaskRes(dummy2) in res output = ''.join(map(lambda x: str(q.get()), range(q.qsize()))) assert output == '1111122222'
def test_unpicklable_ret_shared(pool): nonpickl = create_dummy('') dummy1 = create_dummy_with_shared('dummy1', nonpickl, ret=nonpickl) s = sched.Sched([dummy1]) res = list(s.run(pool())) dummy1res = res[0] assert dummy1res.task == dummy1 assert dummy1res.excinfo.type == AttributeError assert "Can't pickle" in str(dummy1res.excinfo.val)
def test_provided_not_required(): dummy1 = create_dummy('dummy1') sched.meta.assign_val(dummy1, provides=['one']) with warnings.catch_warnings(record=True) as caught: s = sched.Sched([dummy1]) assert len(caught) == 1 # only one warning assert caught[0].category == util.PexenWarning assert "Dep 'one' provided by" in str(caught[0].message) assert "but not required by any task" in str(caught[0].message)
def test_kwargs_without_args(pool): dummy1 = create_dummy('dummy1') args = {'testargs': 1234} sched.meta.assign_val(dummy1, kwargs=args) s = sched.Sched([dummy1]) res = list(s.run(pool())) dummy1res = res[0] assert dummy1res.task == dummy1 assert dummy1res.excinfo.type == TypeError assert "unexpected keyword argument" in str(dummy1res.excinfo.val)
def test_wait_for_deps(pool): # when frontline gets exhausted while there are still some tasks # to run within deps references, the planner should not exit dummy1 = create_dummy('dummy1') sched.meta.assign_val(dummy1, provides=['one']) dummy2 = create_dummy('dummy2') sched.meta.assign_val(dummy2, requires=['one'], provides=['two']) dummy3 = create_dummy('dummy3') sched.meta.assign_val(dummy3, requires=['two']) s = sched.Sched([dummy1, dummy2, dummy3]) res = list(s.run(pool(workers=4))) assert res == [TaskRes(dummy1), TaskRes(dummy2), TaskRes(dummy3)]
def test_shared(pool): dummy1 = create_dummy_with_shared('dummy1', 1234) sched.meta.assign_val(dummy1, requires=['dep']) dummy2 = create_dummy_with_shared('dummy2', 2345) sched.meta.assign_val(dummy2, provides=['dep']) s = sched.Sched([dummy2, dummy1]) res = list(s.run(pool())) dummy2res, dummy1res = res # order guaranteed by dep assert dummy2res == TaskRes(dummy2, shared={'dummy2': 2345}) assert dummy1res == TaskRes(dummy1, shared={ 'dummy2': 2345, 'dummy1': 1234 })
def test_failed_locks_controlled(pool): dummy1 = create_dummy('dummy1') sched.meta.assign_val(dummy1, priority=2, claims=['res']) dummy2 = create_dummy_with_exception('dummy2', sched.TaskFailError()) sched.meta.assign_val(dummy2, priority=1, claims=['res']) s = sched.Sched([dummy1, dummy2]) with warnings.catch_warnings(record=True) as caught: res = list(s.run(pool())) assert len(res) == 2 # dummy1 did run dummy2res, dummy1res = res assert dummy2res.task == dummy2 assert dummy2res.excinfo.type == sched.TaskFailError assert isinstance(dummy2res.excinfo.val, sched.TaskFailError) assert dummy1res.task == dummy1 assert len(caught) == 0 # no warnings
def test_failed_locks(pool, exc): dummy1 = create_dummy('dummy1') sched.meta.assign_val(dummy1, priority=2, claims=['res']) dummy2 = create_dummy_with_exception('dummy2', exc) sched.meta.assign_val(dummy2, priority=1, claims=['res']) s = sched.Sched([dummy1, dummy2]) with warnings.catch_warnings(record=True) as caught: res = list(s.run(pool())) assert len(res) == 1 # dummy1 didn't run dummy2res = res[0] assert dummy2res.task == dummy2 assert dummy2res.excinfo.type == type(exc) assert isinstance(dummy2res.excinfo.val, type(exc)) assert len(caught) == 1 # only one warning assert caught[0].category == util.PexenWarning assert "1 locks still held at exit" in str(caught[0].message)
def test_failed_deps(pool, exc): dummy1 = create_dummy('dummy1') sched.meta.assign_val(dummy1, requires=['dep']) dummy2 = create_dummy_with_exception('dummy2', exc) sched.meta.assign_val(dummy2, provides=['dep']) s = sched.Sched([dummy2, dummy1]) with warnings.catch_warnings(record=True) as caught: res = list(s.run(pool())) assert len(res) == 1 # dummy1 didn't run dummy2res = res[0] assert dummy2res.task == dummy2 assert dummy2res.excinfo.type == type(exc) assert isinstance(dummy2res.excinfo.val, type(exc)) assert len(caught) == 1 # only one warning assert caught[0].category == util.PexenWarning assert "1 tasks skipped due to unmet deps" in str(caught[0].message)
def test_preset_shared(pool): dummy1 = create_dummy_with_shared('dummy1', 1234) dummy2 = create_dummy_with_shared('dummy2', 2345) s = sched.Sched([dummy1, dummy2]) s.add_shared(bothx=4444, dummy2=6666) s.add_shared(bothy=5555) res = list(s.run(pool())) assert TaskRes(dummy1, shared={ 'bothx': 4444, 'bothy': 5555, 'dummy1': 1234, 'dummy2': 6666 }) in res # pre-set 6666 was overwritten and propagated to parent assert TaskRes(dummy2, shared={ 'bothx': 4444, 'bothy': 5555, 'dummy2': 2345 }) in res
def test_task_via_init(pool): dummy1 = create_dummy('dummy1') s = sched.Sched([dummy1]) res = list(s.run(pool())) assert res == [TaskRes(dummy1)]
def test_empty(pool): s = sched.Sched([]) res = list(s.run(pool())) assert res == []
def test_empty_default(): s = sched.Sched([]) res = list(s.run()) print(res)
def test_sanity(): s = sched.Sched([])
def test_required_not_provided(): dummy1 = create_dummy('dummy1') sched.meta.assign_val(dummy1, requires=['one']) with pytest.raises(sched.DepcheckError) as exc: s = sched.Sched([dummy1]) assert "Unsatisfied requires remain: ['one']" in str(exc.value)
def test_unpicklable_ret_shared_thread(pool): nonpickl = create_dummy('') dummy1 = create_dummy_with_shared('dummy1', nonpickl, ret=nonpickl) s = sched.Sched([dummy1]) res = list(s.run(pool())) assert res == [TaskRes(dummy1, shared={'dummy1': nonpickl}, ret=nonpickl)]
def test_lock_sanity(): dummy1 = create_dummy('dummy1') sched.meta.assign_val(dummy1, uses=[1, 2, 3], claims=[4, 2, 3, 6]) with pytest.raises(sched.MutexError) as exc: s = sched.Sched([dummy1]) assert "has {2, 3} in both claims and uses" in str(exc.value)
def test_return_value(pool): dummy1 = create_dummy_with_return('dummy1', 1234) s = sched.Sched([dummy1]) res = list(s.run(pool())) assert res == [TaskRes(dummy1, ret=1234)]