Example #1
0
        public void SchedulerRefreshSchedules()
        {
            ScheduleRecord schedule = new ScheduleRecord()
            {
                ApplicationName = BlueCollarSection.Section.ApplicationName,
                Enabled         = true,
                Id          = 1,
                Name        = "Test",
                QueueName   = "*",
                RepeatType  = ScheduleRepeatType.Days,
                RepeatValue = 1,
                StartOn     = DateTime.UtcNow.FloorWithSeconds()
            };

            ScheduledJobRecord scheduledJob = new ScheduledJobRecord()
            {
                Data       = @"{""SleepDuration"":1000}",
                Id         = 1,
                JobType    = JobSerializer.GetTypeName(typeof(TestJob)),
                Schedule   = schedule,
                ScheduleId = 1
            };

            schedule.ScheduledJobs.Add(scheduledJob);

            var transaction = new Mock <IDbTransaction>();

            var repository = new Mock <IRepository>();

            repository.Setup(r => r.BeginTransaction()).Returns(transaction.Object);
            repository.Setup(r => r.GetSchedules(BlueCollarSection.Section.ApplicationName, It.IsAny <IDbTransaction>())).Returns(new ScheduleRecord[] { schedule });

            var factory = new Mock <IRepositoryFactory>();

            factory.Setup(f => f.Create()).Returns(repository.Object);

            var logger = new Mock <ILogger>();

            Scheduler scheduler = new Scheduler(1, BlueCollarSection.Section.ApplicationName, QueueNameFilters.Any(), 1, factory.Object, logger.Object);

            Assert.AreEqual(0, scheduler.Schedules.Count());

            scheduler.RefreshSchedules();
            Assert.AreEqual(1, scheduler.Schedules.Count());
        }
 /// <summary>
 /// Updates the given scheduled job.
 /// </summary>
 /// <param name="record">The scheduled job record to update.</param>
 /// <param name="transaction">The transaction to use, if applicable.</param>
 /// <returns>The updated record.</returns>
 public ScheduledJobRecord UpdateScheduledJob(ScheduledJobRecord record, IDbTransaction transaction)
 {
     throw new NotImplementedException();
 }
 /// <summary>
 /// Updates the given scheduled job.
 /// </summary>
 /// <param name="record">The scheduled job record to update.</param>
 /// <param name="transaction">The transaction to use, if applicable.</param>
 /// <returns>The updated record.</returns>
 public ScheduledJobRecord UpdateScheduledJob(ScheduledJobRecord record, IDbTransaction transaction)
 {
     throw new NotImplementedException();
 }
        public void SchedulerRefreshSchedules()
        {
            ScheduleRecord schedule = new ScheduleRecord()
            {
                ApplicationName = BlueCollarSection.Section.ApplicationName,
                Enabled = true,
                Id = 1,
                Name = "Test",
                QueueName = "*",
                RepeatType = ScheduleRepeatType.Days,
                RepeatValue = 1,
                StartOn = DateTime.UtcNow.FloorWithSeconds()
            };

            ScheduledJobRecord scheduledJob = new ScheduledJobRecord()
            {
                Data = @"{""SleepDuration"":1000}",
                Id = 1,
                JobType = JobSerializer.GetTypeName(typeof(TestJob)),
                Schedule = schedule,
                ScheduleId = 1
            };

            schedule.ScheduledJobs.Add(scheduledJob);

            var transaction = new Mock<IDbTransaction>();

            var repository = new Mock<IRepository>();
            repository.Setup(r => r.BeginTransaction()).Returns(transaction.Object);
            repository.Setup(r => r.GetSchedules(BlueCollarSection.Section.ApplicationName, It.IsAny<IDbTransaction>())).Returns(new ScheduleRecord[] { schedule });

            var factory = new Mock<IRepositoryFactory>();
            factory.Setup(f => f.Create()).Returns(repository.Object);

            var logger = new Mock<ILogger>();

            Scheduler scheduler = new Scheduler(1, BlueCollarSection.Section.ApplicationName, QueueNameFilters.Any(), 1, factory.Object, logger.Object);
            Assert.AreEqual(0, scheduler.Schedules.Count());

            scheduler.RefreshSchedules();
            Assert.AreEqual(1, scheduler.Schedules.Count());
        }
        /// <summary>
        /// Delete scheduled job tests.
        /// </summary>
        protected void DeleteScheduledJob()
        {
            if (this.Repository != null)
            {
                ScheduleRecord scheduleRecord = new ScheduleRecord()
                {
                    ApplicationName = BlueCollarSection.Section.ApplicationName,
                    Name = "Test",
                    RepeatType = ScheduleRepeatType.Days,
                    RepeatValue = 1,
                    StartOn = DateTime.UtcNow.FloorWithSeconds()
                };

                this.Repository.CreateSchedule(scheduleRecord, null);

                ScheduledJobRecord scheduledJobRecord = new ScheduledJobRecord()
                {
                    ScheduleId = scheduleRecord.Id.Value,
                    JobType = "BlueCollar.Test.TestJob, BlueCollar.Test",
                    Data = "{}"
                };

                this.Repository.CreateScheduledJob(scheduledJobRecord, null);
                this.Repository.DeleteScheduledJob(scheduledJobRecord.Id.Value, null);
                Assert.AreEqual(0, this.Repository.GetScheduledJobList(BlueCollarSection.Section.ApplicationName, scheduleRecord.Id.Value, null, 100, 0, null).TotalCount);
            }
        }
        /// <summary>
        /// Delete all tests.
        /// </summary>
        protected void DeleteAll()
        {
            if (this.Repository != null)
            {
                IJob job = new TestJob() { Id = Guid.NewGuid() };

                WorkerRecord workerRecord = new WorkerRecord()
                {
                    ApplicationName = BlueCollarSection.Section.ApplicationName,
                    MachineAddress = Machine.Address,
                    MachineName = Machine.Name,
                    Name = "Test Worker",
                    QueueNames = "*",
                    Signal = WorkerSignal.Stop,
                    Status = WorkerStatus.Working,
                    Startup = WorkerStartupType.Automatic,
                    UpdatedOn = DateTime.UtcNow
                };

                this.Repository.CreateWorker(workerRecord, null);

                QueueRecord queueRecord = new QueueRecord()
                {
                    ApplicationName = workerRecord.ApplicationName,
                    Data = JsonConvert.SerializeObject(job),
                    JobName = job.Name,
                    JobType = job.GetType().FullName + ", " + job.GetType().Assembly.GetName().Name,
                    QueuedOn = DateTime.UtcNow,
                    QueueName = "*",
                    TryNumber = 1
                };

                this.Repository.CreateQueued(queueRecord, null);

                ScheduleRecord scheduleRecord = new ScheduleRecord()
                {
                    ApplicationName = workerRecord.ApplicationName,
                    Name = "Test",
                    RepeatType = ScheduleRepeatType.Days,
                    RepeatValue = 1,
                    StartOn = DateTime.UtcNow
                };

                this.Repository.CreateSchedule(scheduleRecord, null);

                ScheduledJobRecord scheduledJobRecord = new ScheduledJobRecord()
                {
                    JobType = JobSerializer.GetTypeName(job.GetType()),
                    ScheduleId = scheduleRecord.Id.Value
                };

                this.Repository.CreateScheduledJob(scheduledJobRecord, null);

                WorkingRecord workingRecord = new WorkingRecord()
                {
                    ApplicationName = workerRecord.ApplicationName,
                    Data = JobSerializer.Serialize(job),
                    JobName = job.Name,
                    JobType = JobSerializer.GetTypeName(job.GetType()),
                    QueuedOn = DateTime.UtcNow,
                    QueueName = null,
                    ScheduleId = scheduleRecord.Id,
                    StartedOn = DateTime.UtcNow,
                    TryNumber = 1,
                    WorkerId = workerRecord.Id.Value
                };

                this.Repository.CreateWorking(workingRecord, null);

                HistoryRecord historyRecord = new HistoryRecord()
                {
                    ApplicationName = workerRecord.ApplicationName,
                    Data = JobSerializer.Serialize(job),
                    FinishedOn = DateTime.UtcNow,
                    JobName = job.Name,
                    JobType = JobSerializer.GetTypeName(job.GetType()),
                    QueuedOn = DateTime.UtcNow,
                    ScheduleId = scheduleRecord.Id,
                    StartedOn = DateTime.UtcNow,
                    Status = HistoryStatus.Succeeded,
                    TryNumber = 1,
                    WorkerId = workerRecord.Id.Value
                };

                this.Repository.CreateHistory(historyRecord, null);

                this.Repository.DeleteAll(BlueCollarSection.Section.ApplicationName, null);

                Assert.AreEqual(0, this.Repository.GetHistoryList(workerRecord.ApplicationName, null, 100, 0, null).TotalCount);
                Assert.AreEqual(0, this.Repository.GetWorkingList(workerRecord.ApplicationName, null, 100, 0, null).TotalCount);
                Assert.AreEqual(0, this.Repository.GetWorkerList(workerRecord.ApplicationName, null, 100, 0, null).TotalCount);
                Assert.AreEqual(0, this.Repository.GetQueuedList(workerRecord.ApplicationName, null, 100, 0, null).TotalCount);
                Assert.AreEqual(0, this.Repository.GetScheduledJobList(workerRecord.ApplicationName, scheduleRecord.Id.Value, null, 0, 100, null).TotalCount);
                Assert.AreEqual(0, this.Repository.GetScheduleList(workerRecord.ApplicationName, null, 100, 0, null).TotalCount);
            }
        }
        /// <summary>
        /// Create scheduled job tests.
        /// </summary>
        protected void CreateScheduledJob()
        {
            if (this.Repository != null)
            {
                ScheduleRecord scheduleRecord = new ScheduleRecord()
                {
                    ApplicationName = BlueCollarSection.Section.ApplicationName,
                    Name = "Test",
                    QueueName = "*",
                    RepeatType = ScheduleRepeatType.Days,
                    RepeatValue = 1,
                    StartOn = DateTime.UtcNow.FloorWithSeconds()
                };

                this.Repository.CreateSchedule(scheduleRecord, null);

                ScheduledJobRecord scheduledJobRecord = new ScheduledJobRecord()
                {
                    JobType = "BlueCollar.TestScheduledJob, BlueCollar",
                    Data = "{}",
                    ScheduleId = scheduleRecord.Id.Value
                };

                this.Repository.CreateScheduledJob(scheduledJobRecord, null);
                Assert.IsNotNull(scheduledJobRecord.Id);
            }
        }
        /// <summary>
        /// Update scheduled job order tests.
        /// </summary>
        protected void UpdateScheduledJobOrder()
        {
            if (this.Repository != null)
            {
                ScheduleRecord scheduleRecord = new ScheduleRecord()
                {
                    ApplicationName = BlueCollarSection.Section.ApplicationName,
                    Name = "Nightly",
                    QueueName = "schedules",
                    RepeatType = ScheduleRepeatType.Days,
                    RepeatValue = 1,
                    StartOn = DateTime.UtcNow.FloorWithSeconds()
                };

                this.Repository.CreateSchedule(scheduleRecord, null);

                ScheduledJobRecord jobRecord1 = new ScheduledJobRecord()
                {
                    ScheduleId = scheduleRecord.Id.Value,
                    Number = 1,
                    JobType = "BlueCollar.Test.TestJob, BlueCollar.Test",
                    Data = "{}"
                };

                this.Repository.CreateScheduledJob(jobRecord1, null);

                ScheduledJobRecord jobRecord2 = new ScheduledJobRecord()
                {
                    ScheduleId = scheduleRecord.Id.Value,
                    Number = 2,
                    JobType = "BlueCollar.Test.TestJob, BlueCollar.Test",
                    Data = "{}"
                };

                this.Repository.CreateScheduledJob(jobRecord2, null);

                ScheduledJobRecord jobRecord3 = new ScheduledJobRecord()
                {
                    ScheduleId = scheduleRecord.Id.Value,
                    Number = 3,
                    JobType = "BlueCollar.Test.TestJob, BlueCollar.Test",
                    Data = "{}"
                };

                this.Repository.CreateScheduledJob(jobRecord3, null);
                this.Repository.UpdateScheduledJobOrder(new ScheduledJobOrderRecord() { Id = jobRecord1.Id.Value, Number = 2, ScheduleId = scheduleRecord.Id.Value }, null);

                ScheduledJobRecordList jobList = this.Repository.GetScheduledJobList(scheduleRecord.ApplicationName, scheduleRecord.Id.Value, null, 100, 0, null);
                Assert.IsNotNull(jobList);
                Assert.AreEqual(3, jobList.Records.Count);
                Assert.AreEqual(2, jobList.Records.First(j => j.Id == jobRecord1.Id).Number);
                Assert.AreEqual(1, jobList.Records.First(j => j.Id == jobRecord2.Id).Number);
                Assert.AreEqual(3, jobList.Records.First(j => j.Id == jobRecord3.Id).Number);

                this.Repository.UpdateScheduledJobOrder(new ScheduledJobOrderRecord() { Id = jobRecord3.Id.Value, Number = 1, ScheduleId = scheduleRecord.Id.Value }, null);

                jobList = this.Repository.GetScheduledJobList(scheduleRecord.ApplicationName, scheduleRecord.Id.Value, null, 100, 0, null);
                Assert.IsNotNull(jobList);
                Assert.AreEqual(3, jobList.Records.Count);
                Assert.AreEqual(3, jobList.Records.First(j => j.Id == jobRecord1.Id).Number);
                Assert.AreEqual(2, jobList.Records.First(j => j.Id == jobRecord2.Id).Number);
                Assert.AreEqual(1, jobList.Records.First(j => j.Id == jobRecord3.Id).Number);
            }
        }
        /// <summary>
        /// Update scheduled job tests.
        /// </summary>
        protected void UpdateScheduledJob()
        {
            if (this.Repository != null)
            {
                ScheduleRecord scheduleRecord = new ScheduleRecord()
                {
                    ApplicationName = BlueCollarSection.Section.ApplicationName,
                    Name = "Nightly",
                    QueueName = "schedules",
                    RepeatType = ScheduleRepeatType.Days,
                    RepeatValue = 1,
                    StartOn = DateTime.UtcNow.FloorWithSeconds()
                };

                this.Repository.CreateSchedule(scheduleRecord, null);

                ScheduledJobRecord jobRecord = new ScheduledJobRecord()
                {
                    ScheduleId = scheduleRecord.Id.Value,
                    JobType = "BlueCollar.Test.TestJob, BlueCollar.Test",
                    Data = "{}"
                };

                this.Repository.CreateScheduledJob(jobRecord, null);

                jobRecord.JobType = "BlueCollar.Test.UpdatedJob, BlueCollar.Test";
                jobRecord.Data = "{\"One\":null, \"Two\":\"Three\"}";
                this.Repository.UpdateScheduledJob(jobRecord, null);

                ScheduledJobRecord updatedJob = this.Repository.GetScheduledJobList(BlueCollarSection.Section.ApplicationName, scheduleRecord.Id.Value, null, 100, 0, null).Records[0];
                Assert.AreEqual(jobRecord.JobType, updatedJob.JobType);
                Assert.AreEqual(jobRecord.Data, updatedJob.Data);
            }
        }
        /// <summary>
        /// Get schedules tests.
        /// </summary>
        protected void GetSchedules()
        {
            if (this.Repository != null)
            {
                ScheduleRecord scheduleRecord = new ScheduleRecord()
                {
                    ApplicationName = BlueCollarSection.Section.ApplicationName,
                    Name = "Nightly",
                    QueueName = "schedules",
                    RepeatType = ScheduleRepeatType.Days,
                    RepeatValue = 1,
                    StartOn = DateTime.UtcNow.FloorWithSeconds()
                };

                this.Repository.CreateSchedule(scheduleRecord, null);

                ScheduledJobRecord scheduledJobRecord = new ScheduledJobRecord()
                {
                    ScheduleId = scheduleRecord.Id.Value,
                    JobType = "BlueCollar.TestScheduledJob, BlueCollar",
                    Data = "{}"
                };

                this.Repository.CreateScheduledJob(scheduledJobRecord, null);

                scheduleRecord.Id = null;
                scheduleRecord.Name = "Weekly";
                scheduleRecord.RepeatType = ScheduleRepeatType.Weeks;
                this.Repository.CreateSchedule(scheduleRecord, null);

                scheduledJobRecord = new ScheduledJobRecord()
                {
                    ScheduleId = scheduleRecord.Id.Value,
                    JobType = "BlueCollar.TestScheduledJob2, BlueCollar",
                    Data = "{}"
                };

                this.Repository.CreateScheduledJob(scheduledJobRecord, null);

                scheduledJobRecord = new ScheduledJobRecord()
                {
                    ScheduleId = scheduleRecord.Id.Value,
                    JobType = "BlueCollar.TestScheduledJob3, BlueCollar",
                    Data = "{}"
                };

                this.Repository.CreateScheduledJob(scheduledJobRecord, null);

                var schedules = this.Repository.GetSchedules(scheduleRecord.ApplicationName, null);
                Assert.AreEqual(2, schedules.Count());
                Assert.AreEqual(1, schedules.ElementAt(0).ScheduledJobs.Count);
                Assert.AreEqual(2, schedules.ElementAt(1).ScheduledJobs.Count);
            }
        }
        /// <summary>
        /// Get schedule list tests.
        /// </summary>
        protected void GetScheduleList()
        {
            if (this.Repository != null)
            {
                ScheduleRecord scheduleRecord = new ScheduleRecord()
                {
                    ApplicationName = BlueCollarSection.Section.ApplicationName,
                    Name = "Nightly",
                    QueueName = "schedules",
                    RepeatType = ScheduleRepeatType.Days,
                    RepeatValue = 1,
                    StartOn = DateTime.UtcNow.FloorWithSeconds()
                };

                this.Repository.CreateSchedule(scheduleRecord, null);

                ScheduledJobRecord scheduledJobRecord = new ScheduledJobRecord()
                {
                    ScheduleId = scheduleRecord.Id.Value,
                    JobType = "BlueCollar.TestScheduledJob, BlueCollar",
                    Data = "{}"
                };

                this.Repository.CreateScheduledJob(scheduledJobRecord, null);

                scheduleRecord.Id = null;
                scheduleRecord.Name = "Weekly";
                scheduleRecord.RepeatType = ScheduleRepeatType.Weeks;
                this.Repository.CreateSchedule(scheduleRecord, null);

                scheduledJobRecord = new ScheduledJobRecord()
                {
                    ScheduleId = scheduleRecord.Id.Value,
                    JobType = "BlueCollar.TestScheduledJob2, BlueCollar",
                    Data = "{}"
                };

                this.Repository.CreateScheduledJob(scheduledJobRecord, null);

                scheduledJobRecord = new ScheduledJobRecord()
                {
                    ScheduleId = scheduleRecord.Id.Value,
                    JobType = "BlueCollar.TestScheduledJob3, BlueCollar",
                    Data = "{}"
                };

                this.Repository.CreateScheduledJob(scheduledJobRecord, null);

                RecordList<ScheduleListRecord> schedules = this.Repository.GetScheduleList(BlueCollarSection.Section.ApplicationName, null, 100, 0, null);
                Assert.IsNotNull(schedules);
                Assert.AreEqual(2, schedules.TotalCount);
                Assert.AreEqual(2, schedules.Records.Count);
                Assert.AreEqual("Nightly", schedules.Records[0].Name);
                Assert.AreEqual(1, schedules.Records[0].JobCount);
                Assert.AreEqual("Weekly", schedules.Records[1].Name);
                Assert.AreEqual(2, schedules.Records[1].JobCount);
            }
        }
        /// <summary>
        /// Get schedule date exists for schedule tests.
        /// </summary>
        protected void GetScheduleDateExistsForSchedule()
        {
            if (this.Repository != null)
            {
                DateTime now = DateTime.UtcNow.FloorWithSeconds();
                TestJob job = new TestJob();

                ScheduleRecord scheduleRecord = new ScheduleRecord()
                {
                    ApplicationName = BlueCollarSection.Section.ApplicationName,
                    Name = "Test",
                    RepeatType = ScheduleRepeatType.Days,
                    RepeatValue = 1,
                    StartOn = now.AddDays(-1)
                };

                this.Repository.CreateSchedule(scheduleRecord, null);

                ScheduledJobRecord scheduledJobRecord = new ScheduledJobRecord()
                {
                    JobType = JobSerializer.GetTypeName(job),
                    ScheduleId = scheduleRecord.Id.Value
                };

                this.Repository.CreateScheduledJob(scheduledJobRecord, null);
                Assert.IsFalse(this.Repository.GetScheduleDateExistsForSchedule(scheduleRecord.Id.Value, now, null));

                QueueRecord queueRecord = new QueueRecord()
                {
                    ApplicationName = scheduleRecord.ApplicationName,
                    Data = JobSerializer.Serialize(job),
                    JobName = job.Name,
                    JobType = JobSerializer.GetTypeName(job),
                    QueuedOn = now,
                    ScheduleId = scheduleRecord.Id,
                    TryNumber = 1
                };

                this.Repository.CreateQueued(queueRecord, null);
                Assert.IsTrue(this.Repository.GetScheduleDateExistsForSchedule(scheduleRecord.Id.Value, now, null));
            }
        }