"""Tests for I2CP message handler/dispatcher.""" import os import pytest class TestMessageHandler: def test_register_and_dispatch(self): from i2p_client.handler import MessageHandler from i2p_client.i2cp_messages import SessionStatusMessage results = [] handler = MessageHandler() handler.register(SessionStatusMessage.TYPE, lambda msg: results.append(msg)) msg = SessionStatusMessage(session_id=1, status=0) handler.dispatch(msg) assert len(results) == 1 assert results[0].session_id == 1 def test_dispatch_unregistered_type(self): from i2p_client.handler import MessageHandler from i2p_client.i2cp_messages import GetDateMessage handler = MessageHandler() # Should not raise, just ignore handler.dispatch(GetDateMessage(version="0.9.62")) def test_multiple_handlers_same_type(self): from i2p_client.handler import MessageHandler from i2p_client.i2cp_messages import SetDateMessage r1, r2 = [], [] handler = MessageHandler() handler.register(SetDateMessage.TYPE, lambda msg: r1.append(msg)) handler.register(SetDateMessage.TYPE, lambda msg: r2.append(msg)) handler.dispatch(SetDateMessage(date_ms=1000, version="0.9")) assert len(r1) == 1 assert len(r2) == 1 def test_dispatch_from_wire(self): from i2p_client.handler import MessageHandler from i2p_client.i2cp_messages import I2CPMessage, DestroySessionMessage results = [] handler = MessageHandler() handler.register(DestroySessionMessage.TYPE, lambda msg: results.append(msg)) msg = DestroySessionMessage(session_id=99) wire = msg.to_wire() parsed = I2CPMessage.from_wire(wire) handler.dispatch(parsed) assert len(results) == 1 assert results[0].session_id == 99 class TestRequestReplyManager: def test_correlate_request_reply(self): from i2p_client.handler import RequestReplyManager mgr = RequestReplyManager() future = mgr.register_request(42) assert not future.done mgr.handle_reply(42, "the reply") assert future.done assert future.result == "the reply" def test_unknown_reply_ignored(self): from i2p_client.handler import RequestReplyManager mgr = RequestReplyManager() # Should not raise mgr.handle_reply(999, "orphan") def test_multiple_requests(self): from i2p_client.handler import RequestReplyManager mgr = RequestReplyManager() f1 = mgr.register_request(1) f2 = mgr.register_request(2) mgr.handle_reply(2, "second") mgr.handle_reply(1, "first") assert f1.result == "first" assert f2.result == "second" def test_cancel_request(self): from i2p_client.handler import RequestReplyManager mgr = RequestReplyManager() future = mgr.register_request(10) mgr.cancel(10) assert future.cancelled def test_cancel_nonexistent(self): from i2p_client.handler import RequestReplyManager mgr = RequestReplyManager() # Should not raise mgr.cancel(999)