Example #1
0
        public async Task ExceptionCreateJob_LoggingError()
        {
            var jobLoggingMock = new Mock <IHorariumLogger>();

            var(jobScopeFactoryMock, jobScopeMock) = CreateScopeMock();

            jobScopeMock.Setup(x => x.CreateJob(It.IsAny <Type>()))
            .Throws <Exception>();

            var executorJob = new ExecutorJob(
                Mock.Of <IJobRepository>(),
                Mock.Of <IAdderJobs>(),
                new HorariumSettings
            {
                JobScopeFactory = jobScopeFactoryMock.Object,
                Logger          = jobLoggingMock.Object
            });

            await executorJob.Execute(new JobMetadata
            {
                JobParam = new object(),
                JobType  = typeof(TestFailedJob)
            });

            jobLoggingMock.Verify(x =>
                                  x.Error($"Ошибка создания джоба {typeof(TestFailedJob)}", It.IsAny <Exception>()));
        }
Example #2
0
        public async Task ThrowExceptionJobCountStartedEqMax_DontCallFailedStrategyAndFailedJob()
        {
            var(jobScopeFactoryMock, jobScopeMock) = CreateScopeMock();

            var jobRepositoryMock = new Mock <IJobRepository>();

            jobScopeMock.Setup(x => x.CreateJob(It.IsAny <Type>()))
            .Returns(() => new TestFailedJob());

            var failedRepeatStrategyMock = new Mock <IFailedRepeatStrategy>();

            var executorJob = new ExecutorJob(
                jobRepositoryMock.Object,
                Mock.Of <IAdderJobs>(),
                new HorariumSettings
            {
                JobScopeFactory      = jobScopeFactoryMock.Object,
                FailedRepeatStrategy = failedRepeatStrategyMock.Object,
                MaxRepeatCount       = 10
            });

            await executorJob.Execute(new JobMetadata()
            {
                JobParam     = new object(),
                JobType      = typeof(TestFailedJob),
                CountStarted = 10
            });

            failedRepeatStrategyMock.Verify(x => x.GetNextStartInterval(It.IsAny <int>()), Times.Never);
            jobRepositoryMock.Verify(x => x.FailedJob(It.IsAny <string>(), It.IsAny <Exception>()));
        }
Example #3
0
        public async Task FailedEventOfAJobThrows_FailedJobCalledNevertheless()
        {
            var(jobScopeFactoryMock, jobScopeMock) = CreateScopeMock();
            var jobRepositoryMock = new Mock <IJobRepository>();

            jobScopeMock.Setup(x => x.CreateJob(It.IsAny <Type>()))
            .Returns(() => new TestFailedEventThrowsJob());

            var executorJob = new ExecutorJob(
                jobRepositoryMock.Object,
                Mock.Of <IAdderJobs>(),
                new HorariumSettings
            {
                JobScopeFactory = jobScopeFactoryMock.Object,
                MaxRepeatCount  = 10
            });

            await executorJob.Execute(new JobMetadata
            {
                JobParam     = new object(),
                JobType      = typeof(TestFailedEventThrowsJob),
                CountStarted = 10
            });

            jobRepositoryMock.Verify(x => x.FailedJob(It.IsAny <string>(), It.IsAny <Exception>()));
        }
Example #4
0
        public async Task ThrowExceptionJobWithFailedStrategy_UseFailedStrategyFromJob()
        {
            var(jobScopeFactoryMock, jobScopeMock) = CreateScopeMock();

            jobScopeMock.Setup(x => x.CreateJob(It.IsAny <Type>()))
            .Returns(() => new TestFailedJob());

            var failedRepeatStrategyMock = new Mock <IFailedRepeatStrategy>();

            var executorJob = new ExecutorJob(
                Mock.Of <IJobRepository>(),
                Mock.Of <IAdderJobs>(),
                new HorariumSettings
            {
                JobScopeFactory      = jobScopeFactoryMock.Object,
                FailedRepeatStrategy = failedRepeatStrategyMock.Object
            });

            await executorJob.Execute(new JobMetadata()
            {
                JobParam       = new object(),
                JobType        = typeof(TestFailedJob),
                RepeatStrategy = typeof(DefaultRepeatStrategy)
            });

            failedRepeatStrategyMock.Verify(x => x.GetNextStartInterval(It.IsAny <int>()), Times.Never);
        }
Example #5
0
        public async Task ExceptionInJob_SaveError()
        {
            var jobRepositoryMock = new Mock <IJobRepository>();

            var(jobScopeFactoryMock, jobScopeMock) = CreateScopeMock();

            jobScopeMock.Setup(x => x.CreateJob(It.IsAny <Type>()))
            .Returns(() => new TestFailedJob());

            var executorJob = new ExecutorJob(
                jobRepositoryMock.Object,
                Mock.Of <IAdderJobs>(),
                new HorariumSettings
            {
                JobScopeFactory = jobScopeFactoryMock.Object
            });

            await executorJob.Execute(new JobMetadata
            {
                JobParam = new object(),
                JobType  = typeof(TestFailedJob)
            });

            jobRepositoryMock.Verify(x =>
                                     x.RepeatJob(It.IsAny <string>(), It.IsAny <DateTime>(), It.IsAny <NotImplementedException>()));
        }
