Skip to content

Commit dc9571c

Browse files
committed
Timer: Add tests for new interruptable timers
Signed-off-by: Mathias L. Baumann <[email protected]>
1 parent 82986fa commit dc9571c

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

tests/test_timer.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,3 +558,60 @@ async def test_timer_skip_missed_and_drift(
558558
drift = await timer.receive()
559559
assert event_loop.time() == pytest.approx(interval * 14 + tolerance * 3 + 0.001)
560560
assert drift == pytest.approx(timedelta(seconds=0.0))
561+
562+
563+
async def test_timer_reset_with_new_interval(
564+
event_loop: async_solipsism.EventLoop, # pylint: disable=redefined-outer-name
565+
) -> None:
566+
"""Test resetting the timer with a new interval."""
567+
initial_interval = timedelta(seconds=1.0)
568+
new_interval = timedelta(seconds=2.0)
569+
timer = Timer(initial_interval, TriggerAllMissed())
570+
571+
# Wait for the first tick
572+
drift = await timer.receive()
573+
assert drift == timedelta(seconds=0.0)
574+
assert event_loop.time() == pytest.approx(1.0)
575+
576+
# Reset the timer with a new interval
577+
timer.reset(interval=new_interval)
578+
579+
# The next tick should occur after the new interval
580+
drift = await timer.receive()
581+
assert drift == timedelta(seconds=0.0)
582+
assert event_loop.time() == pytest.approx(3.0)
583+
584+
# Ensure the timer continues with the new interval
585+
drift = await timer.receive()
586+
assert drift == timedelta(seconds=0.0)
587+
assert event_loop.time() == pytest.approx(5.0)
588+
589+
590+
async def test_timer_immediate_interruption_on_reset() -> None:
591+
"""Test that the timer is interrupted immediately upon reset."""
592+
timer1 = Timer(timedelta(seconds=5.0), TriggerAllMissed())
593+
timer2 = Timer(timedelta(seconds=1.0), TriggerAllMissed())
594+
timer3 = Timer(timedelta(seconds=4.0), TriggerAllMissed())
595+
596+
timer_trigger_order = []
597+
598+
async def reset_timer1() -> None:
599+
await timer2.receive()
600+
timer_trigger_order.append(2)
601+
timer1.reset(interval=timedelta(seconds=1.0))
602+
timer2.stop()
603+
604+
async def receive_timer2() -> None:
605+
await timer1.receive()
606+
timer_trigger_order.append(1)
607+
608+
async def receive_timer3() -> None:
609+
await timer3.receive()
610+
timer_trigger_order.append(3)
611+
612+
task1 = asyncio.create_task(reset_timer1())
613+
task2 = asyncio.create_task(receive_timer2())
614+
task3 = asyncio.create_task(receive_timer3())
615+
616+
await asyncio.wait([task1, task2, task3])
617+
assert timer_trigger_order == [2, 1, 3]

0 commit comments

Comments
 (0)