@@ -211,9 +211,18 @@ def on_transport_close():
211211 assert len (threads ) == 0
212212
213213
214- async def test_wait_for_startup_reset (gw ):
214+ @pytest .mark .parametrize (
215+ "reset_code" ,
216+ [
217+ t .NcpResetCode .RESET_SOFTWARE ,
218+ t .NcpResetCode .RESET_POWER_ON ,
219+ t .NcpResetCode .RESET_WATCHDOG ,
220+ t .NcpResetCode .RESET_EXTERNAL ,
221+ ],
222+ )
223+ async def test_wait_for_startup_reset (gw , reset_code ):
215224 loop = asyncio .get_running_loop ()
216- loop .call_later (0.01 , gw .reset_received , t . NcpResetCode . RESET_SOFTWARE )
225+ loop .call_later (0.01 , gw .reset_received , reset_code )
217226
218227 assert gw ._startup_reset_future is None
219228 await gw .wait_for_startup_reset ()
@@ -239,8 +248,25 @@ async def test_callbacks(gw):
239248 ]
240249
241250
242- def test_reset_propagation (gw ):
243- gw .reset_received (t .NcpResetCode .ERROR_EXCEEDED_MAXIMUM_ACK_TIMEOUT_COUNT )
251+ async def test_error_received_during_reset_ignored (gw ):
252+ # Set up a reset future to simulate being in the middle of a reset
253+ loop = asyncio .get_running_loop ()
254+ gw ._reset_future = loop .create_future ()
255+
256+ # Error should be ignored (not trigger failed state)
257+ gw .error_received (t .NcpResetCode .ERROR_EXCEEDED_MAXIMUM_ACK_TIMEOUT_COUNT )
258+ assert gw ._api .enter_failed_state .call_count == 0
259+
260+ # Clean up
261+ gw ._reset_future .cancel ()
262+
263+
264+ def test_unexpected_reset_triggers_failed_state (gw ):
265+ # When no reset is expected, any reset should trigger failed state
266+ assert gw ._reset_future is None
267+ assert gw ._startup_reset_future is None
268+
269+ gw .reset_received (t .NcpResetCode .RESET_SOFTWARE )
244270 assert gw ._api .enter_failed_state .mock_calls == [
245- call (t .NcpResetCode .ERROR_EXCEEDED_MAXIMUM_ACK_TIMEOUT_COUNT )
271+ call (t .NcpResetCode .RESET_SOFTWARE )
246272 ]
0 commit comments