public void ConsumerExceptionTest() { var cancellationTokenSource = new CancellationTokenSource(); var locker = new object(); var model = new Mock <IModel>(); model.Setup(x => x.QueueDeclare(It.IsAny <string>(), It.IsAny <bool>(), It.IsAny <bool>(), It.IsAny <bool>(), It.IsAny <IDictionary <string, object> >())) .Returns(new QueueDeclareOk(ModelBuilder.GetQueueName <TestDataContract>(null), 0, 0)); model.Setup(x => x.BasicQos(It.IsAny <uint>(), It.IsAny <ushort>(), It.IsAny <bool>())); model.Setup(x => x.BasicReject(It.IsAny <ulong>(), It.IsAny <bool>())); var connection = new Mock <IConnection>(); connection.Setup(x => x.CreateModel()).Returns(model.Object); var connectionManager = new Mock <IRabbitMqConnectionManager>(); connectionManager.Setup(x => x.GetConnection()).Returns(connection.Object); var logger = new Mock <ILogger>(); logger.Setup(x => x.Error(It.IsAny <Exception>(), It.IsAny <string>())); logger.Setup(x => x.Info(It.IsAny <string>())); var serializer = new Mock <ISerializer <TestDataContract> >(); serializer.Setup(x => x.Serialize(It.IsAny <TestDataContract>())).Returns(new ReadOnlyMemory <byte>()); serializer.Setup(x => x.Deserialize(It.IsAny <ReadOnlyMemory <byte> >())).Returns(new TestDataContract()); Task procMessage(TestDataContract dc, CancellationToken c) => Task.Factory.StartNew(() => { }); var consumer = new TestRabbitMqConsumer(connectionManager.Object, logger.Object, serializer.Object, procMessage); var container = new Mock <IWindsorContainer>(); container.Setup(x => x.Resolve <IAutorepairConsumer>()).Returns(consumer); container.Setup(x => x.Release(It.IsAny <IAutorepairConsumer>())); var consumers = new AutorepairConsumers <IAutorepairConsumer>(container.Object.Resolve <IAutorepairConsumer>, container.Object.Release, cancellationTokenSource.Token); consumers.Start(new AutorepairConsumersConfig { ConsumersCountLimit = 1 }); Task.Delay(1500).Wait(); container.Verify(x => x.Resolve <IAutorepairConsumer>(), Times.Exactly(1)); var basicConsumers = (IEnumerable)consumer.GetType().BaseType .GetField("_basicConsumers", BindingFlags.Instance | BindingFlags.NonPublic) .GetValue(consumer); var enumerator = basicConsumers.GetEnumerator(); while (enumerator.MoveNext()) { ((AsyncDefaultBasicConsumer)enumerator.Current).OnCancel().Wait(); } Task.Delay(1000).Wait(); container.Verify(x => x.Release(consumer), Times.Exactly(1)); container.Verify(x => x.Resolve <IAutorepairConsumer>(), Times.Exactly(2)); }
public void ConsumerExceptionTest() { var cancellationTokenSource = new CancellationTokenSource(); var locker = new object(); var queueName = ModelBuilder.GetQueueName <TestDataContract>(null); var processor = new Mock <ServiceBusProcessor>(); processor.Setup(x => x.StartProcessingAsync(It.IsAny <CancellationToken>())).Returns(Task.Factory.StartNew(() => { })); processor.Setup(x => x.StopProcessingAsync(It.IsAny <CancellationToken>())).Returns(Task.Factory.StartNew(() => { })); var client = new Mock <ServiceBusClient>(); client.Setup(x => x.CreateProcessor(queueName, It.IsAny <ServiceBusProcessorOptions>())).Returns(processor.Object); var connectionManager = new Mock <IAzureServiceBusConnectionManager>(); connectionManager.Setup(x => x.GetClient()).Returns(client.Object); var logger = new Mock <ILogger>(); logger.Setup(x => x.Error(It.IsAny <Exception>(), It.IsAny <string>())); logger.Setup(x => x.Info(It.IsAny <string>())); var serializer = new Mock <ISerializer <TestDataContract> >(); serializer.Setup(x => x.Serialize(It.IsAny <TestDataContract>())).Returns(new ReadOnlyMemory <byte>()); serializer.Setup(x => x.Deserialize(It.IsAny <ReadOnlyMemory <byte> >())).Returns(new TestDataContract()); Task procMessage(TestDataContract dc, CancellationToken c) => Task.Factory.StartNew(() => { }); var consumer = new TestRabbitMqConsumer(connectionManager.Object, logger.Object, serializer.Object, procMessage); var container = new Mock <IWindsorContainer>(); container.Setup(x => x.Resolve <IAutorepairConsumer>()).Returns(consumer); container.Setup(x => x.Release(It.IsAny <IAutorepairConsumer>())); var consumers = new AutorepairConsumers <IAutorepairConsumer>(container.Object.Resolve <IAutorepairConsumer>, container.Object.Release, cancellationTokenSource.Token); consumers.Start(new AutorepairConsumersConfig { ConsumersCountLimit = 1 }); Task.Delay(1500).Wait(); container.Verify(x => x.Resolve <IAutorepairConsumer>(), Times.Exactly(1)); var basicConsumers = (IEnumerable)consumer.GetType().BaseType .GetField("_basicConsumers", BindingFlags.Instance | BindingFlags.NonPublic) .GetValue(consumer); var enumerator = basicConsumers.GetEnumerator(); while (enumerator.MoveNext()) { ((AzureServiceBusBaseConsumer <TestDataContract> .BasicConsumer)enumerator.Current).Stop(true).Wait(); } Task.Delay(1000).Wait(); container.Verify(x => x.Release(consumer), Times.Exactly(1)); container.Verify(x => x.Resolve <IAutorepairConsumer>(), Times.Exactly(2)); }