mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-04-22 20:27:16 +00:00

* Bad message error marks system as unhealthy * Finish adding test cases for changes * Rename test file for uniqueness * bad_message to oserror_bad_message * Omit some checks and check for network mounts
95 lines
3.6 KiB
Python
95 lines
3.6 KiB
Python
"""Testing handling with CoreState."""
|
|
# pylint: disable=W0212
|
|
import datetime
|
|
import errno
|
|
from unittest.mock import AsyncMock, PropertyMock, patch
|
|
|
|
from pytest import LogCaptureFixture
|
|
|
|
from supervisor.const import CoreState
|
|
from supervisor.coresys import CoreSys
|
|
from supervisor.exceptions import WhoamiSSLError
|
|
from supervisor.host.control import SystemControl
|
|
from supervisor.host.info import InfoCenter
|
|
from supervisor.supervisor import Supervisor
|
|
from supervisor.utils.whoami import WhoamiData
|
|
|
|
|
|
def test_write_state(run_dir, coresys: CoreSys):
|
|
"""Test write corestate to /run/supervisor."""
|
|
coresys.core.state = CoreState.RUNNING
|
|
|
|
assert run_dir.read_text() == CoreState.RUNNING
|
|
|
|
coresys.core.state = CoreState.SHUTDOWN
|
|
|
|
assert run_dir.read_text() == CoreState.SHUTDOWN
|
|
|
|
|
|
async def test_adjust_system_datetime(coresys: CoreSys):
|
|
"""Test _adjust_system_datetime method with successful retrieve_whoami."""
|
|
utc_ts = datetime.datetime.now().replace(tzinfo=datetime.UTC)
|
|
with patch(
|
|
"supervisor.core.retrieve_whoami",
|
|
new_callable=AsyncMock,
|
|
side_effect=[WhoamiData("Europe/Zurich", utc_ts)],
|
|
) as mock_retrieve_whoami:
|
|
await coresys.core._adjust_system_datetime()
|
|
mock_retrieve_whoami.assert_called_once()
|
|
assert coresys.core.sys_config.timezone == "Europe/Zurich"
|
|
|
|
# Validate we don't retrieve whoami once timezone has been set
|
|
mock_retrieve_whoami.reset_mock()
|
|
await coresys.core._adjust_system_datetime()
|
|
mock_retrieve_whoami.assert_not_called()
|
|
|
|
|
|
async def test_adjust_system_datetime_without_ssl(coresys: CoreSys):
|
|
"""Test _adjust_system_datetime method when retrieve_whoami raises WhoamiSSLError."""
|
|
utc_ts = datetime.datetime.now().replace(tzinfo=datetime.UTC)
|
|
with patch(
|
|
"supervisor.core.retrieve_whoami",
|
|
new_callable=AsyncMock,
|
|
side_effect=[WhoamiSSLError("SSL error"), WhoamiData("Europe/Zurich", utc_ts)],
|
|
) as mock_retrieve_whoami:
|
|
await coresys.core._adjust_system_datetime()
|
|
assert mock_retrieve_whoami.call_count == 2
|
|
assert mock_retrieve_whoami.call_args_list[0].args[1]
|
|
assert not mock_retrieve_whoami.call_args_list[1].args[1]
|
|
assert coresys.core.sys_config.timezone == "Europe/Zurich"
|
|
|
|
|
|
async def test_adjust_system_datetime_if_time_behind(coresys: CoreSys):
|
|
"""Test _adjust_system_datetime method when current time is ahead more than 3 days."""
|
|
utc_ts = datetime.datetime.now().replace(tzinfo=datetime.UTC) + datetime.timedelta(
|
|
days=4
|
|
)
|
|
with patch(
|
|
"supervisor.core.retrieve_whoami",
|
|
new_callable=AsyncMock,
|
|
side_effect=[WhoamiData("Europe/Zurich", utc_ts)],
|
|
) as mock_retrieve_whoami, patch.object(
|
|
SystemControl, "set_datetime"
|
|
) as mock_set_datetime, patch.object(
|
|
InfoCenter, "dt_synchronized", new=PropertyMock(return_value=False)
|
|
), patch.object(
|
|
Supervisor, "check_connectivity"
|
|
) as mock_check_connectivity:
|
|
await coresys.core._adjust_system_datetime()
|
|
mock_retrieve_whoami.assert_called_once()
|
|
mock_set_datetime.assert_called_once()
|
|
mock_check_connectivity.assert_called_once()
|
|
|
|
|
|
def test_write_state_failure(run_dir, coresys: CoreSys, caplog: LogCaptureFixture):
|
|
"""Test failure to write corestate to /run/supervisor."""
|
|
with patch(
|
|
"supervisor.core.RUN_SUPERVISOR_STATE.write_text",
|
|
side_effect=(err := OSError()),
|
|
):
|
|
err.errno = errno.EBADMSG
|
|
coresys.core.state = CoreState.RUNNING
|
|
|
|
assert "Can't update the Supervisor state" in caplog.text
|
|
assert coresys.core.healthy is True
|