Example #1
0
        public async Task Should_start_new_queue_reader_when_lock_is_released()
        {
            //arrange
            var lockManager = new Mock <ISingletonLockManager>();

            lockManager.SetupSequence(x => x.TryLockAsync(It.IsAny <string>(), TimeSpan.FromSeconds(60), CancellationToken.None))
            .ReturnsAsync(Mock.Of <ISingletonLockHandle>())
            .ReturnsAsync((ISingletonLockHandle)null)
            .ReturnsAsync(Mock.Of <ISingletonLockHandle>());
            var underlyingReader = new Mock <IChannelReceiver>();

            underlyingReader.Setup(x => x.Settings).Returns(new Mock <IProcessingSettings>().Object);
            var singletonChannelReceiver = new SingletonChannelReceiver(underlyingReader.Object, lockManager.Object, Mock.Of <ILog>())
            {
                TimerIntervalMs = 1000
            };
            //act
            await singletonChannelReceiver.StartAsync(CancellationToken.None);

            await singletonChannelReceiver.StartAsync(CancellationToken.None);

            await Task.Delay(1500);

            //assert
            underlyingReader.Verify(x => x.StartAsync(CancellationToken.None), Times.Exactly(2));
        }
Example #2
0
        public async Task Should_restart_queue_reader_when_lock_is_lost()
        {
            //arrange
            var handle      = new Mock <ISingletonLockHandle>();
            var lockManager = new Mock <ISingletonLockManager>();

            lockManager.Setup(x => x.TryLockAsync(It.IsAny <string>(), TimeSpan.FromSeconds(60), CancellationToken.None))
            .ReturnsAsync(handle.Object);

            handle.SetupSequence(x => x.RenewAsync(It.IsAny <ILog>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(true)
            .Throws(new Exception())
            .ReturnsAsync(true);

            var underlyingReceiver = new Mock <IChannelReceiver>();

            underlyingReceiver.Setup(x => x.Settings).Returns(new Mock <IProcessingSettings>().Object);
            var singletonChannelReceiver = new SingletonChannelReceiver(underlyingReceiver.Object, lockManager.Object, Mock.Of <ILog>())
            {
                TimerInterval       = TimeSpan.FromSeconds(1),
                LockRefreshInterval = TimeSpan.FromSeconds(1)
            };
            //act
            await singletonChannelReceiver.StartAsync(CancellationToken.None);

            await Task.Delay(2000);

            //assert
            underlyingReceiver.Verify(x => x.StartAsync(It.IsAny <CancellationToken>()), Times.Exactly(2));
        }
        private IChannelReceiver GetQueueReaderStarter(IChannelReceiver channelReceiver, Type type)
        {
            if (typeof(ISingletonProcessor).IsAssignableFrom(type))
            {
                if (_configuration.SingletonLockManager == null)
                {
                    throw new SingletonLockManagerMissingException();
                }
                ConsoleWriter.WriteLine($"Setting {type.Name} in Singleton mode");
                var singletonStarter = new SingletonChannelReceiver(channelReceiver, _configuration.SingletonLockManager, _configuration.Log);
                return(singletonStarter);
            }

            return(channelReceiver);
        }
Example #4
0
        private IChannelReceiver WrapSingletonReceiver(IChannelReceiver channelReceiver, Type type)
        {
            if (typeof(ISingletonProcessor).IsAssignableFrom(type))
            {
                if (_configuration.SingletonLockManager == null)
                {
                    throw new SingletonLockManagerMissingException("There is no ISingletonLockManager specified, you cannot use the ISingletonProcessor directive without one");
                }
                ConsoleWriter.WriteLine($"Setting {type.Name} in Singleton mode");
                var singletonStarter = new SingletonChannelReceiver(channelReceiver, _configuration.SingletonLockManager, _configuration.Log);
                return(singletonStarter);
            }

            return(channelReceiver);
        }
Example #5
0
        public void Should_override_singleton_impacted_settings()
        {
            //arrange
            var lockManager      = new Mock <ISingletonLockManager>();
            var underlyingReader = new Mock <IChannelReceiver>();

            underlyingReader.Setup(x => x.Settings).Returns(new SingletonHorrificSettings());
            //act
            var starter = new SingletonChannelReceiver(underlyingReader.Object, lockManager.Object, Mock.Of <ILog>())
            {
                TimerIntervalMs = 1000
            };

            //assert
            starter.Settings.PrefetchCount.Should().Be(0);
            starter.Settings.MaxConcurrentCalls.Should().Be(1);
            starter.Settings.MessageLockTimeout.Should().Be(TimeSpan.MaxValue);
            starter.Settings.DeadLetterDeliveryLimit.Should().Be(1);
        }