def RE(): """ Standard logging runengine """ RE = RunEngine({}) collector = MsgCollector(msg_hook=run_engine_logger.debug) RE.msg_hook = collector return RE
def test_pseudo_mv(hw, RE, pln): p = hw.pseudo3x3 m_col = MsgCollector() RE.msg_hook = m_col RE(pln(p.pseudo1, 1, p.pseudo2, 1)) expecte_objs = [p, None] assert len(m_col.msgs) == 2 assert [m.obj for m in m_col.msgs] == expecte_objs
def test_reset_wrapper(hw, RE): p = hw.pseudo3x3 m_col = MsgCollector() RE.msg_hook = m_col RE(bp.relative_inner_product_scan([], 1, p.pseudo1, 0, 1, p.pseudo2, 0, 1)) expecte_objs = [ p, None, None, p, None, p, None, None, p, None, None, p, p, None ] assert len(m_col.msgs) == 14 assert [m.obj for m in m_col.msgs] == expecte_objs
def test_nonrewindable_detector(RE, hw, start_state, msg_seq): class FakeSig: def get(self): return False hw.det.rewindable = FakeSig() RE.rewindable = start_state m_col = MsgCollector() RE.msg_hook = m_col RE(run_wrapper(trigger_and_read([hw.motor, hw.det]))) assert [m.command for m in m_col.msgs] == msg_seq
def test_unresumable_suspend_fail(RE): 'Tests what happens when a soft pause is requested from a suspended state' scan = [Msg('clear_checkpoint'), Msg('sleep', None, 2)] m_coll = MsgCollector() RE.msg_hook = m_coll ev = asyncio.Event(loop=RE.loop) threading.Timer(.1, partial(RE.request_suspend, fut=ev.wait)).start() threading.Timer(1, ev.set).start() start = time.time() with pytest.raises(RunEngineInterrupted): RE(scan) stop = time.time() assert .1 < stop - start < 1
def test_nonrewindable_detector(fresh_RE, motor_det, start_state, msg_seq): class FakeSig: def get(self): return False motor, det = motor_det det.rewindable = FakeSig() RE = fresh_RE RE.rewindable = start_state m_col = MsgCollector() RE.msg_hook = m_col RE(bp.run_wrapper(bp.trigger_and_read([motor, det]))) assert [m.command for m in m_col.msgs] == msg_seq
def test_unresumable_suspend_fail(fresh_RE): 'Tests what happens when a soft pause is requested from a suspended state' RE = fresh_RE scan = [Msg('clear_checkpoint'), Msg('sleep', None, 50)] m_coll = MsgCollector() RE.msg_hook = m_coll ev = asyncio.Event(loop=RE.loop) loop = RE.loop loop.call_later(.1, partial(RE.request_suspend, fut=ev.wait())) loop.call_later(1, ev.set) start = time.time() with pytest.raises(RunEngineInterrupted): RE(scan, raise_if_interrupted=True) stop = time.time() assert .1 < stop - start < 1
def test_intreupted_with_callbacks(fresh_RE, int_meth, stop_num, msg_num): RE = fresh_RE docs = defaultdict(list) def collector_cb(name, doc): nonlocal docs docs[name].append(doc) RE.msg_hook = MsgCollector() RE(subs_wrapper(run_wrapper(pause()), {'all': collector_cb})) getattr(RE, int_meth)() assert len(docs['start']) == 1 assert len(docs['event']) == 0 assert len(docs['descriptor']) == 0 assert len(docs['stop']) == stop_num assert len(RE.msg_hook.msgs) == msg_num
def test_interrupted_with_callbacks(RE, int_meth, stop_num, msg_num): docs = defaultdict(list) def collector_cb(name, doc): nonlocal docs docs[name].append(doc) RE.msg_hook = MsgCollector() with pytest.raises(RunEngineInterrupted): RE(subs_wrapper(run_wrapper(pause()), {"all": collector_cb})) getattr(RE, int_meth)() assert len(docs["start"]) == 1 assert len(docs["event"]) == 0 assert len(docs["descriptor"]) == 0 assert len(docs["stop"]) == stop_num assert len(RE.msg_hook.msgs) == msg_num
def test_halt_from_pause(fresh_RE): RE = fresh_RE except_hit = False m_coll = MsgCollector() RE.msg_hook = m_coll def pausing_plan(): nonlocal except_hit for j in range(5): yield Msg('null') try: yield Msg('pause') except Exception: yield Msg('null') except_hit = True raise RE(pausing_plan()) RE.halt() assert not except_hit assert [m.command for m in m_coll.msgs] == ['null'] * 5 + ['pause']
def test_halt_from_pause(RE): except_hit = False m_coll = MsgCollector() RE.msg_hook = m_coll def pausing_plan(): nonlocal except_hit for j in range(5): yield Msg('null') try: yield Msg('pause') except Exception: yield Msg('null') except_hit = True raise with pytest.raises(RunEngineInterrupted): RE(pausing_plan()) RE.halt() assert not except_hit assert [m.command for m in m_coll.msgs] == ['null'] * 5 + ['pause']
def test_halt_async(fresh_RE): RE = fresh_RE except_hit = False m_coll = MsgCollector() RE.msg_hook = m_coll def sleeping_plan(): nonlocal except_hit try: yield Msg('sleep', None, 50) except Exception: yield Msg('null') except_hit = True raise RE.loop.call_later(.1, RE.halt) start = ttime.time() RE(sleeping_plan()) stop = ttime.time() assert .09 < stop - start < .2 assert not except_hit assert [m.command for m in m_coll.msgs] == ['sleep']
def test_nonrewindable_finalizer(fresh_RE, motor_det, start_state, msg_seq): class FakeSig: def get(self): return False motor, det = motor_det det.rewindable = FakeSig() RE = fresh_RE RE.rewindable = start_state m_col = MsgCollector() RE.msg_hook = m_col def evil_plan(): assert RE.rewindable is False yield Msg('aardvark') with pytest.raises(KeyError): RE(bp.rewindable_wrapper(evil_plan(), False)) assert RE.rewindable is start_state assert [m.command for m in m_col.msgs] == msg_seq
def test_halt_async(RE): except_hit = False m_coll = MsgCollector() RE.msg_hook = m_coll def sleeping_plan(): nonlocal except_hit try: yield Msg('sleep', None, 50) except Exception: yield Msg('null') except_hit = True raise threading.Timer(.1, RE.halt).start() start = ttime.time() with pytest.raises(RunEngineInterrupted): RE(sleeping_plan()) stop = ttime.time() assert .09 < stop - start < 5 assert not except_hit assert [m.command for m in m_coll.msgs] == ['sleep']
def test_ramp(RE, db): from ophyd.positioner import SoftPositioner from ophyd import StatusBase from bluesky.examples import SynGauss tt = SoftPositioner(name='mot') tt.set(0) dd = SynGauss('det', tt, 'mot', 0, 3) st = StatusBase() def kickoff(): yield Msg('null') for j, v in enumerate(np.linspace(-5, 5, 10)): RE.loop.call_later(.1 * j, lambda v=v: tt.set(v)) RE.loop.call_later(1.2, st._finished) return st def inner_plan(): yield from trigger_and_read([dd]) g = ramp_plan(kickoff(), tt, inner_plan, period=0.08) RE.subscribe('all', db.mds.insert) RE.msg_hook = MsgCollector() rs_uid, = RE(g) hdr = db[-1] assert hdr.start.uid == rs_uid assert len(hdr.descriptors) == 2 assert set([d['name'] for d in hdr.descriptors]) == \ set(['primary', 'mot_monitor']) primary_events = list(db.get_events(hdr, stream_name='primary')) assert len(primary_events) > 11 monitor_events = list(db.get_events(hdr, stream_name='mot_monitor')) assert len(monitor_events) == 10
def test_prompt_stop(fresh_RE, cancel_func): RE = fresh_RE except_hit = False m_coll = MsgCollector() RE.msg_hook = m_coll def sleeping_plan(): nonlocal except_hit try: yield Msg('sleep', None, 50) except Exception: yield Msg('null') except_hit = True raise RE.loop.call_later(.1, partial(cancel_func, RE)) start = ttime.time() RE(sleeping_plan()) stop = ttime.time() if RE.state != 'idle': RE.abort() assert 0.09 < stop - start < .2 assert except_hit assert [m.command for m in m_coll.msgs] == ['sleep', 'null']
def test_prompt_stop(RE, cancel_func): except_hit = False m_coll = MsgCollector() RE.msg_hook = m_coll def sleeping_plan(): nonlocal except_hit try: yield Msg('sleep', None, 50) except Exception: yield Msg('null') except_hit = True raise threading.Timer(.1, partial(cancel_func, RE)).start() start = ttime.time() with pytest.raises(RunEngineInterrupted): RE(sleeping_plan()) stop = ttime.time() if RE.state != 'idle': RE.abort() assert 0.09 < stop - start < 5 assert except_hit assert [m.command for m in m_coll.msgs] == ['sleep', 'null']