Files
2026-07-13 13:05:14 +08:00

78 lines
2.3 KiB
Python

"""Test verifying that a binary stream works and produces valid identical RRDs."""
from __future__ import annotations
import queue
import subprocess
import tempfile
import threading
import time
from typing import TYPE_CHECKING, Any
import rerun as rr
import rerun.blueprint as rrb
if TYPE_CHECKING:
from collections.abc import Iterator
import pytest
@rr.thread_local_stream("rerun_example_binary_stream")
def job(name: str) -> Iterator[tuple[str, bytes | None]]:
stream = rr.binary_stream()
blueprint = rrb.Blueprint(rrb.TextLogView(name="My Logs", origin="test"))
rr.send_blueprint(blueprint)
for i in range(30):
time.sleep(0.01)
rr.log("test", rr.TextLog(f"Message {i}"))
yield (name, stream.read())
def queue_results(generator: Iterator[Any], out_queue: queue.Queue[tuple[str, bytes]]) -> None:
for item in generator:
out_queue.put(item)
def test_binary_stream(monkeypatch: pytest.MonkeyPatch) -> None:
# Flush num rows must be 0 to avoid inconsistencies in the stream.
# Use `monkeypatch` so the env var is reverted even if the test fails: leaking it pollutes the
# rest of the session (e.g. it gets inherited by the viewer spawned in the integration tests).
monkeypatch.setenv("RERUN_FLUSH_NUM_ROWS", "0")
results_queue: queue.Queue[tuple[str, bytes | None]] = queue.Queue()
threads = [
threading.Thread(target=queue_results, args=(job("A"), results_queue)),
threading.Thread(target=queue_results, args=(job("B"), results_queue)),
]
for t in threads:
t.start()
for t in threads:
t.join()
with tempfile.TemporaryDirectory() as tmpdir:
while not results_queue.empty():
name, data = results_queue.get()
assert data is not None
# Bump this value down when we have less overhead.
assert len(data) > 1000
with open(f"{tmpdir}/output_{name}.rrd", "a+b") as f:
f.write(data)
process = subprocess.run(
["rerun", "rrd", "compare", f"{tmpdir}/output_A.rrd", f"{tmpdir}/output_B.rrd"],
check=False,
capture_output=True,
)
if process.returncode != 0:
print(process.stderr.decode("utf-8"))
raise Exception("Rerun failed")