public void ScheduleOnDayOfMonth() { //the schedule once, should be return the same date if in the future. var startDate = DateTime.Now; var expectedDate = startDate; // get the next 10th of month date while (expectedDate.Day != 10) { expectedDate = expectedDate.AddDays(1); } // this date is a monday var schedule = new ManagedTaskTrigger() { IntervalType = EIntervalType.Interval, StartDate = startDate, StartTime = new TimeSpan(1, 0, 0), MaxRecurs = 0, DaysOfMonth = new[] { 10 } }; var scheduled = schedule.NextOccurrence(startDate); // the expected date will be on the following friday var expected = expectedDate.Date.AddHours(1).ToUniversalTime(); Assert.Equal(expected, scheduled.Value.ToUniversalTime()); }
public async Task Test_ManagedTask_ScheduleAsync() { var managedTasks = new ManagedTasks.ManagedTasks(); // simple task that takes 5 seconds var managedObject = new ProgressTask(5000, 1); var currentDate = DateTime.Now; // set a trigger 5 seconds in the future var trigger = new ManagedTaskTrigger() { StartDate = currentDate, StartTime = currentDate.AddSeconds(5).TimeOfDay, IntervalType = EIntervalType.Once }; _output.WriteLine($"Time to Start: {trigger.NextOccurrence(DateTime.Now)-DateTime.Now}"); var task1 = managedTasks.Add("123", "task3", "test", managedObject, new[] { trigger }); var cts = new CancellationTokenSource(); cts.CancelAfter(30000); await managedTasks.WhenAll(cts.Token); // time should be startDate + 5 second for the job to run. Assert.True(trigger.StartDate.Value.AddSeconds(5) < DateTime.Now); }
public void ScheduleWithInterval() { //the schedule once, should be return the same date if in the future. var startDate = DateTime.Now; var schedule = new ManagedTaskTrigger() { Details = "", EndDate = null, EndTime = null, IntervalTime = TimeSpan.FromHours(4), DaysOfWeek = null, IntervalType = EIntervalType.Interval, MaxRecurs = null, SkipDates = null, StartDate = null, StartTime = startDate.TimeOfDay, DaysOfMonth = null, WeeksOfMonth = null }; var shiftTime = DateTime.UtcNow.AddSeconds(1); var scheduled = schedule.NextOccurrence(shiftTime); // add 4 hours to the base date which will give expected date. var expected = startDate.AddHours(4); _output.WriteLine($"Start Date: {startDate}, Shift Time: {shiftTime}, Scheduled: {scheduled}, Expected: {expected}"); Assert.Equal(expected, scheduled.Value); }
public void ScheduleTestOnce() { //the schedule once, should be return the same date if in the future. var startDate = DateTime.Now.AddHours(1); var schedule = new ManagedTaskTrigger(startDate); Assert.Equal(startDate, schedule.NextOccurrence(DateTime.Now)); //the schedule once should return null if the startdate is in the past. var startDate2 = DateTime.Now.AddHours(-1); var schedule2 = new ManagedTaskTrigger(startDate2); _output.WriteLine($"Schedule details {schedule.Details}."); Assert.Null(schedule2.NextOccurrence(DateTime.Now)); }
public void ScheduleWithTimeZone() { //the schedule once, should be return the same date if in the future. var schedule = new ManagedTaskTrigger() { IntervalType = EIntervalType.Interval, StartTime = new TimeSpan(12, 0, 0), IntervalTime = TimeSpan.FromDays(1), TimeZone = TimeZoneInfo.GetSystemTimeZones().First().Id, MaxRecurs = null }; var scheduled = schedule.NextOccurrence(DateTime.Now); Assert.Equal(12, scheduled.Value.Hour); }
public void Test_ManagedTask_BadTrigger() { var managedTasks = new ManagedTasks.ManagedTasks(); var trigger = new ManagedTaskTrigger(TimeSpan.Zero, 5); var triggers = new[] { trigger }; var progressTask = new ProgressTask(200, 5); Assert.Throws <ManagedTaskTriggerException>(() => { var managedTask = managedTasks.Add("123", "task", "test", "category", 1, "id", 1, progressTask, triggers, null, null); }); Assert.Empty(managedTasks.GetActiveTasks()); }
public async Task Test_ManagedTask_Schedule_RecurringAsync() { var managedTasks = new ManagedTasks.ManagedTasks(); var startTime = DateTime.Now.TimeOfDay; // simple task that takes 1 second to run var managedObject = new ProgressTask(1000, 1); var scheduleCount = 0; void OnSchedule(object sender, EManagedTaskStatus status) { if (status == EManagedTaskStatus.Scheduled) { Interlocked.Increment(ref scheduleCount); } } managedTasks.OnStatus += OnSchedule; // starts in 1 second, then runs 1 second job var trigger = new ManagedTaskTrigger() { StartDate = DateTime.Now, StartTime = DateTime.Now.AddSeconds(1).TimeOfDay, IntervalTime = TimeSpan.FromSeconds(2), MaxRecurs = 5 }; managedTasks.Add("123", "task3", "test", managedObject, new[] { trigger }); var cts = new CancellationTokenSource(); cts.CancelAfter(30000); await managedTasks.WhenAll(cts.Token); Assert.Equal(5, scheduleCount); Assert.Equal(0, managedTasks.RunningCount); Assert.Equal(0, managedTasks.ScheduledCount); Assert.Equal(5, managedTasks.CompletedCount); // 10 seconds = Initial 1 + 2 *(5-1) recurs + 1 final job Assert.True(trigger.StartDate.Value.AddSeconds(10) <= DateTime.Now); }
public void StartDateTest() { //Set a starttime 1 minute from now DateTime currentDate = DateTime.Now; var schedule = new ManagedTaskTrigger() { StartDate = currentDate, StartTime = currentDate.AddMinutes(1).TimeOfDay }; var nextSchedule = (DateTimeOffset)schedule.NextOccurrence(currentDate); _output.WriteLine($"Schedule details {schedule.Details}."); _output.WriteLine($"Schedule time {nextSchedule}."); TimeTest(DateTime.Now.AddMinutes(1), nextSchedule); }
public void EndTimeTest() { DateTime currentDate = DateTime.Now; // set a start time 2 minutes ago, with end time 1 minute ago // which should schedule the next run time tomorrow var schedule = new ManagedTaskTrigger() { StartTime = currentDate.AddMinutes(-2).TimeOfDay, EndTime = currentDate.AddMinutes(-1).TimeOfDay, IntervalType = EIntervalType.Daily }; var nextSchedule = (DateTimeOffset)schedule.NextOccurrence(currentDate); _output.WriteLine($"Schedule details {schedule.Details}."); _output.WriteLine($"Schedule time {nextSchedule}."); TimeTest(DateTime.Now.AddDays(1).AddMinutes(-2), nextSchedule); }
public ManagedTaskTrigger CreateManagedTaskTrigger(string timeZone) { var daysOfWeek = DaysOfWeek?.ToArray() ?? Enum.GetValues(typeof(EDayOfWeek)).Cast <EDayOfWeek>().ToArray(); var managedTaskTrigger = new ManagedTaskTrigger() { Details = Details, EndDate = null, EndTime = EndTime, IntervalTime = IntervalTime, DaysOfWeek = daysOfWeek, IntervalType = EIntervalType.Interval, MaxRecurs = MaxRecurs, SkipDates = null, StartDate = StartDate, StartTime = StartTime, DaysOfMonth = null, WeeksOfMonth = null, TimeZone = timeZone }; return(managedTaskTrigger); }
// test a scheduled task is added to the queue, and removed when cancelled. public async Task Test_ManagedTask_Schedule_Recurring_CancelAsync() { var managedTasks = new ManagedTasks.ManagedTasks(); // simple task that takes 1 second to run var managedObject = new ProgressTask(1000, 1); var scheduleCount = 0; void OnSchedule(object sender, EManagedTaskStatus status) { if (status == EManagedTaskStatus.Scheduled) { Interlocked.Increment(ref scheduleCount); } } managedTasks.OnStatus += OnSchedule; // starts in 1 second, then runs 1 second job var trigger = new ManagedTaskTrigger() { StartDate = DateTime.Now, StartTime = DateTime.Now.AddSeconds(100).TimeOfDay, IntervalTime = TimeSpan.FromSeconds(2), MaxRecurs = 5 }; var task = managedTasks.Add("123", "task3", "test", managedObject, new[] { trigger }); Assert.Single(managedTasks.GetScheduledTasks()); await Task.Delay(2000, CancellationToken.None); task.Cancel(); await Task.Delay(100, CancellationToken.None); //small delay to give spooler a chance to remove task from schedule. Assert.Empty(managedTasks.GetScheduledTasks()); }
public async Task Test_ManagedTask_Schedule_Error_No_IntervalTime() { var managedTasks = new ManagedTasks.ManagedTasks(); var startTime = DateTime.Now.TimeOfDay; // simple task that takes 1 second to run var managedObject = new ProgressTask(1000, 1); var scheduleCount = 0; void OnSchedule(object sender, EManagedTaskStatus status) { if (status == EManagedTaskStatus.Scheduled) { Interlocked.Increment(ref scheduleCount); } } managedTasks.OnStatus += OnSchedule; // starts in 1 second, then runs 1 second job var trigger = new ManagedTaskTrigger() { StartDate = DateTime.Now, StartTime = DateTime.Now.AddSeconds(1).TimeOfDay, IntervalTime = TimeSpan.FromSeconds(0), MaxRecurs = null, IntervalType = EIntervalType.Interval }; managedTasks.Add("123", "task3", "test", managedObject, new[] { trigger }); var cts = new CancellationTokenSource(); cts.CancelAfter(30000); Assert.ThrowsAsync <ManagedTaskTriggerException>(async() => await managedTasks.WhenAll(cts.Token)); }
public void ScheduleOnceDaily() { //the schedule once, should be return the same date if in the future. var startDate = DateTime.Now; var schedule = new ManagedTaskTrigger() { IntervalType = EIntervalType.Interval, StartDate = startDate.AddHours(-24), StartTime = new TimeSpan(1, 0, 0), MaxRecurs = 0, DaysOfWeek = new[] { EDayOfWeek.Friday, EDayOfWeek.Monday, EDayOfWeek.Saturday, EDayOfWeek.Sunday, EDayOfWeek.Thursday, EDayOfWeek.Tuesday, EDayOfWeek.Wednesday } }; var scheduled = schedule.NextOccurrence(startDate); // add 25 hours to the base date which will give expected date next day at 1am. var expected = startDate.Date.AddHours(25).ToUniversalTime(); Assert.Equal(expected, scheduled.Value.ToUniversalTime()); }