def test_relay_connect_is_retried_after_failed_connects( t=Time, logic=DEFAULT_LOGIC, bear=NID('bear:987'), mouse=NID('mouse:123')): t, logic = test_connect_fails_if_relayed_connect_fails(t, logic, bear=bear, mouse=mouse) emits_(logic.ensure_connected(mouse, t.current), [(Connect, nid2addr(mouse)), (Ping, OUT, mouse, ANY)]) emits_(logic.heartbeat(t.advance(logic.heartbeat_max_silence)), [(RelayConnect, OUT, bear, mouse), (Disconnect, nid2addr(mouse)), (NextBeat, 1.0)])
def test_relay_is_tried_on_bad_send(t=Time, logic=DEFAULT_LOGIC, bear=NID('bear:987'), mouse=NID('mouse:123')): t, logic, msg = t(), logic(), object() just_(logic.new_relay_received(bear)) emits_(logic.send_message(mouse, msg, t.current), [(Connect, nid2addr(mouse)), (Ping, OUT, mouse, ANY)]) emits_(logic.heartbeat(t.advance(logic.heartbeat_max_silence)), [(RelayConnect, OUT, bear, mouse), (Disconnect, nid2addr(mouse)), (NextBeat, 1.0)]) return t, logic, msg
def test_failed_connect(t=Time, logic=DEFAULT_LOGIC, nid=NID('kaamel:123')): t, logic = t(), logic() # connect emits_(logic.ensure_connected(nid, 0), [(Connect, nid2addr(nid)), (Ping, OUT, nid, ANY)]) # heartbeat not needed emits_(logic.heartbeat(t=t.current), [(NextBeat, 1.0)]) # ping emitted emits_(logic.heartbeat(t=t.advance(by=1.0)), [(Ping, OUT, nid, ANY), (NextBeat, 1.0)]) # ping emitted emits_(logic.heartbeat(t=t.advance(by=1.0)), [(Ping, OUT, nid, ANY), (NextBeat, 1.0)]) # disconnect occurs emits_(logic.heartbeat(t=t.advance(by=1.0)), [(Disconnect, nid2addr(nid)), (NodeDown, nid), (NextBeat, 1.0)]) # silence emits_(logic.heartbeat(t=t.advance(by=1.0)), [(NextBeat, 1.0)]) return t, logic
def test_relay_propagates_on_outgoing_message(t=Time, logic=RELAY_LOGIC, mouse=NID('mouse:123')): t, logic, msg = t(), logic(), object() emits_(logic.send_message(mouse, msg, t.current), [(RelaySigNew, OUT, mouse), (Connect, nid2addr(mouse)), (Ping, OUT, mouse, ANY)])
def test_send_message_with_no_previous_connection(t=Time, logic=DEFAULT_LOGIC, nid=NID('kaamel:123')): t, logic, msg = t(), logic(), object() emits_(logic.send_message(nid, msg, t=t.current), [(Connect, nid2addr(nid)), (Ping, OUT, nid, ANY)]) return t, logic, msg
def test_successful_connect(t=Time, logic=DEFAULT_LOGIC, nid=NID('kaamel:123')): t, logic = t(), logic() # connect emits_(logic.ensure_connected(nid, t=t.current), [(Connect, nid2addr(nid)), (Ping, OUT, nid, ANY)]) # ...successfully emits_(logic.ping_received(OUT, nid, 0, t=t.advance(by=2.5)), [(Ping, OUT, nid, ANY)]) return t, logic
def test_send_message_with_no_previous_connection_and_sigdisconnect_response( t=Time, logic=DEFAULT_LOGIC, nid=NID('kaamel:123')): t, logic, msg = test_send_message_with_no_previous_connection(t, logic, nid=nid) emits_(logic.sig_disconnect_received(nid), [(Disconnect, nid2addr(nid)), (NodeDown, nid), (SendFailed, msg)])
def test_send_message_with_no_previous_connection_and_no_response( t=Time, logic=DEFAULT_LOGIC, nid=NID('kaamel:123')): t, logic, msg = test_send_message_with_no_previous_connection(t, logic, nid=nid) emits_(logic.heartbeat(t=t.advance(logic.heartbeat_max_silence)), [(Disconnect, nid2addr(nid)), (SendFailed, msg), (NodeDown, nid), (NextBeat, 1.0)])
def test_direct_connection_is_tried_even_for_messages_arriving_thru_relay( t=Time, logic=DEFAULT_LOGIC, mouse=NID('mouse:123'), cat=NID('cat:123')): # this is kind of trivial to determine by looking at the code, but for completeness' sake, and to build up the # demonstration of some more advanced features (t, logic), msg = test_relayed_message_received(t, logic, mouse=mouse), object() emits_(logic.send_message(cat, msg, t.current), [(Connect, nid2addr(cat)), (Ping, OUT, cat, ANY)])
def test_send_message_with_an_existing_connection(t=Time, logic=DEFAULT_LOGIC, nid=NID('kaamel:123')): (t, logic), msg = test_successful_connect(t, logic, nid=nid), object() emits_(logic.send_message(nid, msg, t=t.current), [(Send, OUT, nid, ANY, msg)]) # and SendFailed not emitted emits_(logic.sig_disconnect_received(nid), [(Disconnect, nid2addr(nid)), (NodeDown, nid)])
def test_successful_connect(t=Time, logic=DEFAULT_LOGIC, nid=NID('kaamel:123')): t, logic = t(), logic() # connect emits_(logic.ensure_connected(nid, t=t.current), [(Connect, nid2addr(nid)), (Ping, OUT, nid, ANY)]) # ...successfully emits_(logic.ping_received(OUT, nid, 0, t=t.advance(by=2.5)), [(Ping, OUT, nid, ANY)]) return t, logic
def test_failed_connect(t=Time, logic=DEFAULT_LOGIC, nid=NID('kaamel:123')): t, logic = t(), logic() # connect emits_(logic.ensure_connected(nid, 0), [(Connect, nid2addr(nid)), (Ping, OUT, nid, ANY)]) # heartbeat not needed emits_(logic.heartbeat(t=t.current), [(NextBeat, 1.0)]) # ping emitted emits_(logic.heartbeat(t=t.advance(by=1.0)), [(Ping, OUT, nid, ANY), (NextBeat, 1.0)]) # ping emitted emits_(logic.heartbeat(t=t.advance(by=1.0)), [(Ping, OUT, nid, ANY), (NextBeat, 1.0)]) # disconnect occurs emits_(logic.heartbeat(t=t.advance(by=1.0)), [(Disconnect, nid2addr(nid)), (NodeDown, nid), (NextBeat, 1.0)]) # silence emits_(logic.heartbeat(t=t.advance(by=1.0)), [(NextBeat, 1.0)]) return t, logic
def test_relay_connect_is_retried_after_failed_connects(t=Time, logic=DEFAULT_LOGIC, bear=NID('bear:987'), mouse=NID('mouse:123')): t, logic = test_connect_fails_if_relayed_connect_fails(t, logic, bear=bear, mouse=mouse) emits_(logic.ensure_connected(mouse, t.current), [(Connect, nid2addr(mouse)), (Ping, OUT, mouse, ANY)]) emits_(logic.heartbeat(t.advance(logic.heartbeat_max_silence)), [(RelayConnect, OUT, bear, mouse), (Disconnect, nid2addr(mouse)), (NextBeat, 1.0)])
def test_relay_is_tried_on_bad_send(t=Time, logic=DEFAULT_LOGIC, bear=NID('bear:987'), mouse=NID('mouse:123')): t, logic, msg = t(), logic(), object() just_(logic.new_relay_received(bear)) emits_(logic.send_message(mouse, msg, t.current), [(Connect, nid2addr(mouse)), (Ping, OUT, mouse, ANY)]) emits_(logic.heartbeat(t.advance(logic.heartbeat_max_silence)), [(RelayConnect, OUT, bear, mouse), (Disconnect, nid2addr(mouse)), (NextBeat, 1.0)]) return t, logic, msg
def test_relay_propagates_on_outgoing_message(t=Time, logic=RELAY_LOGIC, mouse=NID('mouse:123')): t, logic, msg = t(), logic(), object() emits_(logic.send_message(mouse, msg, t.current), [(RelaySigNew, OUT, mouse), (Connect, nid2addr(mouse)), (Ping, OUT, mouse, ANY)])
def test_send_message_with_an_existing_connection(t=Time, logic=DEFAULT_LOGIC, nid=NID('kaamel:123')): (t, logic), msg = test_successful_connect(t, logic, nid=nid), object() emits_(logic.send_message(nid, msg, t=t.current), [(Send, OUT, nid, ANY, msg)]) # and SendFailed not emitted emits_(logic.sig_disconnect_received(nid), [(Disconnect, nid2addr(nid)), (NodeDown, nid)])
def test_send_message_with_no_previous_connection_and_sigdisconnect_response(t=Time, logic=DEFAULT_LOGIC, nid=NID('kaamel:123')): t, logic, msg = test_send_message_with_no_previous_connection(t, logic, nid=nid) emits_(logic.sig_disconnect_received(nid), [(Disconnect, nid2addr(nid)), (NodeDown, nid), (SendFailed, msg)])
def test_send_message_with_no_previous_connection_and_no_response(t=Time, logic=DEFAULT_LOGIC, nid=NID('kaamel:123')): t, logic, msg = test_send_message_with_no_previous_connection(t, logic, nid=nid) emits_(logic.heartbeat(t=t.advance(logic.heartbeat_max_silence)), [(Disconnect, nid2addr(nid)), (SendFailed, msg), (NodeDown, nid), (NextBeat, 1.0)])
def test_send_message_with_no_previous_connection(t=Time, logic=DEFAULT_LOGIC, nid=NID('kaamel:123')): t, logic, msg = t(), logic(), object() emits_(logic.send_message(nid, msg, t=t.current), [(Connect, nid2addr(nid)), (Ping, OUT, nid, ANY)]) return t, logic, msg
def test_direct_connection_is_tried_even_for_messages_arriving_thru_relay(t=Time, logic=DEFAULT_LOGIC, mouse=NID('mouse:123'), cat=NID('cat:123')): # this is kind of trivial to determine by looking at the code, but for completeness' sake, and to build up the # demonstration of some more advanced features (t, logic), msg = test_relayed_message_received(t, logic, mouse=mouse), object() emits_(logic.send_message(cat, msg, t.current), [(Connect, nid2addr(cat)), (Ping, OUT, cat, ANY)])
def test_sig_disconnect_while_still_connecting(t=Time, logic=DEFAULT_LOGIC, nid=NID('kaamel:123')): t, logic = test_successful_connect(t, logic) emits_(logic.sig_disconnect_received(nid), [(Disconnect, nid2addr(nid)), (NodeDown, nid)])
def test_fail_after_successful_connection(t=Time, logic=DEFAULT_LOGIC, nid=NID('kaamel:123')): t, logic = test_successful_connect(t, logic) emits_(logic.heartbeat(t=t.advance(logic.heartbeat_max_silence)), [(NextBeat, 1.0), (Disconnect, nid2addr(nid)), (NodeDown, nid)])
def test_sig_disconnect_while_still_connecting(t=Time, logic=DEFAULT_LOGIC, nid=NID('kaamel:123')): t, logic = test_successful_connect(t, logic) emits_(logic.sig_disconnect_received(nid), [(Disconnect, nid2addr(nid)), (NodeDown, nid)])
def test_fail_after_successful_connection(t=Time, logic=DEFAULT_LOGIC, nid=NID('kaamel:123')): t, logic = test_successful_connect(t, logic) emits_(logic.heartbeat(t=t.advance(logic.heartbeat_max_silence)), [(NextBeat, 1.0), (Disconnect, nid2addr(nid)), (NodeDown, nid)])