Example #6
0
        public async Task GetJobFromScope_ThenDisposeScope()
        {
            var jobRepositoryMock = new Mock <IJobRepository>();

            var(jobScopeFactoryMock, jobScopeMock) = CreateScopeMock();

            jobScopeMock.Setup(x => x.CreateJob(It.IsAny <Type>()))
            .Returns(() => new TestJob());

            var executorJob = new ExecutorJob(
                jobRepositoryMock.Object,
                Mock.Of <IAdderJobs>(),
                new HorariumSettings
            {
                JobScopeFactory = jobScopeFactoryMock.Object
            });

            await executorJob.Execute(new JobMetadata
            {
                JobParam = "StringParams",
                JobType  = typeof(TestJob)
            });

            jobScopeFactoryMock.Verify(x => x.Create(), Times.Once);
            jobScopeMock.Verify(x => x.CreateJob(typeof(TestJob)), Times.Once);
            jobScopeMock.Verify(x => x.Dispose(), Times.Once);
        }
Example #7
0
        public async Task RecurrentJob_DeleteAfterRun()
        {
            var jobRepositoryMock = new Mock <IJobRepository>();

            var(jobScopeFactoryMock, jobScopeMock) = CreateScopeMock();

            const string cron = "*/15 * * * * *";

            jobScopeMock.Setup(x => x.CreateJob(It.IsAny <Type>()))
            .Returns(() => new TestReccurrentJob());
            jobRepositoryMock.Setup(x => x.GetCronForRecurrentJob(It.IsAny <string>()))
            .ReturnsAsync(cron);

            var executorJob = new ExecutorJob(
                jobRepositoryMock.Object,
                Mock.Of <IAdderJobs>(),
                new HorariumSettings
            {
                JobScopeFactory = jobScopeFactoryMock.Object
            });

            await executorJob.Execute(new JobMetadata()
            {
                JobParam     = null,
                JobType      = typeof(TestReccurrentJob),
                CountStarted = 1,
                Cron         = cron
            });

            jobRepositoryMock.Verify(x => x.RemoveJob(It.IsAny <string>()));
        }
Example #8
0
        public async Task ExceptionInJob_SaveError_WhenNotAllRepeatesIsFailed()
        {
            var(jobScopeFactoryMock, jobScopeMock) = CreateScopeMock();

            var job = new TestAllRepeatesIsFailedJob();

            jobScopeMock.Setup(x => x.CreateJob(It.IsAny <Type>()))
            .Returns(() => job);

            var executorJob = new ExecutorJob(
                Mock.Of <IJobRepository>(),
                Mock.Of <IAdderJobs>(),
                new HorariumSettings
            {
                JobScopeFactory = jobScopeFactoryMock.Object
            });

            await executorJob.Execute(new JobMetadata
            {
                JobParam     = new object(),
                JobType      = typeof(TestAllRepeatesIsFailedJob),
                CountStarted = 1
            });

            Assert.False(job.FailedEventCalled);
        }
Example #9
0
        public async Task RecurrentJob_ExceptionCreateJob_LoggingError()
        {
            // Arrange
            var jobLoggingMock    = new Mock <IHorariumLogger>();
            var jobFactoryMock    = new Mock <IJobFactory>();
            var jobRepositoryMock = new Mock <IJobRepository>();

            const string cron = "*/15 * * * * *";

            jobRepositoryMock.Setup(x => x.GetCronForRecurrentJob(It.IsAny <string>()))
            .ReturnsAsync(cron);
            jobFactoryMock.Setup(x => x.CreateJob(It.IsAny <Type>()))
            .Throws <Exception>();

            var executorJob = new ExecutorJob(jobFactoryMock.Object,
                                              jobLoggingMock.Object,
                                              jobRepositoryMock.Object,
                                              Mock.Of <IAdderJobs>(),
                                              new JsonSerializerSettings());

            // Act
            await executorJob.Execute(new JobMetadata
            {
                JobParam     = null,
                JobKey       = nameof(TestReccurrentJob),
                JobType      = typeof(TestReccurrentJob),
                CountStarted = 1,
                Cron         = cron
            });

            // Assert
            jobLoggingMock.Verify(x =>
                                  x.Error($"Ошибка создания джоба {typeof(TestReccurrentJob)}", It.IsAny <Exception>()));
        }
Example #10
0
        public void Start()
        {
            var executorJob = new ExecutorJob(_jobRepository, _adderJobs, _settings);

            _runnerJobs = new RunnerJobs(_jobRepository, _settings, _settings.JsonSerializerSettings, _settings.Logger,
                                         executorJob);
            _runnerJobs.Start();
        }
