|
@@ -1,10 +1,13 @@
|
|
|
-import json
|
|
|
-from unittest import TestCase, main
|
|
|
-import voluptuous as vol
|
|
|
-from frigate.config import FRIGATE_CONFIG_SCHEMA, FrigateConfig
|
|
|
+import unittest
|
|
|
+import numpy as np
|
|
|
+from pydantic import ValidationError
|
|
|
+from frigate.config import (
|
|
|
+ FrigateConfig,
|
|
|
+ DetectorTypeEnum,
|
|
|
+)
|
|
|
|
|
|
|
|
|
-class TestConfig(TestCase):
|
|
|
+class TestConfig(unittest.TestCase):
|
|
|
def setUp(self):
|
|
|
self.minimal = {
|
|
|
"mqtt": {"host": "mqtt"},
|
|
@@ -21,14 +24,30 @@ class TestConfig(TestCase):
|
|
|
},
|
|
|
}
|
|
|
|
|
|
- def test_empty(self):
|
|
|
- FRIGATE_CONFIG_SCHEMA({})
|
|
|
+ def test_config_class(self):
|
|
|
+ frigate_config = FrigateConfig(**self.minimal)
|
|
|
+ assert self.minimal == frigate_config.dict(exclude_unset=True)
|
|
|
|
|
|
- def test_minimal(self):
|
|
|
- FRIGATE_CONFIG_SCHEMA(self.minimal)
|
|
|
+ runtime_config = frigate_config.runtime_config
|
|
|
+ assert "coral" in runtime_config.detectors.keys()
|
|
|
+ assert runtime_config.detectors["coral"].type == DetectorTypeEnum.edgetpu
|
|
|
|
|
|
- def test_config_class(self):
|
|
|
- FrigateConfig(config=self.minimal)
|
|
|
+ def test_invalid_mqtt_config(self):
|
|
|
+ config = {
|
|
|
+ "mqtt": {"host": "mqtt", "user": "test"},
|
|
|
+ "cameras": {
|
|
|
+ "back": {
|
|
|
+ "ffmpeg": {
|
|
|
+ "inputs": [
|
|
|
+ {"path": "rtsp://10.0.0.1:554/video", "roles": ["detect"]}
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ "height": 1080,
|
|
|
+ "width": 1920,
|
|
|
+ }
|
|
|
+ },
|
|
|
+ }
|
|
|
+ self.assertRaises(ValidationError, lambda: FrigateConfig(**config))
|
|
|
|
|
|
def test_inherit_tracked_objects(self):
|
|
|
config = {
|
|
@@ -46,8 +65,11 @@ class TestConfig(TestCase):
|
|
|
}
|
|
|
},
|
|
|
}
|
|
|
- frigate_config = FrigateConfig(config=config)
|
|
|
- assert "dog" in frigate_config.cameras["back"].objects.track
|
|
|
+ frigate_config = FrigateConfig(**config)
|
|
|
+ assert config == frigate_config.dict(exclude_unset=True)
|
|
|
+
|
|
|
+ runtime_config = frigate_config.runtime_config
|
|
|
+ assert "dog" in runtime_config.cameras["back"].objects.track
|
|
|
|
|
|
def test_override_tracked_objects(self):
|
|
|
config = {
|
|
@@ -66,8 +88,11 @@ class TestConfig(TestCase):
|
|
|
}
|
|
|
},
|
|
|
}
|
|
|
- frigate_config = FrigateConfig(config=config)
|
|
|
- assert "cat" in frigate_config.cameras["back"].objects.track
|
|
|
+ frigate_config = FrigateConfig(**config)
|
|
|
+ assert config == frigate_config.dict(exclude_unset=True)
|
|
|
+
|
|
|
+ runtime_config = frigate_config.runtime_config
|
|
|
+ assert "cat" in runtime_config.cameras["back"].objects.track
|
|
|
|
|
|
def test_default_object_filters(self):
|
|
|
config = {
|
|
@@ -85,8 +110,11 @@ class TestConfig(TestCase):
|
|
|
}
|
|
|
},
|
|
|
}
|
|
|
- frigate_config = FrigateConfig(config=config)
|
|
|
- assert "dog" in frigate_config.cameras["back"].objects.filters
|
|
|
+ frigate_config = FrigateConfig(**config)
|
|
|
+ assert config == frigate_config.dict(exclude_unset=True)
|
|
|
+
|
|
|
+ runtime_config = frigate_config.runtime_config
|
|
|
+ assert "dog" in runtime_config.cameras["back"].objects.filters
|
|
|
|
|
|
def test_inherit_object_filters(self):
|
|
|
config = {
|
|
@@ -107,9 +135,12 @@ class TestConfig(TestCase):
|
|
|
}
|
|
|
},
|
|
|
}
|
|
|
- frigate_config = FrigateConfig(config=config)
|
|
|
- assert "dog" in frigate_config.cameras["back"].objects.filters
|
|
|
- assert frigate_config.cameras["back"].objects.filters["dog"].threshold == 0.7
|
|
|
+ frigate_config = FrigateConfig(**config)
|
|
|
+ assert config == frigate_config.dict(exclude_unset=True)
|
|
|
+
|
|
|
+ runtime_config = frigate_config.runtime_config
|
|
|
+ assert "dog" in runtime_config.cameras["back"].objects.filters
|
|
|
+ assert runtime_config.cameras["back"].objects.filters["dog"].threshold == 0.7
|
|
|
|
|
|
def test_override_object_filters(self):
|
|
|
config = {
|
|
@@ -130,9 +161,12 @@ class TestConfig(TestCase):
|
|
|
}
|
|
|
},
|
|
|
}
|
|
|
- frigate_config = FrigateConfig(config=config)
|
|
|
- assert "dog" in frigate_config.cameras["back"].objects.filters
|
|
|
- assert frigate_config.cameras["back"].objects.filters["dog"].threshold == 0.7
|
|
|
+ frigate_config = FrigateConfig(**config)
|
|
|
+ assert config == frigate_config.dict(exclude_unset=True)
|
|
|
+
|
|
|
+ runtime_config = frigate_config.runtime_config
|
|
|
+ assert "dog" in runtime_config.cameras["back"].objects.filters
|
|
|
+ assert runtime_config.cameras["back"].objects.filters["dog"].threshold == 0.7
|
|
|
|
|
|
def test_global_object_mask(self):
|
|
|
config = {
|
|
@@ -154,12 +188,14 @@ class TestConfig(TestCase):
|
|
|
}
|
|
|
},
|
|
|
}
|
|
|
- frigate_config = FrigateConfig(config=config)
|
|
|
- assert "dog" in frigate_config.cameras["back"].objects.filters
|
|
|
- assert len(frigate_config.cameras["back"].objects.filters["dog"].raw_mask) == 2
|
|
|
- assert (
|
|
|
- len(frigate_config.cameras["back"].objects.filters["person"].raw_mask) == 1
|
|
|
- )
|
|
|
+ frigate_config = FrigateConfig(**config)
|
|
|
+ assert config == frigate_config.dict(exclude_unset=True)
|
|
|
+
|
|
|
+ runtime_config = frigate_config.runtime_config
|
|
|
+ back_camera = runtime_config.cameras["back"]
|
|
|
+ assert "dog" in back_camera.objects.filters
|
|
|
+ assert len(back_camera.objects.filters["dog"].raw_mask) == 2
|
|
|
+ assert len(back_camera.objects.filters["person"].raw_mask) == 1
|
|
|
|
|
|
def test_ffmpeg_params_global(self):
|
|
|
config = {
|
|
@@ -181,8 +217,11 @@ class TestConfig(TestCase):
|
|
|
}
|
|
|
},
|
|
|
}
|
|
|
- frigate_config = FrigateConfig(config=config)
|
|
|
- assert "-re" in frigate_config.cameras["back"].ffmpeg_cmds[0]["cmd"]
|
|
|
+ frigate_config = FrigateConfig(**config)
|
|
|
+ assert config == frigate_config.dict(exclude_unset=True)
|
|
|
+
|
|
|
+ runtime_config = frigate_config.runtime_config
|
|
|
+ assert "-re" in runtime_config.cameras["back"].ffmpeg_cmds[0]["cmd"]
|
|
|
|
|
|
def test_ffmpeg_params_camera(self):
|
|
|
config = {
|
|
@@ -204,8 +243,11 @@ class TestConfig(TestCase):
|
|
|
}
|
|
|
},
|
|
|
}
|
|
|
- frigate_config = FrigateConfig(config=config)
|
|
|
- assert "-re" in frigate_config.cameras["back"].ffmpeg_cmds[0]["cmd"]
|
|
|
+ frigate_config = FrigateConfig(**config)
|
|
|
+ assert config == frigate_config.dict(exclude_unset=True)
|
|
|
+
|
|
|
+ runtime_config = frigate_config.runtime_config
|
|
|
+ assert "-re" in runtime_config.cameras["back"].ffmpeg_cmds[0]["cmd"]
|
|
|
|
|
|
def test_ffmpeg_params_input(self):
|
|
|
config = {
|
|
@@ -230,8 +272,11 @@ class TestConfig(TestCase):
|
|
|
}
|
|
|
},
|
|
|
}
|
|
|
- frigate_config = FrigateConfig(config=config)
|
|
|
- assert "-re" in frigate_config.cameras["back"].ffmpeg_cmds[0]["cmd"]
|
|
|
+ frigate_config = FrigateConfig(**config)
|
|
|
+ assert config == frigate_config.dict(exclude_unset=True)
|
|
|
+
|
|
|
+ runtime_config = frigate_config.runtime_config
|
|
|
+ assert "-re" in runtime_config.cameras["back"].ffmpeg_cmds[0]["cmd"]
|
|
|
|
|
|
def test_inherit_clips_retention(self):
|
|
|
config = {
|
|
@@ -249,8 +294,11 @@ class TestConfig(TestCase):
|
|
|
}
|
|
|
},
|
|
|
}
|
|
|
- frigate_config = FrigateConfig(config=config)
|
|
|
- assert frigate_config.cameras["back"].clips.retain.objects["person"] == 30
|
|
|
+ frigate_config = FrigateConfig(**config)
|
|
|
+ assert config == frigate_config.dict(exclude_unset=True)
|
|
|
+
|
|
|
+ runtime_config = frigate_config.runtime_config
|
|
|
+ assert runtime_config.cameras["back"].clips.retain.objects["person"] == 30
|
|
|
|
|
|
def test_roles_listed_twice_throws_error(self):
|
|
|
config = {
|
|
@@ -269,7 +317,7 @@ class TestConfig(TestCase):
|
|
|
}
|
|
|
},
|
|
|
}
|
|
|
- self.assertRaises(vol.MultipleInvalid, lambda: FrigateConfig(config=config))
|
|
|
+ self.assertRaises(ValidationError, lambda: FrigateConfig(**config))
|
|
|
|
|
|
def test_zone_matching_camera_name_throws_error(self):
|
|
|
config = {
|
|
@@ -288,7 +336,33 @@ class TestConfig(TestCase):
|
|
|
}
|
|
|
},
|
|
|
}
|
|
|
- self.assertRaises(vol.MultipleInvalid, lambda: FrigateConfig(config=config))
|
|
|
+ self.assertRaises(ValidationError, lambda: FrigateConfig(**config))
|
|
|
+
|
|
|
+ def test_zone_assigns_color_and_contour(self):
|
|
|
+ config = {
|
|
|
+ "mqtt": {"host": "mqtt"},
|
|
|
+ "clips": {"retain": {"default": 20, "objects": {"person": 30}}},
|
|
|
+ "cameras": {
|
|
|
+ "back": {
|
|
|
+ "ffmpeg": {
|
|
|
+ "inputs": [
|
|
|
+ {"path": "rtsp://10.0.0.1:554/video", "roles": ["detect"]}
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ "height": 1080,
|
|
|
+ "width": 1920,
|
|
|
+ "zones": {"test": {"coordinates": "1,1,1,1,1,1"}},
|
|
|
+ }
|
|
|
+ },
|
|
|
+ }
|
|
|
+ frigate_config = FrigateConfig(**config)
|
|
|
+ assert config == frigate_config.dict(exclude_unset=True)
|
|
|
+
|
|
|
+ runtime_config = frigate_config.runtime_config
|
|
|
+ assert isinstance(
|
|
|
+ runtime_config.cameras["back"].zones["test"].contour, np.ndarray
|
|
|
+ )
|
|
|
+ assert runtime_config.cameras["back"].zones["test"].color != (0, 0, 0)
|
|
|
|
|
|
def test_clips_should_default_to_global_objects(self):
|
|
|
config = {
|
|
@@ -308,11 +382,16 @@ class TestConfig(TestCase):
|
|
|
}
|
|
|
},
|
|
|
}
|
|
|
- config = FrigateConfig(config=config)
|
|
|
- assert config.cameras["back"].clips.objects is None
|
|
|
+ frigate_config = FrigateConfig(**config)
|
|
|
+ assert config == frigate_config.dict(exclude_unset=True)
|
|
|
+
|
|
|
+ runtime_config = frigate_config.runtime_config
|
|
|
+ back_camera = runtime_config.cameras["back"]
|
|
|
+ assert back_camera.clips.objects is None
|
|
|
+ assert back_camera.clips.retain.objects["person"] == 30
|
|
|
|
|
|
def test_role_assigned_but_not_enabled(self):
|
|
|
- json_config = {
|
|
|
+ config = {
|
|
|
"mqtt": {"host": "mqtt"},
|
|
|
"cameras": {
|
|
|
"back": {
|
|
@@ -331,11 +410,14 @@ class TestConfig(TestCase):
|
|
|
},
|
|
|
}
|
|
|
|
|
|
- config = FrigateConfig(config=json_config)
|
|
|
- ffmpeg_cmds = config.cameras["back"].ffmpeg_cmds
|
|
|
+ frigate_config = FrigateConfig(**config)
|
|
|
+ assert config == frigate_config.dict(exclude_unset=True)
|
|
|
+
|
|
|
+ runtime_config = frigate_config.runtime_config
|
|
|
+ ffmpeg_cmds = runtime_config.cameras["back"].ffmpeg_cmds
|
|
|
assert len(ffmpeg_cmds) == 1
|
|
|
assert not "clips" in ffmpeg_cmds[0]["roles"]
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
- main(verbosity=2)
|
|
|
+ unittest.main(verbosity=2)
|