107 lines
3.4 KiB
Python
107 lines
3.4 KiB
Python
#!/usr/bin/env python3
|
|
"""Audit the native networking/client lifecycle milestone boundary."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
import re
|
|
|
|
import generate_api_shims
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
OWNED_SOURCES = (
|
|
"caps.rs",
|
|
"caps_http.rs",
|
|
"client_core.rs",
|
|
"download_manager.rs",
|
|
"event_queue.rs",
|
|
"login.rs",
|
|
"network_manager.rs",
|
|
"sim_stats.rs",
|
|
"udp_transport.rs",
|
|
)
|
|
REQUIRED_NATIVE_TYPES = {
|
|
"T:LibreMetaverse.Caps",
|
|
"T:LibreMetaverse.GridClient",
|
|
"T:LibreMetaverse.Http.DownloadManager",
|
|
"T:LibreMetaverse.Http.EventQueueClient",
|
|
"T:LibreMetaverse.HttpCapsClient",
|
|
"T:LibreMetaverse.NetworkManager",
|
|
"T:LibreMetaverse.Settings",
|
|
"T:LibreMetaverse.Simulator",
|
|
"T:LibreMetaverse.Simulator.SimStats",
|
|
"T:LibreMetaverse.UDPBase",
|
|
"T:LibreMetaverse.UDPPacketBuffer",
|
|
}
|
|
STUB_RE = re.compile(r"\b(?:not_implemented|unimplemented_api)\b|\b(?:todo|unimplemented)!\s*\(")
|
|
|
|
|
|
def check_owned_sources() -> None:
|
|
source_root = ROOT / "crates" / "libremetaverse" / "src"
|
|
offenders = [
|
|
name for name in OWNED_SOURCES if STUB_RE.search((source_root / name).read_text())
|
|
]
|
|
if offenders:
|
|
raise SystemExit("milestone 08 owned Rust stubs remain: " + ", ".join(offenders))
|
|
|
|
|
|
def check_native_mapping() -> None:
|
|
native = generate_api_shims.NATIVE_TYPES.keys() | generate_api_shims.NATIVE_DECLARATIONS.keys()
|
|
missing = sorted(REQUIRED_NATIVE_TYPES - native)
|
|
if missing:
|
|
raise SystemExit("milestone 08 native type mappings missing: " + ", ".join(missing))
|
|
|
|
|
|
def check_fake_grid_gate() -> None:
|
|
tests = (ROOT / "crates" / "libremetaverse" / "tests" / "network_manager.rs").read_text()
|
|
required_evidence = (
|
|
"offline_fake_grid_drives_the_complete_networking_lifecycle_without_task_leaks",
|
|
"EventQueueGet",
|
|
"active_download_count",
|
|
"dispatcher_running",
|
|
"get_recv_packets",
|
|
"get_sent_packets",
|
|
"seed-secret",
|
|
"queue-secret",
|
|
"asset-secret",
|
|
)
|
|
missing = [marker for marker in required_evidence if marker not in tests]
|
|
if missing:
|
|
raise SystemExit("fake-grid audit evidence missing: " + ", ".join(missing))
|
|
|
|
|
|
def check_bounded_policies() -> None:
|
|
expectations = {
|
|
"caps_http.rs": ("CapsHttpLimits", "max_redirects", "max_response_bytes"),
|
|
"download_manager.rs": ("DOWNLOAD_QUEUE_CAPACITY", "MAX_PARALLEL_DOWNLOADS"),
|
|
"event_queue.rs": ("EventQueuePolicy", "max_events_per_response", "max_event_nodes"),
|
|
"udp_transport.rs": (
|
|
"UdpTransportConfig",
|
|
"receive_queue_capacity",
|
|
"command_queue_capacity",
|
|
"write_queue_capacity",
|
|
),
|
|
}
|
|
source_root = ROOT / "crates" / "libremetaverse" / "src"
|
|
for name, markers in expectations.items():
|
|
source = (source_root / name).read_text()
|
|
missing = [marker for marker in markers if marker not in source]
|
|
if missing:
|
|
raise SystemExit(f"{name}: bounded policy evidence missing: " + ", ".join(missing))
|
|
|
|
|
|
def main() -> None:
|
|
check_owned_sources()
|
|
check_native_mapping()
|
|
check_fake_grid_gate()
|
|
check_bounded_policies()
|
|
print(
|
|
"milestone 08 audit: native networking sources contain no stubs; "
|
|
"fake-grid lifecycle, redaction, task cleanup, statistics, and bounded policies are present"
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|