from __future__ import annotations import itertools import random import struct import unittest from typing import * import lazy_object_proxy from hippolyzer.lib.base.datatypes import UUID from hippolyzer.lib.base.message.message import Block, Message from hippolyzer.lib.base.message.udpdeserializer import UDPMessageDeserializer from hippolyzer.lib.base.objects import Object from hippolyzer.lib.proxy.addon_utils import BaseAddon from hippolyzer.lib.proxy.addons import AddonManager from hippolyzer.lib.proxy.message_logger import FilteringMessageLogger, LLUDPMessageLogEntry from hippolyzer.lib.base.network.transport import Direction from hippolyzer.lib.proxy.region import ProxiedRegion from hippolyzer.lib.proxy.sessions import Session from hippolyzer.lib.proxy.test_utils import BaseProxyTest UNKNOWN_PACKET = b'\x00\x00\x00\x00E\x00\xff\xf0\x00\xff\xff\xff\xff\x00' class MockAddon(BaseAddon): def __init__(self): self.events = [] def handle_session_init(self, session: Session): self.events.append(("session_init", session.id)) def handle_lludp_message(self, session: Session, region: ProxiedRegion, message: Message): self.events.append(("lludp", session.id, region.circuit_addr, message.name)) if message.name == "UndoLand": # Simulate a message being taken out of the regular proxying flow message.take() return True def handle_object_updated(self, session: Session, region: ProxiedRegion, obj: Object, updated_props: Set[str], msg: Optional[Message]): self.events.append(("object_update", session.id, region.circuit_addr, obj.LocalID, updated_props)) class SimpleMessageLogger(FilteringMessageLogger): @property def entries(self): return self._filtered_entries class LLUDPIntegrationTests(BaseProxyTest): async def asyncSetUp(self) -> None: await super().asyncSetUp() self.addon = MockAddon() self.deserializer = UDPMessageDeserializer() AddonManager.init([], self.session_manager, [self.addon]) def _make_objectupdate_compressed(self, localid: Optional[int] = None, handle: Optional[int] = 123): if localid is None: localid = random.getrandbits(32) return b'\x00\x00\x00\x0c\xba\x00\r' + struct.pack("