fix(lab): stream synchronized replay fragments
This commit is contained in:
+45
-19
@@ -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)}"
|
||||
|
||||
Reference in New Issue
Block a user