"""Tests for I2NP tunnel message types.""" import os import struct import pytest class TestTunnelDataMessage: def test_construct(self): from i2p_data.i2np_tunnel import TunnelDataMessage data = os.urandom(1024) msg = TunnelDataMessage(tunnel_id=12345, data=data) assert msg.tunnel_id == 12345 assert msg.data == data assert msg.TYPE == 18 def test_body_size(self): from i2p_data.i2np_tunnel import TunnelDataMessage msg = TunnelDataMessage(tunnel_id=1, data=os.urandom(1024)) assert len(msg.body_bytes()) == 4 + 1024 def test_roundtrip(self): from i2p_data.i2np import I2NPMessage from i2p_data.i2np_tunnel import TunnelDataMessage data = os.urandom(1024) msg = TunnelDataMessage(tunnel_id=0xDEAD, data=data) wire = msg.to_bytes() msg2 = I2NPMessage.from_bytes(wire) assert isinstance(msg2, TunnelDataMessage) assert msg2.tunnel_id == 0xDEAD assert msg2.data == data class TestTunnelGatewayMessage: def test_construct(self): from i2p_data.i2np_tunnel import TunnelGatewayMessage payload = b"gateway payload" msg = TunnelGatewayMessage(tunnel_id=999, data=payload) assert msg.tunnel_id == 999 assert msg.data == payload assert msg.TYPE == 19 def test_body_format(self): from i2p_data.i2np_tunnel import TunnelGatewayMessage payload = b"test" msg = TunnelGatewayMessage(tunnel_id=1, data=payload) body = msg.body_bytes() tid = struct.unpack("!I", body[:4])[0] length = struct.unpack("!H", body[4:6])[0] assert tid == 1 assert length == 4 assert body[6:] == payload def test_roundtrip(self): from i2p_data.i2np import I2NPMessage from i2p_data.i2np_tunnel import TunnelGatewayMessage payload = os.urandom(200) msg = TunnelGatewayMessage(tunnel_id=5555, data=payload) wire = msg.to_bytes() msg2 = I2NPMessage.from_bytes(wire) assert isinstance(msg2, TunnelGatewayMessage) assert msg2.tunnel_id == 5555 assert msg2.data == payload class TestTunnelBuildMessage: def test_construct(self): from i2p_data.i2np_tunnel import TunnelBuildMessage records = [os.urandom(528) for _ in range(8)] msg = TunnelBuildMessage(records=records) assert msg.TYPE == 21 assert len(msg.records) == 8 def test_record_count_validation(self): from i2p_data.i2np_tunnel import TunnelBuildMessage with pytest.raises(ValueError): TunnelBuildMessage(records=[os.urandom(528) for _ in range(7)]) def test_body_size(self): from i2p_data.i2np_tunnel import TunnelBuildMessage msg = TunnelBuildMessage(records=[os.urandom(528) for _ in range(8)]) assert len(msg.body_bytes()) == 8 * 528 def test_roundtrip(self): from i2p_data.i2np import I2NPMessage from i2p_data.i2np_tunnel import TunnelBuildMessage records = [os.urandom(528) for _ in range(8)] msg = TunnelBuildMessage(records=records) wire = msg.to_bytes() msg2 = I2NPMessage.from_bytes(wire) assert isinstance(msg2, TunnelBuildMessage) for i in range(8): assert msg2.records[i] == records[i] class TestTunnelBuildReplyMessage: def test_construct(self): from i2p_data.i2np_tunnel import TunnelBuildReplyMessage records = [os.urandom(528) for _ in range(8)] msg = TunnelBuildReplyMessage(records=records) assert msg.TYPE == 22 def test_roundtrip(self): from i2p_data.i2np import I2NPMessage from i2p_data.i2np_tunnel import TunnelBuildReplyMessage records = [os.urandom(528) for _ in range(8)] msg = TunnelBuildReplyMessage(records=records) wire = msg.to_bytes() msg2 = I2NPMessage.from_bytes(wire) assert isinstance(msg2, TunnelBuildReplyMessage) assert len(msg2.records) == 8 class TestVariableTunnelBuildMessage: def test_construct(self): from i2p_data.i2np_tunnel import VariableTunnelBuildMessage records = [os.urandom(528) for _ in range(3)] msg = VariableTunnelBuildMessage(records=records) assert msg.TYPE == 23 assert len(msg.records) == 3 def test_roundtrip_various_counts(self): from i2p_data.i2np import I2NPMessage from i2p_data.i2np_tunnel import VariableTunnelBuildMessage for n in [1, 4, 8]: records = [os.urandom(528) for _ in range(n)] msg = VariableTunnelBuildMessage(records=records) wire = msg.to_bytes() msg2 = I2NPMessage.from_bytes(wire) assert isinstance(msg2, VariableTunnelBuildMessage) assert len(msg2.records) == n def test_body_format(self): from i2p_data.i2np_tunnel import VariableTunnelBuildMessage records = [os.urandom(528) for _ in range(5)] msg = VariableTunnelBuildMessage(records=records) body = msg.body_bytes() assert body[0] == 5 # record count byte assert len(body) == 1 + 5 * 528 class TestVariableTunnelBuildReplyMessage: def test_construct(self): from i2p_data.i2np_tunnel import VariableTunnelBuildReplyMessage records = [os.urandom(528) for _ in range(2)] msg = VariableTunnelBuildReplyMessage(records=records) assert msg.TYPE == 24 def test_roundtrip(self): from i2p_data.i2np import I2NPMessage from i2p_data.i2np_tunnel import VariableTunnelBuildReplyMessage records = [os.urandom(528) for _ in range(6)] msg = VariableTunnelBuildReplyMessage(records=records) wire = msg.to_bytes() msg2 = I2NPMessage.from_bytes(wire) assert isinstance(msg2, VariableTunnelBuildReplyMessage) assert len(msg2.records) == 6 for i in range(6): assert msg2.records[i] == records[i]