From 858fc30fcd0db62ed40f609ec344acfd5eb482b3 Mon Sep 17 00:00:00 2001 From: Penny Wood Date: Wed, 15 Mar 2023 10:27:29 +0800 Subject: [PATCH] Fix infinite loop in sun.sun (#89723) --- homeassistant/helpers/sun.py | 11 ++++++++--- tests/helpers/test_sun.py | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/homeassistant/helpers/sun.py b/homeassistant/helpers/sun.py index 25bef38ed0b..cf944dfc479 100644 --- a/homeassistant/helpers/sun.py +++ b/homeassistant/helpers/sun.py @@ -82,7 +82,8 @@ def get_location_astral_event_next( kwargs["observer_elevation"] = elevation mod = -1 - while True: + first_err = None + while mod < 367: try: next_dt = ( cast(_AstralSunEventCallable, getattr(location, event))( @@ -94,9 +95,13 @@ def get_location_astral_event_next( ) if next_dt > utc_point_in_time: return next_dt - except ValueError: - pass + except ValueError as err: + if not first_err: + first_err = err mod += 1 + raise ValueError( + f"Unable to find event after one year, initial ValueError: {first_err}" + ) from first_err @callback diff --git a/tests/helpers/test_sun.py b/tests/helpers/test_sun.py index 86076221483..e030958ab82 100644 --- a/tests/helpers/test_sun.py +++ b/tests/helpers/test_sun.py @@ -3,6 +3,8 @@ from datetime import datetime, timedelta from unittest.mock import patch +import pytest + from homeassistant.const import SUN_EVENT_SUNRISE, SUN_EVENT_SUNSET from homeassistant.core import HomeAssistant import homeassistant.helpers.sun as sun @@ -192,3 +194,15 @@ def test_norway_in_june(hass: HomeAssistant) -> None: ) assert sun.get_astral_event_date(hass, SUN_EVENT_SUNRISE, june) is None assert sun.get_astral_event_date(hass, SUN_EVENT_SUNSET, june) is None + + +def test_impossible_elevation(hass: HomeAssistant) -> None: + """Test altitude where the sun can't set.""" + hass.config.latitude = 69.6 + hass.config.longitude = 18.8 + hass.config.elevation = 10000000 + + june = datetime(2016, 6, 1, tzinfo=dt_util.UTC) + + with pytest.raises(ValueError): + sun.get_astral_event_next(hass, SUN_EVENT_SUNRISE, june)