public void ChangePeriod_PeriodIncreasedTimerNotStarted_PeriodChangedBeforeFirstCall() { var invoked = new AutoResetEvent(false); var entity = new Entity { Id = "entity0" }; var period = TimeSpan.FromMilliseconds(250); var timeout = TimeSpan.FromSeconds(2); var clock = new UptimeClock(); Entity lastInvokedEntity = null; using var scheduler = new EntityActionScheduler <Entity>(e => { lastInvokedEntity = e; invoked.Set(); return(Task.CompletedTask); }, autoStart: false, runOnce: false, new TimerFactory()); scheduler.ScheduleEntity(entity, period); var newPeriod = TimeSpan.FromMilliseconds(500); scheduler.ChangePeriod(entity, newPeriod); scheduler.Start(); var before = clock.TickCount; Assert.True(invoked.WaitOne(timeout)); var elapsed = TimeSpan.FromMilliseconds(clock.TickCount - before); Assert.True(elapsed >= newPeriod); Assert.Same(entity, lastInvokedEntity); }
public void ChangePeriod_TimerStartedPeriodChangedAfterFirstCall_PeriodChangedBeforeNextCall() { var entity = new Entity { Id = "entity0" }; Entity lastInvokedEntity = null; var timerFactory = new TestTimerFactory(); using var scheduler = new EntityActionScheduler <Entity>(e => { lastInvokedEntity = e; return(Task.CompletedTask); }, autoStart: true, runOnce: false, timerFactory); scheduler.ScheduleEntity(entity, TimeSpan.FromMilliseconds(Period0)); timerFactory.VerifyTimer(0, Period0); timerFactory.FireTimer(0); var newPeriod = TimeSpan.FromMilliseconds(Period1); scheduler.ChangePeriod(entity, newPeriod); timerFactory.VerifyTimer(0, Period1); Assert.Same(entity, lastInvokedEntity); }