From 0f5dc6af8e9021c40ac1ab78492fc9cf860ece99 Mon Sep 17 00:00:00 2001 From: Sahas Subramanian Date: Tue, 20 May 2025 11:20:02 +0200 Subject: [PATCH 1/3] Add missing PV and EV components to datapipeline's `stop` method Signed-off-by: Sahas Subramanian --- src/frequenz/sdk/microgrid/_data_pipeline.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/frequenz/sdk/microgrid/_data_pipeline.py b/src/frequenz/sdk/microgrid/_data_pipeline.py index 1eccb88f8..31b0e3bd0 100644 --- a/src/frequenz/sdk/microgrid/_data_pipeline.py +++ b/src/frequenz/sdk/microgrid/_data_pipeline.py @@ -495,8 +495,14 @@ async def _stop(self) -> None: if self._resampling_actor: await self._resampling_actor.actor.stop() await self._battery_power_wrapper.stop() + await self._ev_power_wrapper.stop() + await self._pv_power_wrapper.stop() for pool in self._battery_pool_reference_stores.values(): await pool.stop() + for evpool in self._ev_charger_pool_reference_stores.values(): + await evpool.stop() + for pvpool in self._pv_pool_reference_stores.values(): + await pvpool.stop() _DATA_PIPELINE: _DataPipeline | None = None From 919a0f4fbf3439d1942f944d25470eac6aa2cd71 Mon Sep 17 00:00:00 2001 From: Sahas Subramanian Date: Tue, 20 May 2025 11:20:27 +0200 Subject: [PATCH 2/3] Cleanup after PV and EV charger tests finish Signed-off-by: Sahas Subramanian --- .../test_ev_charger_pool_control_methods.py | 8 ++++++++ tests/timeseries/_pv_pool/test_pv_pool_control_methods.py | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/tests/timeseries/_ev_charger_pool/test_ev_charger_pool_control_methods.py b/tests/timeseries/_ev_charger_pool/test_ev_charger_pool_control_methods.py index b519bb473..651276eea 100644 --- a/tests/timeseries/_ev_charger_pool/test_ev_charger_pool_control_methods.py +++ b/tests/timeseries/_ev_charger_pool/test_ev_charger_pool_control_methods.py @@ -63,6 +63,14 @@ async def mocks(mocker: MockerFixture) -> typing.AsyncIterator[_Mocks]: dp._ev_power_wrapper.status_channel.new_sender(), ) + await asyncio.gather( + *[ + dp._stop(), + streamer.stop(), + mockgrid.cleanup(), + ] + ) + class TestEVChargerPoolControl: """Test the EV charger pool control methods.""" diff --git a/tests/timeseries/_pv_pool/test_pv_pool_control_methods.py b/tests/timeseries/_pv_pool/test_pv_pool_control_methods.py index 96bea5c77..70b1fd028 100644 --- a/tests/timeseries/_pv_pool/test_pv_pool_control_methods.py +++ b/tests/timeseries/_pv_pool/test_pv_pool_control_methods.py @@ -56,6 +56,14 @@ async def mocks(mocker: MockerFixture) -> typing.AsyncIterator[_Mocks]: dp._pv_power_wrapper.status_channel.new_sender(), ) + await asyncio.gather( + *[ + dp._stop(), + streamer.stop(), + mockgrid.cleanup(), + ] + ) + class TestPVPoolControl: """Test control methods for the PVPool.""" From f03e6d3e75cefa348d6a108e19eeefea9594fdd5 Mon Sep 17 00:00:00 2001 From: Sahas Subramanian Date: Tue, 20 May 2025 13:36:44 +0200 Subject: [PATCH 3/3] Wrap test cleanup calls in `finally` blocks Signed-off-by: Sahas Subramanian --- .../test_battery_pool_control_methods.py | 27 ++++++++++--------- .../test_ev_charger_pool_control_methods.py | 27 ++++++++++--------- .../_pv_pool/test_pv_pool_control_methods.py | 27 ++++++++++--------- 3 files changed, 42 insertions(+), 39 deletions(-) diff --git a/tests/timeseries/_battery_pool/test_battery_pool_control_methods.py b/tests/timeseries/_battery_pool/test_battery_pool_control_methods.py index eef6fcc58..cd21796f7 100644 --- a/tests/timeseries/_battery_pool/test_battery_pool_control_methods.py +++ b/tests/timeseries/_battery_pool/test_battery_pool_control_methods.py @@ -71,19 +71,20 @@ async def mocks(mocker: MockerFixture) -> typing.AsyncIterator[Mocks]: dp = microgrid._data_pipeline._DATA_PIPELINE assert dp is not None - yield Mocks( - mockgrid, - streamer, - dp._battery_power_wrapper.status_channel.new_sender(), - ) - - await asyncio.gather( - *[ - dp._stop(), - streamer.stop(), - mockgrid.cleanup(), - ] - ) + try: + yield Mocks( + mockgrid, + streamer, + dp._battery_power_wrapper.status_channel.new_sender(), + ) + finally: + _ = await asyncio.gather( + *[ + dp._stop(), + streamer.stop(), + mockgrid.cleanup(), + ] + ) class TestBatteryPoolControl: diff --git a/tests/timeseries/_ev_charger_pool/test_ev_charger_pool_control_methods.py b/tests/timeseries/_ev_charger_pool/test_ev_charger_pool_control_methods.py index 651276eea..25de848b0 100644 --- a/tests/timeseries/_ev_charger_pool/test_ev_charger_pool_control_methods.py +++ b/tests/timeseries/_ev_charger_pool/test_ev_charger_pool_control_methods.py @@ -57,19 +57,20 @@ async def mocks(mocker: MockerFixture) -> typing.AsyncIterator[_Mocks]: dp = typing.cast(_DataPipeline, microgrid._data_pipeline._DATA_PIPELINE) - yield _Mocks( - mockgrid, - streamer, - dp._ev_power_wrapper.status_channel.new_sender(), - ) - - await asyncio.gather( - *[ - dp._stop(), - streamer.stop(), - mockgrid.cleanup(), - ] - ) + try: + yield _Mocks( + mockgrid, + streamer, + dp._ev_power_wrapper.status_channel.new_sender(), + ) + finally: + _ = await asyncio.gather( + *[ + dp._stop(), + streamer.stop(), + mockgrid.cleanup(), + ] + ) class TestEVChargerPoolControl: diff --git a/tests/timeseries/_pv_pool/test_pv_pool_control_methods.py b/tests/timeseries/_pv_pool/test_pv_pool_control_methods.py index 70b1fd028..e1ef9141f 100644 --- a/tests/timeseries/_pv_pool/test_pv_pool_control_methods.py +++ b/tests/timeseries/_pv_pool/test_pv_pool_control_methods.py @@ -50,19 +50,20 @@ async def mocks(mocker: MockerFixture) -> typing.AsyncIterator[_Mocks]: dp = typing.cast(_DataPipeline, microgrid._data_pipeline._DATA_PIPELINE) - yield _Mocks( - mockgrid, - streamer, - dp._pv_power_wrapper.status_channel.new_sender(), - ) - - await asyncio.gather( - *[ - dp._stop(), - streamer.stop(), - mockgrid.cleanup(), - ] - ) + try: + yield _Mocks( + mockgrid, + streamer, + dp._pv_power_wrapper.status_channel.new_sender(), + ) + finally: + _ = await asyncio.gather( + *[ + dp._stop(), + streamer.stop(), + mockgrid.cleanup(), + ] + ) class TestPVPoolControl: