public async Task Start_WontRecoverBeforeIntervalTimeout_AfterFailedDB()
        {
            // Arrange
            var jobRepositoryMock = new Mock <IJobRepository>();

            var settings = new HorariumSettings
            {
                IntervalStartJob = TimeSpan.FromSeconds(2),
            };

            var runnerJobs = new RunnerJobs(jobRepositoryMock.Object,
                                            settings,
                                            new JsonSerializerSettings(),
                                            Mock.Of <IHorariumLogger>(),
                                            Mock.Of <IExecutorJob>(),
                                            Mock.Of <IUncompletedTaskList>());

            jobRepositoryMock.SetupSequence(x => x.GetReadyJob(It.IsAny <string>(), It.IsAny <TimeSpan>()))
            .ThrowsAsync(new Exception())
            .ReturnsAsync(new JobDb());

            // Act
            runnerJobs.Start();
            await Task.Delay(settings.IntervalStartJob - TimeSpan.FromMilliseconds(500));

            // Assert
            jobRepositoryMock.Verify(r => r.GetReadyJob(It.IsAny <string>(), It.IsAny <TimeSpan>()), Times.Once);
        }
        public async Task Start_ExecutionWithDelay_WithThrottle()
        {
            // Arrange
            var jobRepositoryMock = new Mock <IJobRepository>();

            var settings = new HorariumSettings
            {
                IntervalStartJob    = TimeSpan.FromSeconds(1),
                JobThrottleSettings = new JobThrottleSettings
                {
                    UseJobThrottle       = true,
                    IntervalMultiplier   = 1,
                    JobRetrievalAttempts = 1
                }
            };

            var runnerJobs = new RunnerJobs(jobRepositoryMock.Object,
                                            settings,
                                            new JsonSerializerSettings(),
                                            Mock.Of <IHorariumLogger>(),
                                            Mock.Of <IExecutorJob>(),
                                            Mock.Of <IUncompletedTaskList>());

            // Act
            runnerJobs.Start();
            await Task.Delay(settings.IntervalStartJob - TimeSpan.FromMilliseconds(500));

            jobRepositoryMock.Invocations.Clear();

            await Task.Delay(settings.IntervalStartJob + settings.IntervalStartJob.Multiply(settings.JobThrottleSettings.IntervalMultiplier));

            // Assert
            jobRepositoryMock.Verify(r => r.GetReadyJob(It.IsAny <string>(), It.IsAny <TimeSpan>()), Times.Once);
        }
        public async Task StopAsync_AwaitsWhenAllCompleted()
        {
            // Arrange
            var jobRepositoryMock   = new Mock <IJobRepository>();
            var uncompletedTaskList = new Mock <IUncompletedTaskList>();
            var cancellationToken   = new CancellationTokenSource().Token;

            var settings = new HorariumSettings
            {
                IntervalStartJob = TimeSpan.FromSeconds(2),
            };

            var runnerJobs = new RunnerJobs(jobRepositoryMock.Object,
                                            settings,
                                            new JsonSerializerSettings(),
                                            Mock.Of <IHorariumLogger>(),
                                            Mock.Of <IExecutorJob>(),
                                            uncompletedTaskList.Object);

            jobRepositoryMock.Setup(x => x.GetReadyJob(It.IsAny <string>(), It.IsAny <TimeSpan>()));

            // Act
            runnerJobs.Start();
            await Task.Delay(TimeSpan.FromSeconds(1));

            await runnerJobs.Stop(cancellationToken);

            // Assert
            uncompletedTaskList.Verify(x => x.WhenAllCompleted(cancellationToken), Times.Once);
        }
示例#4
0
        public void IntervalStartJob_IsValid()
        {
            var defaultIntervalStartJob = TimeSpan.FromMilliseconds(100);

            var settings = new HorariumSettings();

            Assert.Equal(defaultIntervalStartJob, settings.IntervalStartJob);
        }
示例#5
0
 public ExecutorJob(
     IJobRepository jobRepository,
     IAdderJobs adderJobs,
     HorariumSettings settings)
 {
     _jobRepository = jobRepository;
     _adderJobs     = adderJobs;
     _settings      = settings;
 }
