From cbe0adf53f2221d32ffed54e5c59102ee5d44ab0 Mon Sep 17 00:00:00 2001 From: Mike Degatano Date: Wed, 11 May 2022 07:14:28 -0400 Subject: [PATCH] OS latest version set from upgrade path (#3632) * OS latest version set from upgrade path * fix tests * Update test_updater.py * Revert / fetch_update is global unwrapped Co-authored-by: Pascal Vizeli --- supervisor/updater.py | 9 +++++++++ tests/test_updater.py | 22 ++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/supervisor/updater.py b/supervisor/updater.py index e383d1d50..c9f9c1911 100644 --- a/supervisor/updater.py +++ b/supervisor/updater.py @@ -243,6 +243,15 @@ class Updater(FileConfiguration, CoreSysAttributes): self._data[ATTR_OTA] = data["ota"] if version := data["hassos"].get(self.sys_os.board): events.append("os") + upgrade_map = data.get("hassos-upgrade", {}) + if last_in_major := upgrade_map.get(str(self.sys_os.version.major)): + if self.sys_os.version != AwesomeVersion(last_in_major): + version = last_in_major + elif last_in_next_major := upgrade_map.get( + str(int(self.sys_os.version.major) + 1) + ): + version = last_in_next_major + self._data[ATTR_HASSOS] = AwesomeVersion(version) else: _LOGGER.warning( diff --git a/tests/test_updater.py b/tests/test_updater.py index 607b96d85..1f05d0b54 100644 --- a/tests/test_updater.py +++ b/tests/test_updater.py @@ -1,5 +1,7 @@ """Test updater files.""" +from unittest.mock import patch +from awesomeversion import AwesomeVersion import pytest from supervisor.coresys import CoreSys @@ -48,3 +50,23 @@ async def test_fetch_versions(coresys: CoreSys) -> None: assert coresys.updater.image_multicast == data["images"]["multicast"].format( arch=coresys.arch.supervisor ) + + +@pytest.mark.parametrize( + "version, expected", + [ + ("3.1", "3.13"), + ("4.5", "4.20"), + ("5.0", "5.13"), + ("6.4", "6.6"), + ("4.20", "5.13"), + ], +) +async def test_os_update_path(coresys: CoreSys, version: str, expected: str): + """Test OS upgrade path across major versions.""" + coresys.os._board = "rpi4" # pylint: disable=protected-access + coresys.os._version = AwesomeVersion(version) # pylint: disable=protected-access + with patch.object(type(coresys.security), "verify_own_content"): + await coresys.updater.fetch_data() + + assert coresys.updater.version_hassos == AwesomeVersion(expected)