Add tests for System Monitor (#107891)

* Add tests

* no coordinator

* Coverage

* processes

* test init

* util

* test icon

* Add tests

* Mod tests

* Add tests

* Test attributes

* snapshots

* icon

* test disk mounts

* fixes

* svmem

* cache_clear

* test icon

* reset icon test

* test_processor_temperature

* fix tests on macos

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
This commit is contained in:
G Johansson
2024-01-15 18:26:49 +01:00
committed by GitHub
parent 749ef45727
commit 5b3e1306f8
7 changed files with 1147 additions and 16 deletions

View File

@ -4,12 +4,12 @@ from __future__ import annotations
import asyncio
from dataclasses import dataclass
from datetime import datetime, timedelta
from functools import cache
from functools import cache, lru_cache
import logging
import os
import socket
import sys
from typing import Any
from typing import Any, Literal
import psutil
import voluptuous as vol
@ -56,10 +56,6 @@ _LOGGER = logging.getLogger(__name__)
CONF_ARG = "arg"
if sys.maxsize > 2**32:
CPU_ICON = "mdi:cpu-64-bit"
else:
CPU_ICON = "mdi:cpu-32-bit"
SENSOR_TYPE_NAME = 0
SENSOR_TYPE_UOM = 1
@ -70,6 +66,14 @@ SENSOR_TYPE_MANDATORY_ARG = 4
SIGNAL_SYSTEMMONITOR_UPDATE = "systemmonitor_update"
@lru_cache
def get_cpu_icon() -> Literal["mdi:cpu-64-bit", "mdi:cpu-32-bit"]:
"""Return cpu icon."""
if sys.maxsize > 2**32:
return "mdi:cpu-64-bit"
return "mdi:cpu-32-bit"
@dataclass(frozen=True)
class SysMonitorSensorEntityDescription(SensorEntityDescription):
"""Description for System Monitor sensor entities."""
@ -121,19 +125,19 @@ SENSOR_TYPES: dict[str, SysMonitorSensorEntityDescription] = {
"load_15m": SysMonitorSensorEntityDescription(
key="load_15m",
name="Load (15m)",
icon=CPU_ICON,
icon=get_cpu_icon(),
state_class=SensorStateClass.MEASUREMENT,
),
"load_1m": SysMonitorSensorEntityDescription(
key="load_1m",
name="Load (1m)",
icon=CPU_ICON,
icon=get_cpu_icon(),
state_class=SensorStateClass.MEASUREMENT,
),
"load_5m": SysMonitorSensorEntityDescription(
key="load_5m",
name="Load (5m)",
icon=CPU_ICON,
icon=get_cpu_icon(),
state_class=SensorStateClass.MEASUREMENT,
),
"memory_free": SysMonitorSensorEntityDescription(
@ -210,14 +214,14 @@ SENSOR_TYPES: dict[str, SysMonitorSensorEntityDescription] = {
"process": SysMonitorSensorEntityDescription(
key="process",
name="Process",
icon=CPU_ICON,
icon=get_cpu_icon(),
mandatory_arg=True,
),
"processor_use": SysMonitorSensorEntityDescription(
key="processor_use",
name="Processor use",
native_unit_of_measurement=PERCENTAGE,
icon=CPU_ICON,
icon=get_cpu_icon(),
state_class=SensorStateClass.MEASUREMENT,
),
"processor_temperature": SysMonitorSensorEntityDescription(
@ -751,7 +755,11 @@ def _getloadavg() -> tuple[float, float, float]:
def _read_cpu_temperature() -> float | None:
"""Attempt to read CPU / processor temperature."""
temps = psutil.sensors_temperatures()
try:
temps = psutil.sensors_temperatures()
except AttributeError:
# Linux, macOS
return None
for name, entries in temps.items():
for i, entry in enumerate(entries, start=1):