示例#6
0
 public RunnerJobs(IJobRepository jobRepository,
                   HorariumSettings settings,
                   JsonSerializerSettings jsonSerializerSettings,
                   IHorariumLogger horariumLogger, IExecutorJob executorJob)
 {
     _jobRepository          = jobRepository;
     _settings               = settings;
     _jsonSerializerSettings = jsonSerializerSettings;
     _horariumLogger         = horariumLogger;
     _executorJob            = executorJob;
 }
        private static void PrepareSettings(HorariumSettings settings, IServiceProvider serviceProvider)
        {
            if (settings.JobFactory is DefaultJobFactory)
            {
                settings.JobFactory = new JobFactory(serviceProvider);
            }

            if (settings.Logger is EmptyLogger)
            {
                settings.Logger = new HorariumLogger(serviceProvider.GetService <ILogger <HorariumLogger> >());
            }
        }
示例#8
0
 public RunnerJobs(IJobRepository jobRepository,
                   HorariumSettings settings,
                   JsonSerializerSettings jsonSerializerSettings,
                   IHorariumLogger horariumLogger, IExecutorJob executorJob,
                   IUncompletedTaskList uncompletedTaskList)
 {
     _jobRepository          = jobRepository;
     _settings               = settings;
     _jsonSerializerSettings = jsonSerializerSettings;
     _horariumLogger         = horariumLogger;
     _executorJob            = executorJob;
     _uncompletedTaskList    = uncompletedTaskList;
 }
        public void AddHorariumServer_DefaultSettings_ReplaceForAspNetCore()
        {
            var service = new ServiceCollection();

            var settings = new HorariumSettings();

            service.AddHorariumServer(Mock.Of <IJobRepository>(),
                                      provider => settings);

            var descriptor = service.Single(x => x.ServiceType == typeof(IHorarium));
            var horarium   = descriptor.ImplementationFactory(Mock.Of <IServiceProvider>());

            Assert.Equal(ServiceLifetime.Singleton, descriptor.Lifetime);
            Assert.Equal(typeof(IHorarium), descriptor.ServiceType);
            Assert.Equal(typeof(JobScopeFactory), settings.JobScopeFactory.GetType());
            Assert.Equal(typeof(HorariumLogger), settings.Logger.GetType());
            Assert.Equal(typeof(HorariumServer), horarium.GetType());

            Assert.Contains(service, x => x.ImplementationType == typeof(HorariumServerHostedService));
        }
        public void AddHorariumServer_CustomSettings_DontReplaceForAspNetCore()
        {
            var serviceMock = new Mock <IServiceCollection>();

            var service = serviceMock.Object;

            var settings = new HorariumSettings
            {
                JobScopeFactory = new JobScopeFactoryTest(),
                Logger          = new LoggerTest()
            };

            serviceMock.Setup(x => x.Add(It.IsAny <ServiceDescriptor>()))
            .Callback <ServiceDescriptor>(x => { });

            service.AddHorariumServer(Mock.Of <IJobRepository>(),
                                      provider => settings);

            Assert.Equal(typeof(JobScopeFactoryTest), settings.JobScopeFactory.GetType());
            Assert.Equal(typeof(LoggerTest), settings.Logger.GetType());
        }
        public void AddHorariumClient_DefaultSettings_ReplaceForAspNetCore()
        {
            var serviceMock = new Mock <IServiceCollection>();

            var service = serviceMock.Object;

            ServiceDescriptor descriptor = null;

            var settings = new HorariumSettings();

            serviceMock.Setup(x => x.Add(It.IsAny <ServiceDescriptor>()))
            .Callback <ServiceDescriptor>(x => descriptor = x);

            service.AddHorariumClient(Mock.Of <IJobRepository>(),
                                      provider => settings);

            var horarium = descriptor.ImplementationFactory(Mock.Of <IServiceProvider>());

            Assert.Equal(ServiceLifetime.Singleton, descriptor.Lifetime);
            Assert.Equal(typeof(IHorarium), descriptor.ServiceType);
            Assert.Equal(typeof(JobScopeFactory), settings.JobScopeFactory.GetType());
            Assert.Equal(typeof(HorariumLogger), settings.Logger.GetType());
            Assert.Equal(typeof(HorariumClient), horarium.GetType());
        }