from __future__ import annotations import random import struct from typing import * import unittest import lazy_object_proxy from hippolyzer.lib.base.datatypes import UUID from hippolyzer.lib.base.message.message import Block 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 import ProxiedMessage from hippolyzer.lib.proxy.message_logger import FilteringMessageLogger from hippolyzer.lib.proxy.packets import ProxiedUDPPacket, Direction from hippolyzer.lib.proxy.region import ProxiedRegion from hippolyzer.lib.proxy.sessions import Session from . import BaseIntegrationTest 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: ProxiedMessage): self.events.append(("lludp", session.id, region.circuit_addr, message.name)) def handle_object_updated(self, session: Session, region: ProxiedRegion, obj: Object, updated_props: Set[str]): self.events.append(("object_update", session.id, region.circuit_addr, obj.LocalID)) class SimpleMessageLogger(FilteringMessageLogger): @property def entries(self): return self._filtered_entries class LLUDPIntegrationTests(BaseIntegrationTest): def setUp(self) -> None: super().setUp() self.addon = MockAddon() AddonManager.init([], self.session_manager, [self.addon]) def _make_objectupdate_compressed(self, localid: Optional[int] = None): if localid is None: localid = random.getrandbits(32) return b'\x00\x00\x00\x0c\xba\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x03\xd0\x04\x00\x10' \ b'\xe6\x00\x89UgG$\xcbC\xed\x92\x0bG\xca\xed\x15F_' + struct.pack("