Exemplo n.º 1
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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));
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 8
0
        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);
        }
Exemplo n.º 9
0
        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));
        }
Exemplo n.º 13
0
        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());
        }