1
0
mirror of https://github.com/home-assistant/supervisor.git synced 2026-02-15 07:27:13 +00:00
Files
supervisor/tests/test_arch.py
Stefan Agner a849050369 Improve CpuArch type safety with explicit conversions (#6524)
The CpuArch enum was being used inconsistently throughout the codebase,
with some code expecting enum values and other code expecting strings.
This caused type checking issues and potential runtime errors.

Changes:
- Fix match_base() to return CpuArch enum instead of str
- Add explicit string conversions using !s formatting where arch values
  are used in f-strings (build.py, model.py)
- Convert CpuArch to str explicitly in contexts requiring strings
  (docker/addon.py, misc/filter.py)
- Update all tests to use CpuArch enum values instead of strings
- Update test mocks to return CpuArch enum values

This ensures type consistency and improves MyPy type checking accuracy
across the architecture detection and management code.

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-04 11:34:23 +01:00

264 lines
8.4 KiB
Python

"""Test arch object."""
from unittest.mock import patch
import pytest
from supervisor.const import CpuArch
@pytest.fixture(name="mock_detect_cpu", autouse=True)
def mock_detect_cpu_fixture():
"""Mock cpu detection."""
with patch("platform.machine") as detect_mock:
detect_mock.return_value = "Unknown"
yield detect_mock
async def test_machine_not_exits(coresys, sys_machine, sys_supervisor):
"""Test arch for raspberrypi."""
sys_machine.return_value = None
sys_supervisor.arch = "amd64"
await coresys.arch.load()
assert coresys.arch.default == "amd64"
assert coresys.arch.supported == [CpuArch.AMD64]
async def test_machine_not_exits_in_db(coresys, sys_machine, sys_supervisor):
"""Test arch for raspberrypi."""
sys_machine.return_value = "jedi-master-knight"
sys_supervisor.arch = "amd64"
await coresys.arch.load()
assert coresys.arch.default == "amd64"
assert coresys.arch.supported == [CpuArch.AMD64]
async def test_supervisor_arch(coresys, sys_machine, sys_supervisor):
"""Test arch for raspberrypi."""
sys_machine.return_value = None
sys_supervisor.arch = "amd64"
assert coresys.arch.supervisor == "amd64"
await coresys.arch.load()
assert coresys.arch.supervisor == "amd64"
async def test_raspberrypi_arch(coresys, sys_machine, sys_supervisor):
"""Test arch for raspberrypi."""
sys_machine.return_value = "raspberrypi"
sys_supervisor.arch = "armhf"
await coresys.arch.load()
assert coresys.arch.default == "armhf"
assert coresys.arch.supported == [CpuArch.ARMHF]
async def test_raspberrypi2_arch(coresys, sys_machine, sys_supervisor):
"""Test arch for raspberrypi2."""
sys_machine.return_value = "raspberrypi2"
sys_supervisor.arch = "armv7"
await coresys.arch.load()
assert coresys.arch.default == "armv7"
assert coresys.arch.supported == [CpuArch.ARMV7, CpuArch.ARMHF]
async def test_raspberrypi3_arch(coresys, sys_machine, sys_supervisor):
"""Test arch for raspberrypi3."""
sys_machine.return_value = "raspberrypi3"
sys_supervisor.arch = "armv7"
await coresys.arch.load()
assert coresys.arch.default == "armv7"
assert coresys.arch.supported == [CpuArch.ARMV7, CpuArch.ARMHF]
async def test_raspberrypi3_64_arch(coresys, sys_machine, sys_supervisor):
"""Test arch for raspberrypi3_64."""
sys_machine.return_value = "raspberrypi3-64"
sys_supervisor.arch = "aarch64"
await coresys.arch.load()
assert coresys.arch.default == "aarch64"
assert coresys.arch.supported == [CpuArch.AARCH64, CpuArch.ARMV7, CpuArch.ARMHF]
async def test_raspberrypi4_arch(coresys, sys_machine, sys_supervisor):
"""Test arch for raspberrypi4."""
sys_machine.return_value = "raspberrypi4"
sys_supervisor.arch = "armv7"
await coresys.arch.load()
assert coresys.arch.default == "armv7"
assert coresys.arch.supported == [CpuArch.ARMV7, CpuArch.ARMHF]
async def test_raspberrypi4_64_arch(coresys, sys_machine, sys_supervisor):
"""Test arch for raspberrypi4_64."""
sys_machine.return_value = "raspberrypi4-64"
sys_supervisor.arch = "aarch64"
await coresys.arch.load()
assert coresys.arch.default == "aarch64"
assert coresys.arch.supported == [CpuArch.AARCH64, CpuArch.ARMV7, CpuArch.ARMHF]
async def test_raspberrypi5_64_arch(coresys, sys_machine, sys_supervisor):
"""Test arch for raspberrypi5_64."""
sys_machine.return_value = "raspberrypi5-64"
sys_supervisor.arch = "aarch64"
await coresys.arch.load()
assert coresys.arch.default == "aarch64"
assert coresys.arch.supported == [CpuArch.AARCH64, CpuArch.ARMV7, CpuArch.ARMHF]
async def test_yellow_arch(coresys, sys_machine, sys_supervisor):
"""Test arch for yellow."""
sys_machine.return_value = "yellow"
sys_supervisor.arch = "aarch64"
await coresys.arch.load()
assert coresys.arch.default == "aarch64"
assert coresys.arch.supported == [CpuArch.AARCH64, CpuArch.ARMV7, CpuArch.ARMHF]
assert coresys.arch.is_supported(["aarch64"]) is True
assert coresys.arch.is_supported(["armv7"]) is True
assert coresys.arch.is_supported(["armhf"]) is True
assert coresys.arch.is_supported(["x86_64", "i386"]) is False
async def test_green_arch(coresys, sys_machine, sys_supervisor):
"""Test arch for green."""
sys_machine.return_value = "green"
sys_supervisor.arch = "aarch64"
await coresys.arch.load()
assert coresys.arch.default == "aarch64"
assert coresys.arch.supported == [CpuArch.AARCH64, CpuArch.ARMV7, CpuArch.ARMHF]
async def test_tinker_arch(coresys, sys_machine, sys_supervisor):
"""Test arch for tinker."""
sys_machine.return_value = "tinker"
sys_supervisor.arch = "armv7"
await coresys.arch.load()
assert coresys.arch.default == "armv7"
assert coresys.arch.supported == [CpuArch.ARMV7, CpuArch.ARMHF]
async def test_odroid_c2_arch(coresys, sys_machine, sys_supervisor):
"""Test arch for odroid-c2."""
sys_machine.return_value = "odroid-c2"
sys_supervisor.arch = "aarch64"
await coresys.arch.load()
assert coresys.arch.default == "aarch64"
assert coresys.arch.supported == [CpuArch.AARCH64, CpuArch.ARMV7, CpuArch.ARMHF]
async def test_odroid_c4_arch(coresys, sys_machine, sys_supervisor):
"""Test arch for odroid-c4."""
sys_machine.return_value = "odroid-c4"
sys_supervisor.arch = "aarch64"
await coresys.arch.load()
assert coresys.arch.default == "aarch64"
assert coresys.arch.supported == [CpuArch.AARCH64, CpuArch.ARMV7, CpuArch.ARMHF]
async def test_odroid_m1_arch(coresys, sys_machine, sys_supervisor):
"""Test arch for odroid-m1."""
sys_machine.return_value = "odroid-m1"
sys_supervisor.arch = "aarch64"
await coresys.arch.load()
assert coresys.arch.default == "aarch64"
assert coresys.arch.supported == [CpuArch.AARCH64, CpuArch.ARMV7, CpuArch.ARMHF]
async def test_odroid_n2_arch(coresys, sys_machine, sys_supervisor):
"""Test arch for odroid-n2."""
sys_machine.return_value = "odroid-n2"
sys_supervisor.arch = "aarch64"
await coresys.arch.load()
assert coresys.arch.default == "aarch64"
assert coresys.arch.supported == [CpuArch.AARCH64, CpuArch.ARMV7, CpuArch.ARMHF]
async def test_odroid_xu_arch(coresys, sys_machine, sys_supervisor):
"""Test arch for odroid-xu."""
sys_machine.return_value = "odroid-xu"
sys_supervisor.arch = "armv7"
await coresys.arch.load()
assert coresys.arch.default == "armv7"
assert coresys.arch.supported == [CpuArch.ARMV7, CpuArch.ARMHF]
async def test_intel_nuc_arch(coresys, sys_machine, sys_supervisor):
"""Test arch for intel-nuc."""
sys_machine.return_value = "intel-nuc"
sys_supervisor.arch = "amd64"
await coresys.arch.load()
assert coresys.arch.default == "amd64"
assert coresys.arch.supported == [CpuArch.AMD64, CpuArch.I386]
async def test_qemux86_arch(coresys, sys_machine, sys_supervisor):
"""Test arch for qemux86."""
sys_machine.return_value = "qemux86"
sys_supervisor.arch = "i386"
await coresys.arch.load()
assert coresys.arch.default == "i386"
assert coresys.arch.supported == [CpuArch.I386]
async def test_qemux86_64_arch(coresys, sys_machine, sys_supervisor):
"""Test arch for qemux86-64."""
sys_machine.return_value = "qemux86-64"
sys_supervisor.arch = "amd64"
await coresys.arch.load()
assert coresys.arch.default == "amd64"
assert coresys.arch.supported == [CpuArch.AMD64, CpuArch.I386]
async def test_qemuarm_arch(coresys, sys_machine, sys_supervisor):
"""Test arch for qemuarm."""
sys_machine.return_value = "qemuarm"
sys_supervisor.arch = "armhf"
await coresys.arch.load()
assert coresys.arch.default == "armhf"
assert coresys.arch.supported == [CpuArch.ARMHF]
async def test_qemuarm_64_arch(coresys, sys_machine, sys_supervisor):
"""Test arch for qemuarm-64."""
sys_machine.return_value = "qemuarm-64"
sys_supervisor.arch = "aarch64"
await coresys.arch.load()
assert coresys.arch.default == "aarch64"
assert coresys.arch.supported == [CpuArch.AARCH64]
async def test_qemuarm_arch_native_armv7(
coresys, sys_machine, mock_detect_cpu, sys_supervisor
):
"""Test arch for qemuarm."""
sys_machine.return_value = "qemuarm"
sys_supervisor.arch = "armhf"
mock_detect_cpu.return_value = "armv7l"
await coresys.arch.load()
assert coresys.arch.default == "armhf"
assert coresys.arch.supported == [CpuArch.ARMHF, CpuArch.ARMV7]