1
0
mirror of https://github.com/home-assistant/core.git synced 2025-12-20 02:48:57 +00:00
Files
core/tests/components/go2rtc/test_docker_version.py
2025-11-24 12:52:58 +01:00

86 lines
2.9 KiB
Python

"""Test that the go2rtc Docker image version matches or exceeds the recommended version.
This test ensures that the go2rtc Docker image SHA pinned in
script/hassfest/docker.py corresponds to a version that is equal to or
greater than the RECOMMENDED_VERSION defined in homeassistant/components/go2rtc/const.py.
The test pulls the Docker image using the pinned SHA and runs the
`go2rtc --version` command inside the container to extract the version,
then compares it against RECOMMENDED_VERSION.
"""
import asyncio
import os
import re
from awesomeversion import AwesomeVersion
import pytest
from homeassistant.components.go2rtc.const import RECOMMENDED_VERSION
from script.hassfest.docker import _GO2RTC_SHA as DOCKER_SHA
async def _get_version_from_docker_sha() -> str:
"""Extract go2rtc version from Docker image using the pinned SHA."""
image = f"ghcr.io/alexxit/go2rtc@sha256:{DOCKER_SHA}"
pull_process = await asyncio.create_subprocess_exec(
"docker",
"pull",
image,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)
_, pull_stderr = await pull_process.communicate()
if pull_process.returncode != 0:
raise RuntimeError(f"Failed to pull go2rtc image: {pull_stderr.decode()}")
# Run the container to get version
run_process = await asyncio.create_subprocess_exec(
"docker",
"run",
"--rm",
image,
"go2rtc",
"--version",
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)
run_stdout, run_stderr = await run_process.communicate()
if run_process.returncode != 0:
raise RuntimeError(f"Failed to run go2rtc --version: {run_stderr.decode()}")
# Parse version from output
# Expected output format: "go2rtc version 1.9.12 (commit) linux/amd64" or similar
output = run_stdout.decode().strip()
version_match = re.search(r"version\s+([\d.]+)", output)
if not version_match:
raise RuntimeError(f"Could not parse version from go2rtc output: {output}")
return version_match.group(1)
@pytest.mark.skipif(
not os.environ.get("CI"),
reason="This test requires Docker and only runs in CI",
)
async def test_docker_version_matches_recommended() -> None:
"""Test that the go2rtc Docker SHA version matches or exceeds RECOMMENDED_VERSION."""
# Extract version from the actual Docker container
docker_version_str = await _get_version_from_docker_sha()
# Parse versions
docker_version = AwesomeVersion(docker_version_str)
recommended_version = AwesomeVersion(RECOMMENDED_VERSION)
# Assert that Docker version is equal to or greater than recommended version
assert docker_version >= recommended_version, (
f"go2rtc Docker version ({docker_version}) is less than "
f"RECOMMENDED_VERSION ({recommended_version}). "
"Please update _GO2RTC_SHA in script/hassfest/docker.py to a newer version"
)