Example #11
0
        public async Task RecurrentJob_ThrowException_AddRecurrentJobNextStart()
        {
            // Arrange
            var jobRepositoryMock = new Mock <IJobRepository>();

            var(jobScopeFactoryMock, jobScopeMock) = CreateScopeMock();
            var jobAdderJob = new Mock <IAdderJobs>();

            const string cron = "*/15 * * * * *";

            jobScopeMock.Setup(x => x.CreateJob(It.IsAny <Type>()))
            .Returns(() => throw new Exception());
            jobRepositoryMock.Setup(x => x.GetCronForRecurrentJob(It.IsAny <string>()))
            .ReturnsAsync(cron);

            var executorJob = new ExecutorJob(
                jobRepositoryMock.Object,
                jobAdderJob.Object,
                new HorariumSettings
            {
                JobScopeFactory = jobScopeFactoryMock.Object
            });

            var job = new JobMetadata()
            {
                JobParam     = null,
                JobKey       = nameof(TestReccurrentJob),
                JobType      = typeof(TestReccurrentJob),
                CountStarted = 1,
                Cron         = cron
            };

            // Act
            await executorJob.Execute(job);

            // Assert
            jobRepositoryMock.Verify(x => x.GetCronForRecurrentJob(It.IsAny <string>()), Times.Once);
            jobAdderJob.Verify(x => x.AddRecurrentJob(It.Is <JobMetadata>(j => j.JobType == job.JobType &&
                                                                          j.JobKey == job.JobKey &&
                                                                          j.Cron == job.Cron)));
        }
Example #12
0
        public async Task JobWithNextJob_DelayContains_AddedJobStartAtEqualNowPlusDelay()
        {
            var startAt = new DateTime(2018, 10, 11, 15, 25, 0);
            var delay   = TimeSpan.FromHours(4);

            var jobRepositoryMock = new Mock <IJobRepository>();

            var(jobScopeFactoryMock, jobScopeMock) = CreateScopeMock();

            jobScopeMock.Setup(x => x.CreateJob(It.IsAny <Type>()))
            .Returns(() => new TestJob());

            var executorJob = new ExecutorJob(
                jobRepositoryMock.Object,
                Mock.Of <IAdderJobs>(),
                new HorariumSettings
            {
                JobScopeFactory = jobScopeFactoryMock.Object
            });

            var jobExecuteTime = DateTime.UtcNow;

            await executorJob.Execute(new JobMetadata()
            {
                JobParam     = "StringParams",
                JobType      = typeof(TestJob),
                CountStarted = 1,
                Cron         = "*/15 * * * * *",
                NextJob      = new JobMetadata
                {
                    JobParam = "StringParams",
                    JobType  = typeof(TestJob),
                    StartAt  = startAt,
                    Delay    = delay
                }
            });

            jobRepositoryMock.Verify(x => x.AddJob(It.Is <JobDb>(job => job.StartAt != startAt &&
                                                                 job.StartAt >= jobExecuteTime + delay)));
        }
Example #13
0
        public async Task JobWithNextJob_DelayIsZero_AddedJobStartAtEqualNow()
        {
            var startAt = new DateTime(2018, 10, 11, 15, 25, 0);

            var jobRepositoryMock = new Mock <IJobRepository>();

            var jobFactoryMock = new Mock <IJobFactory>();

            jobFactoryMock.Setup(x => x.CreateJob(It.IsAny <Type>()))
            .Returns(() => new TestJob());

            var executorJob = new ExecutorJob(jobFactoryMock.Object,
                                              Mock.Of <IHorariumLogger>(),
                                              jobRepositoryMock.Object,
                                              Mock.Of <IAdderJobs>(),
                                              new JsonSerializerSettings());

            var jobExecuteTime = DateTime.Now;

            await executorJob.Execute(new JobMetadata()
            {
                JobParam     = "StringParams",
                JobType      = typeof(TestJob),
                CountStarted = 1,
                Cron         = "*/15 * * * * *",
                NextJob      = new JobMetadata
                {
                    JobParam = "StringParams",
                    JobType  = typeof(TestJob),
                    StartAt  = startAt,
                    Delay    = TimeSpan.Zero
                }
            });

            jobRepositoryMock.Verify(x => x.AddJob(It.Is <JobDb>(job => job.StartAt >= jobExecuteTime &&
                                                                 job.StartAt <= DateTime.Now)));
        }
Example #14
0
        public async Task ExceptionInJob_SaveError_WhenAllRepeatesIsFailed()
        {
            var jobFactoryMock = new Mock <IJobFactory>();

            var job = new TestAllRepeatesIsFailedJob();

            jobFactoryMock.Setup(x => x.CreateJob(It.IsAny <Type>()))
            .Returns(() => job);

            var executorJob = new ExecutorJob(jobFactoryMock.Object,
                                              Mock.Of <IHorariumLogger>(),
                                              Mock.Of <IJobRepository>(),
                                              Mock.Of <IAdderJobs>(),
                                              new JsonSerializerSettings());

            await executorJob.Execute(new JobMetadata
            {
                JobParam     = new object(),
                JobType      = typeof(TestAllRepeatesIsFailedJob),
                CountStarted = 10
            });

            Assert.True(job.FailedEventCalled);
        }