OrangePi3588Media/tests/test_render_config.py

194 lines
6.5 KiB
Python

import importlib.util
import pathlib
import sys
import tempfile
import unittest
REPO_ROOT = pathlib.Path(__file__).resolve().parents[1]
SCRIPT_PATH = REPO_ROOT / "tools" / "render_config.py"
def load_module():
spec = importlib.util.spec_from_file_location("render_config", SCRIPT_PATH)
module = importlib.util.module_from_spec(spec)
sys.modules[spec.name] = module
spec.loader.exec_module(module)
return module
class RenderConfigTest(unittest.TestCase):
def test_renders_profile_and_overlay(self):
module = load_module()
template = {
"name": "pipeline",
"template": {
"executor": {"batch_size": 2},
"nodes": [
{"id": "in", "type": "input_rtsp", "url": "${rtsp_url}"},
{"id": "face_recog", "type": "ai_face_recog", "debug": {"enabled": False}},
],
"edges": [["in", "face_recog"]],
},
}
profile = {
"queue": {"size": 8},
"instances": [
{
"name": "cam1",
"params": {"rtsp_url": "rtsp://example/cam1"},
}
],
}
overlay = {
"instance_overrides": {
"*": {
"override": {
"nodes": {
"face_recog": {"debug": {"enabled": True, "log_matches": True}}
}
}
}
}
}
root = {
"templates": {module.template_name(template, pathlib.Path("x.json")): module.template_body(template)},
"instances": module.profile_instances(profile, "pipeline"),
"queue": profile["queue"],
}
rendered = module.apply_overlay(root, overlay)
self.assertEqual(rendered["queue"]["size"], 8)
self.assertEqual(rendered["instances"][0]["template"], "pipeline")
self.assertEqual(rendered["instances"][0]["params"]["rtsp_url"], "rtsp://example/cam1")
node_override = rendered["instances"][0]["override"]["nodes"]["face_recog"]
self.assertTrue(node_override["debug"]["enabled"])
self.assertTrue(node_override["debug"]["log_matches"])
def test_render_applies_multiple_overlays_in_order(self):
module = load_module()
with tempfile.TemporaryDirectory() as tmp_dir:
tmp = pathlib.Path(tmp_dir)
template_path = tmp / "template.json"
profile_path = tmp / "profile.json"
overlay1_path = tmp / "overlay1.json"
overlay2_path = tmp / "overlay2.json"
template_path.write_text(
"""
{
"name": "pipeline",
"template": {
"nodes": [{"id": "alarm", "type": "alarm"}],
"edges": []
}
}
""",
encoding="utf-8",
)
profile_path.write_text(
"""
{
"instances": [{"name": "cam1", "params": {}}]
}
""",
encoding="utf-8",
)
overlay1_path.write_text(
"""
{
"instance_overrides": {
"*": {
"override": {
"nodes": {
"alarm": {
"face_debug": {"log_unknown_candidates": true},
"rules": [{"name": "shoe", "cooldown_ms": 1000}]
}
}
}
}
}
}
""",
encoding="utf-8",
)
overlay2_path.write_text(
"""
{
"instance_overrides": {
"*": {
"override": {
"nodes": {
"alarm": {
"face_debug": {"unknown_candidate_interval_ms": 0},
"rules": [{"name": "shoe", "cooldown_ms": 15000}]
}
}
}
}
}
}
""",
encoding="utf-8",
)
rendered = module.render(template_path, profile_path, [overlay1_path, overlay2_path])
alarm = rendered["instances"][0]["override"]["nodes"]["alarm"]
self.assertTrue(alarm["face_debug"]["log_unknown_candidates"])
self.assertEqual(alarm["face_debug"]["unknown_candidate_interval_ms"], 0)
self.assertEqual(alarm["rules"][0]["cooldown_ms"], 15000)
def test_render_adds_trace_metadata_when_requested(self):
module = load_module()
with tempfile.TemporaryDirectory() as tmp_dir:
tmp = pathlib.Path(tmp_dir)
template_path = tmp / "template.json"
profile_path = tmp / "profile.json"
template_path.write_text(
"""
{
"name": "pipeline",
"template": {
"nodes": [{"id": "in", "type": "input_rtsp"}],
"edges": []
}
}
""",
encoding="utf-8",
)
profile_path.write_text(
"""
{
"name": "cam1",
"params": {"rtsp_url": "rtsp://example/cam1"}
}
""",
encoding="utf-8",
)
rendered = module.render(
template_path,
profile_path,
[],
metadata={
"config_id": "local_3588_face_debug",
"config_version": "20260419.001",
"rendered_at": "2026-04-19T00:00:00Z",
"rendered_by": "test",
},
)
self.assertEqual(rendered["metadata"]["config_id"], "local_3588_face_debug")
self.assertEqual(rendered["metadata"]["config_version"], "20260419.001")
self.assertEqual(rendered["metadata"]["template"], "pipeline")
self.assertEqual(rendered["metadata"]["profile"], "cam1")
self.assertEqual(rendered["metadata"]["overlays"], [])
self.assertEqual(rendered["metadata"]["rendered_by"], "test")
if __name__ == "__main__":
unittest.main()