fix(lab): stream synchronized replay fragments

This commit is contained in:
DCCONSTRUCTIONS
2026-08-23 23:36:04 +03:00
parent a55ef475d9
commit a7caed70c1
9 changed files with 443 additions and 34 deletions
+45 -19
View File
@@ -194,10 +194,7 @@ async def render_file_response(
return {
"status": response.status_code,
"headers": response.raw_headers,
}, b"".join(
chunk.encode("utf-8") if isinstance(chunk, str) else chunk
for chunk in chunks
)
}, b"".join(chunk.encode("utf-8") if isinstance(chunk, str) else chunk for chunk in chunks)
sent: list[dict[str, Any]] = []
request_delivered = False
@@ -318,9 +315,7 @@ def test_session_router_exposes_immutable_lab_provenance(tmp_path: Path) -> None
assert item["lab"] == binding.as_dict()
assert [value["id"] for value in source_listing["items"]] == [source.name]
assert [value["id"] for value in laboratory_listing["items"]] == [
binding.session_id
]
assert [value["id"] for value in laboratory_listing["items"]] == [binding.session_id]
assert detail["lab"] == binding.as_dict()
assert item["lab"]["source_session_id"] == source.name
assert item["lab"]["provenance"]["source_payloads_mutated"] is False
@@ -1350,9 +1345,7 @@ def test_recorded_perception_endpoint_returns_one_complete_optional_overlay(
assert response.body == b"RRF2perception"
assert response.media_type == "application/vnd.rerun.rrd"
assert response.headers["content-length"] == str(len(response.body))
assert calls == [
(session.name, "nodedc_mission_core_recorded", "recording-001")
]
assert calls == [(session.name, "nodedc_mission_core_recorded", "recording-001")]
status_route = endpoint(
router,
"/api/v1/observation-sessions/{session_id}/perception/status",
@@ -1699,8 +1692,7 @@ def test_session_router_exposes_opaque_recorded_media_manifest_and_ranges(
render_file_response(stream_response, range_header=None)
)
stream_headers = {
key.decode("latin-1"): value.decode("latin-1")
for key, value in stream_start["headers"]
key.decode("latin-1"): value.decode("latin-1") for key, value in stream_start["headers"]
}
assert stream_start["status"] == 206
assert stream_body == init[-2:] + segment[:4]
@@ -1736,6 +1728,19 @@ def test_session_router_exposes_opaque_recorded_media_manifest_and_ranges(
assert init_start["status"] == 206
assert init_body == init[4:8]
generation_bound_init = init_route(
session_id=session.name,
artifact_id=artifact_id,
epoch_ordinal=1,
generation=generation,
range_header="bytes=0-3",
)
generation_init_start, generation_init_body = asyncio.run(
render_file_response(generation_bound_init, range_header=b"bytes=0-3")
)
assert generation_init_start["status"] == 206
assert generation_init_body == init[:4]
with pytest.raises(HTTPException) as stale_segment_generation:
segment_route(
session_id=session.name,
@@ -1768,6 +1773,31 @@ def test_session_router_exposes_opaque_recorded_media_manifest_and_ranges(
assert headers["content-length"] == "6"
assert headers["x-content-type-options"] == "nosniff"
generation_bound_segment = segment_route(
session_id=session.name,
artifact_id=artifact_id,
epoch_ordinal=1,
segment_sequence=1,
generation=generation,
range_header="bytes=0-3",
)
generation_segment_start, generation_segment_body = asyncio.run(
render_file_response(generation_bound_segment, range_header=b"bytes=0-3")
)
assert generation_segment_start["status"] == 206
assert generation_segment_body == segment[:4]
with pytest.raises(HTTPException) as stale_fragment_generation:
segment_route(
session_id=session.name,
artifact_id=artifact_id,
epoch_ordinal=1,
segment_sequence=1,
generation="0" * 64,
range_header=None,
)
assert stale_fragment_generation.value.status_code == 412
original_segment = writer.segments_dir / "1.m4s"
outside = tmp_path / "outside.m4s"
outside.write_bytes(segment)
@@ -1859,14 +1889,12 @@ def test_replay_exposes_generation_bound_perception_video_with_native_ranges(
)
manifest_route = endpoint(
router,
"/api/v1/observation-sessions/{session_id}/perception-media/"
"{result_id}/manifest",
"/api/v1/observation-sessions/{session_id}/perception-media/{result_id}/manifest",
"GET",
)
stream_route = endpoint(
router,
"/api/v1/observation-sessions/{session_id}/perception-media/"
"{result_id}/recording.mp4",
"/api/v1/observation-sessions/{session_id}/perception-media/{result_id}/recording.mp4",
"GET",
)
@@ -1929,9 +1957,7 @@ def test_replay_exposes_generation_bound_perception_video_with_native_ranges(
range_header="bytes=7-14",
)
start, body = asyncio.run(render_file_response(response, range_header=b"bytes=7-14"))
headers = {
key.decode("latin-1"): value.decode("latin-1") for key, value in start["headers"]
}
headers = {key.decode("latin-1"): value.decode("latin-1") for key, value in start["headers"]}
assert start["status"] == 206
assert body == video_payload[7:15]
assert headers["content-range"] == f"bytes 7-14/{len(video_payload)}"