From 05c7c66147ea8ac1544c42b794318d0b6d75ea77 Mon Sep 17 00:00:00 2001 From: YS Date: Wed, 5 Jan 2022 13:43:27 +0300 Subject: [PATCH] tox tests initial commit --- .github/workflows/pull_request.yml | 19 +++++++++++++++++++ frigate/app.py | 3 --- frigate/config.py | 5 ++++- frigate/test/README.md | 20 ++++++++++++++++++++ frigate/test/conftest.py | 26 ++++++++++++++++++++++++++ frigate/test/requirements.test.txt | 17 +++++++++++++++++ frigate/test/test_config.py | 4 ++-- frigate/test/test_reduce_boxes.py | 1 - tox.ini | 14 ++++++++++++++ 9 files changed, 102 insertions(+), 7 deletions(-) create mode 100644 frigate/test/README.md create mode 100644 frigate/test/conftest.py create mode 100644 frigate/test/requirements.test.txt create mode 100644 tox.ini diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 34e613aa6..b4a4e7201 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -44,3 +44,22 @@ jobs: - name: Test run: npm run test working-directory: ./web + + pytest: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ['3.8'] + + steps: + - uses: actions/checkout@v1 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + python -m pip install tox tox-gh-actions + - name: Test with tox + run: tox -e unittests diff --git a/frigate/app.py b/frigate/app.py index 792b1c712..a5f577b53 100644 --- a/frigate/app.py +++ b/frigate/app.py @@ -77,9 +77,6 @@ class FrigateApp: self.config = user_config.runtime_config for camera_name in self.config.cameras.keys(): - # generage the ffmpeg commands - self.config.cameras[camera_name].create_ffmpeg_cmds() - # create camera_metrics self.camera_metrics[camera_name] = { "camera_fps": mp.Value("d", 0.0), diff --git a/frigate/config.py b/frigate/config.py index 1973913c9..a78c0f3a5 100644 --- a/frigate/config.py +++ b/frigate/config.py @@ -537,6 +537,8 @@ class CameraConfig(FrigateBaseModel): return self._ffmpeg_cmds def create_ffmpeg_cmds(self): + if "_ffmpeg_cmds" in self: + return ffmpeg_cmds = [] for ffmpeg_input in self.ffmpeg.inputs: ffmpeg_cmd = self._get_ffmpeg_cmd(ffmpeg_input) @@ -845,7 +847,8 @@ class FrigateConfig(FrigateBaseModel): logger.warning( f"Recording retention is configured for {camera_config.record.retain.mode} and event retention is configured for {camera_config.record.events.retain.mode}. The more restrictive retention policy will be applied." ) - + # generage the ffmpeg commands + camera_config.create_ffmpeg_cmds() config.cameras[name] = camera_config return config diff --git a/frigate/test/README.md b/frigate/test/README.md new file mode 100644 index 000000000..6634060ec --- /dev/null +++ b/frigate/test/README.md @@ -0,0 +1,20 @@ +# Running unit tests from devcontainer +If you're using devcontainer, you can use the following command to run unit tests: +``` +python3 -m unittest +``` + +# Running unit tests locally +Local development might be a bit trickier. The frigate has a defaults, which are not compatible with the local setup. For instance, `/labelmap.txt` should be located in the root. + +To run unit tests, you can use `tox`. + +### Prerequisites +Make sure you have python3.8 installed in your system. You also might need to install `python3.8-dev` package +``` +sudo apt-get update && sudo apt-get install -y python3.8 python3.8-dev +``` + +### Running tests +To run tests, use `tox -e unittests` command. +`tox` uses pytest runner and rely on `conftest.py` to mock some of the modules and mock builtins.open to read the `/labelmap.txt` file. \ No newline at end of file diff --git a/frigate/test/conftest.py b/frigate/test/conftest.py new file mode 100644 index 000000000..5b8986f62 --- /dev/null +++ b/frigate/test/conftest.py @@ -0,0 +1,26 @@ +import pytest +from unittest import mock +import sys + +def fake_open(filename, *args, **kvargs): + if filename == '/labelmap.txt': + content = "0 person\n1 bicycle" + else: + raise FileNotFoundError(filename) + file_object = mock.mock_open(read_data=content).return_value + file_object.__iter__.return_value = content.splitlines(True) + return file_object + +@pytest.fixture(scope="session", autouse=True) +def filesystem_mock(): + with mock.patch("builtins.open", new=fake_open, create=True): + yield + +# monkeypatch tflite_runtime +# in case of moving to the pytest completely, this can be done in more pyhonic way +module = type(sys)('tflite_runtime') +sys.modules['tflite_runtime'] = module + +module = type(sys)('tflite_runtime.interpreter') +module.load_delegate = mock.MagicMock() +sys.modules['tflite_runtime.interpreter'] = module diff --git a/frigate/test/requirements.test.txt b/frigate/test/requirements.test.txt new file mode 100644 index 000000000..910e0ab0b --- /dev/null +++ b/frigate/test/requirements.test.txt @@ -0,0 +1,17 @@ +opencv-python-headless +numpy +imutils +scipy +psutil +Flask +paho-mqtt +PyYAML +matplotlib +click +setproctitle +peewee +peewee_migrate +pydantic +zeroconf +ws4py +pytest \ No newline at end of file diff --git a/frigate/test/test_config.py b/frigate/test/test_config.py index d1f2416e6..76325385f 100644 --- a/frigate/test/test_config.py +++ b/frigate/test/test_config.py @@ -572,7 +572,7 @@ class TestConfig(unittest.TestCase): assert config == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config - assert runtime_config.cameras["back"].motion.frame_height >= 120 + assert runtime_config.cameras["back"].motion.frame_height == 50 def test_motion_contour_area_dynamic(self): @@ -601,7 +601,7 @@ class TestConfig(unittest.TestCase): assert config == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config - assert round(runtime_config.cameras["back"].motion.contour_area) == 99 + assert round(runtime_config.cameras["back"].motion.contour_area) == 30 def test_merge_labelmap(self): diff --git a/frigate/test/test_reduce_boxes.py b/frigate/test/test_reduce_boxes.py index db3803162..69d6f7177 100644 --- a/frigate/test/test_reduce_boxes.py +++ b/frigate/test/test_reduce_boxes.py @@ -1,4 +1,3 @@ -import cv2 import numpy as np from unittest import TestCase, main from frigate.video import box_overlaps, reduce_boxes diff --git a/tox.ini b/tox.ini new file mode 100644 index 000000000..3b2a495ea --- /dev/null +++ b/tox.ini @@ -0,0 +1,14 @@ +[tox] +envlist = py38 +skipsdist = true + +[testenv] +install_command = pip install {opts} {packages} +basepython= python3.8 + +[testenv:unittests] +deps = + -rfrigate/test/requirements.test.txt + pytest + +commands = python3.8 -m pytest -svv