Skip to content

Commit ba6bd9f

Browse files
committed
fixup! Rewrite internal arc
1 parent f3b1103 commit ba6bd9f

File tree

2 files changed

+51
-7
lines changed

2 files changed

+51
-7
lines changed

src/frequenz/dispatch/actor.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -266,10 +266,11 @@ def _schedule_start(self, dispatch: Dispatch) -> None:
266266
return
267267

268268
# Schedule the next run
269-
next_run = dispatch.next_run
270-
assert next_run is not None
271-
heappush(self._scheduled_events, (next_run, dispatch))
272-
_logger.debug("Scheduled dispatch %s to start at %s", dispatch, next_run)
269+
if next_run := dispatch.next_run:
270+
heappush(self._scheduled_events, (next_run, dispatch))
271+
_logger.debug("Scheduled dispatch %s to start at %s", dispatch.id, next_run)
272+
else:
273+
_logger.debug("Dispatch %s has no next run", dispatch.id)
273274

274275
def _schedule_stop(self, dispatch: Dispatch) -> None:
275276
"""Schedule a dispatch to stop.

tests/test_frequenz_dispatch.py

+46-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
from frequenz.client.dispatch.test.client import FakeClient, to_create_params
1616
from frequenz.client.dispatch.test.generator import DispatchGenerator
1717
from frequenz.client.dispatch.types import Dispatch as BaseDispatch
18-
from frequenz.client.dispatch.types import Frequency
18+
from frequenz.client.dispatch.types import DispatchEvent as BaseDispatchEvent
19+
from frequenz.client.dispatch.types import Event, Frequency, RecurrenceRule
1920
from pytest import fixture
2021

2122
from frequenz.dispatch import (
@@ -153,8 +154,9 @@ async def _test_new_dispatch_created(
153154
case Deleted(dispatch) | Updated(dispatch):
154155
assert False, "Expected a created event"
155156
case Created(dispatch):
156-
sample = update_dispatch(sample, dispatch)
157-
assert dispatch == Dispatch(sample)
157+
sample = Dispatch(update_dispatch(sample, dispatch))
158+
sample._set_running_status_notified() # pylint: disable=protected-access
159+
assert dispatch == sample
158160

159161
return sample
160162

@@ -424,3 +426,44 @@ async def test_dispatch_inf_duration_updated_to_finite_and_continues(
424426
# Expect notification to stop the dispatch because the duration has now passed
425427
stopped_dispatch = await actor_env.running_state_change.receive()
426428
assert stopped_dispatch.running(sample.type) == RunningState.STOPPED
429+
430+
431+
async def test_dispatch_new_but_finished(
432+
actor_env: ActorTestEnv,
433+
generator: DispatchGenerator,
434+
fake_time: time_machine.Coordinates,
435+
) -> None:
436+
"""Test that a dispatch that is already finished is not started."""
437+
# Generate a dispatch that is already finished
438+
finished_dispatch = generator.generate_dispatch()
439+
finished_dispatch = replace(
440+
finished_dispatch,
441+
active=True,
442+
duration=timedelta(seconds=5),
443+
start_time=_now() - timedelta(seconds=50),
444+
recurrence=None,
445+
type="I_SHOULD_NEVER_RUN",
446+
)
447+
# Create an old dispatch
448+
actor_env.client.set_dispatches(actor_env.microgrid_id, [finished_dispatch])
449+
await actor_env.actor.stop()
450+
actor_env.actor.start()
451+
452+
# Create another dispatch the normal way
453+
new_dispatch = generator.generate_dispatch()
454+
new_dispatch = replace(
455+
new_dispatch,
456+
active=True,
457+
duration=timedelta(seconds=10),
458+
start_time=_now() + timedelta(seconds=5),
459+
recurrence=RecurrenceRule(),
460+
type="NEW_BETTER_DISPATCH",
461+
)
462+
# Consume one lifecycle_updates event
463+
await actor_env.updated_dispatches.receive()
464+
new_dispatch = await _test_new_dispatch_created(actor_env, new_dispatch)
465+
466+
# Advance time to when the new dispatch should still not start
467+
fake_time.shift(timedelta(seconds=100))
468+
469+
assert await actor_env.running_state_change.receive() == new_dispatch

0 commit comments

Comments
 (0)