160 lines
5.5 KiB
Python
160 lines
5.5 KiB
Python
"""DGR-042 seam tests with a deterministic fake generated worker."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from collections.abc import Iterator
|
|
import threading
|
|
|
|
import pytest
|
|
|
|
from meshnet_node.native_activation_seam import (
|
|
NATIVE_RELAY_PATH,
|
|
NativeActivationBufferFull,
|
|
NativeActivationDisconnected,
|
|
NativeActivationSeam,
|
|
NativeFrameContext,
|
|
)
|
|
from meshnet_node.native_protocol import pb
|
|
|
|
|
|
def _context(**changes: object) -> NativeFrameContext:
|
|
values: dict[str, object] = dict(
|
|
request_id="billing-request-7", node_id="node-tail", route_session_id="route-9",
|
|
route_epoch=4, work_id="work-3", deadline_unix_nanos=987654321,
|
|
)
|
|
values.update(changes)
|
|
return NativeFrameContext(**values)
|
|
|
|
|
|
def _open() -> pb.SessionRequest:
|
|
return pb.SessionRequest(open=pb.SessionOpen(
|
|
schema_version=pb.SCHEMA_VERSION_1, route_session_id="route-9", route_epoch=4,
|
|
))
|
|
|
|
|
|
def _chunk() -> pb.SessionRequest:
|
|
return pb.SessionRequest(chunk=pb.ActivationChunk(envelope=pb.Envelope(
|
|
schema_version=pb.SCHEMA_VERSION_1, route_session_id="route-9", route_epoch=4,
|
|
work_id="work-3", deadline_unix_nanos=987654321,
|
|
)))
|
|
|
|
|
|
def _ack(request: pb.SessionRequest) -> pb.SessionResponse:
|
|
if request.WhichOneof("kind") == "open":
|
|
return pb.SessionResponse(accepted=pb.SessionAccepted(
|
|
schema_version=pb.SCHEMA_VERSION_1, route_session_id="route-9", route_epoch=4,
|
|
))
|
|
route, epoch, work, _ = ("route-9", 4, "work-3", 0)
|
|
del route, epoch
|
|
return pb.SessionResponse(ack=pb.Ack(work_id=work, idempotency_step=1))
|
|
|
|
|
|
class _FakeGrpcWorker:
|
|
def __init__(self, *, block: bool = False) -> None:
|
|
self.calls = 0
|
|
self.received: list[pb.SessionRequest] = []
|
|
self.started = threading.Event()
|
|
self.consumed = threading.Event()
|
|
self.release = threading.Event()
|
|
self.block = block
|
|
|
|
def Session(self, requests: Iterator[pb.SessionRequest]):
|
|
self.calls += 1
|
|
self.started.set()
|
|
for request in requests:
|
|
self.received.append(request)
|
|
self.consumed.set()
|
|
if self.block:
|
|
self.release.wait(1)
|
|
yield _ack(request)
|
|
|
|
|
|
def test_direct_uses_one_long_lived_grpc_stream_and_preserves_correlation():
|
|
worker = _FakeGrpcWorker()
|
|
telemetry = []
|
|
seam = NativeActivationSeam(_context(), direct_stub=worker, telemetry=telemetry.append)
|
|
try:
|
|
seam.send(_open())
|
|
seam.send(_chunk())
|
|
assert seam.receive(1).WhichOneof("kind") == "accepted"
|
|
assert seam.receive(1).ack.work_id == "work-3"
|
|
assert worker.calls == 1
|
|
assert [frame.SerializeToString() for frame in worker.received] == [
|
|
_open().SerializeToString(), _chunk().SerializeToString()
|
|
]
|
|
assert telemetry[-1].request_id == "billing-request-7"
|
|
assert telemetry[-1].node_id == "node-tail"
|
|
finally:
|
|
seam.close()
|
|
|
|
|
|
def test_relay_carries_byte_identical_protobuf_frames_and_all_correlation_headers():
|
|
captured: list[tuple[str, bytes, dict[str, str]]] = []
|
|
|
|
def relay(path: str, body: bytes, headers: dict[str, str]):
|
|
captured.append((path, body, headers))
|
|
request = pb.SessionRequest()
|
|
request.ParseFromString(body)
|
|
return 200, {}, _ack(request).SerializeToString()
|
|
|
|
seam = NativeActivationSeam(_context(), relay_request=relay)
|
|
response = seam.send(_chunk())
|
|
assert response is not None and response.ack.work_id == "work-3"
|
|
path, body, headers = captured[0]
|
|
assert path == NATIVE_RELAY_PATH
|
|
assert body == _chunk().SerializeToString()
|
|
assert headers == {
|
|
"Content-Type": "application/x-protobuf", "X-Meshnet-Native-Frame": "shard-runtime/v1",
|
|
"X-Meshnet-Request-Id": "billing-request-7", "X-Meshnet-Node-Id": "node-tail",
|
|
"X-Meshnet-Session": "route-9", "X-Meshnet-Route-Epoch": "4",
|
|
"X-Meshnet-Work-Id": "work-3", "X-Meshnet-Deadline-Unix-Nanos": "987654321",
|
|
"X-Meshnet-Activation-Id": "billing-request-7",
|
|
}
|
|
|
|
|
|
def test_relay_disconnect_is_uncertain_and_is_never_replayed():
|
|
calls = 0
|
|
|
|
def disconnected(*_):
|
|
nonlocal calls
|
|
calls += 1
|
|
raise OSError("relay vanished")
|
|
|
|
seam = NativeActivationSeam(_context(), relay_request=disconnected)
|
|
with pytest.raises(NativeActivationDisconnected, match="uncertain"):
|
|
seam.send(_chunk())
|
|
with pytest.raises(NativeActivationDisconnected):
|
|
seam.send(_chunk())
|
|
assert calls == 1
|
|
|
|
|
|
def test_cancellation_uses_the_same_opaque_relay_contract():
|
|
received = []
|
|
|
|
def relay(_path, body, _headers):
|
|
request = pb.SessionRequest()
|
|
request.ParseFromString(body)
|
|
received.append(request)
|
|
return 200, {}, pb.SessionResponse(ack=pb.Ack(work_id="work-3")).SerializeToString()
|
|
|
|
seam = NativeActivationSeam(_context(), relay_request=relay)
|
|
response = seam.cancel("client disconnected")
|
|
assert response is not None
|
|
assert received[0].cancel.work_id == "work-3"
|
|
assert received[0].cancel.reason == "client disconnected"
|
|
|
|
|
|
def test_direct_request_buffer_is_bounded():
|
|
worker = _FakeGrpcWorker(block=True)
|
|
seam = NativeActivationSeam(_context(), direct_stub=worker, max_buffered_frames=1)
|
|
try:
|
|
assert worker.started.wait(1)
|
|
seam.send(_open())
|
|
assert worker.consumed.wait(1)
|
|
seam.send(_chunk())
|
|
with pytest.raises(NativeActivationBufferFull):
|
|
seam.send(_chunk())
|
|
finally:
|
|
worker.release.set()
|
|
seam.close()
|