public void RabbitMQBinding_NonTransactionalOneWayDelivery() { IOneWayService channel = _channelFactory.CreateChannel(); Data data = new Data { Id = 1, Name = "Rabbit" }; A.CallTo(_errorProcessorFake).DoesNothing(); A.CallTo(() => _processorFake.Say(A <Data> .Ignored)).Invokes(() => _ev.Set()); channel.Say(data); bool wait = _ev.Wait(TimeSpan.FromSeconds(10)); Assert.IsTrue(wait, "Service were not being invoked"); A.CallTo(() => _processorFake.Say(A <Data> ._)).WhenArgumentsMatch(collection => { data.ShouldBeEquivalentTo(collection[0]); return(true); }).MustHaveHappened(Repeated.Like(i => i == 1)); }
public void RabbitMQBinding_TransactionalConsumption() { IOneWayService channel = _channelFactory.CreateChannel(); Data data = new Data { Id = 1, Name = "Rabbit" }; A.CallTo(() => _errorProcessorFake.Say(A <Data> ._)).Throws(() => new Exception("Error while processing data")).Once(); A.CallTo(() => _processorFake.Say(A <Data> .Ignored)).Invokes(() => _ev.Set()); channel.Say(data); bool wait = _ev.Wait(TimeSpan.FromSeconds(10)); Assert.IsTrue(wait, "Service were not being invoked"); A.CallTo(() => _processorFake.Say(A <Data> ._)).WhenArgumentsMatch(collection => { data.ShouldBeEquivalentTo(collection[0]); return(true); }).MustHaveHappened(); }
public void TestInitialize() { _processorFake = A.Fake <IOneWayService>(); _host = new ServiceHost(new OneWayService(_processorFake, _errorProcessorFake)); const string serviceAddress = "amqp://localhost/myQueue?routingKey=OneWayService"; _host.AddServiceEndpoint(typeof(IOneWayService), new RabbitMQBinding { AutoBindExchange = "amq.direct", // If not null, queue will be automatically binded to the exchange using provided routingKey (if any) ExactlyOnce = true, // Transactional consumption, OneWayOnly = true, // Use False only if calback communication required //TTL = 1000, // Message time to leave in milliseconds //PersistentDelivery = true // If true, every message will be written to disk on rabbitMQ broker side before dispatching to the destination(s) }, serviceAddress); _host.Open(); const string clientAddress = "amqp://localhost/amq.direct?routingKey=OneWayService"; _channelFactory = new ChannelFactory <IOneWayService>(new RabbitMQBinding { OneWayOnly = true }, clientAddress); _channelFactory.Open(); }
public void RabbitMQBinding_TransactionalDispatching_ExceptionIfTransactionalChannelUsedOutOfTheTransactionScope() { IOneWayService channel = _channelFactory.CreateChannel(); Data data = new Data { Id = 1, Name = "Rabbit" }; A.CallTo(() => _errorProcessorFake.Say(A <Data> ._)).DoesNothing(); A.CallTo(() => _processorFake.Say(A <Data> .Ignored)).Invokes(() => _ev.Set()); using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.RequiresNew)) { channel.Say(data); // Complete the transaction transaction.Complete(); } bool wait = _ev.Wait(TimeSpan.FromSeconds(10)); Assert.IsTrue(wait, "Service were not being invoked"); // Same channel instance can't be used outsode transaction scope ((Action)(() => channel.Say(new Data()))).ShouldThrow <FaultException>(); }
public void RabbitMQBinding_TransactionalDispatching_MessagesCommited() { IOneWayService channel = _channelFactory.CreateChannel(); Data data = new Data { Id = 1, Name = "Rabbit" }; A.CallTo(() => _errorProcessorFake.Say(A <Data> ._)).DoesNothing(); A.CallTo(() => _processorFake.Say(A <Data> .Ignored)).Invokes(() => _ev.Set()); using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.RequiresNew)) { channel.Say(data); // Complete the transaction transaction.Complete(); } bool wait = _ev.Wait(TimeSpan.FromSeconds(10)); Assert.IsTrue(wait, "Service were not being invoked"); A.CallTo(() => _processorFake.Say(A <Data> ._)).WhenArgumentsMatch(collection => { data.ShouldBeEquivalentTo(collection[0]); return(true); }).MustHaveHappened(); }
public void RabbitMQBinding_TransactionalDispatching_MessagesRollbacked() { IOneWayService channel = _channelFactory.CreateChannel(); Data data = new Data { Id = 1, Name = "Rabbit" }; A.CallTo(() => _errorProcessorFake.Say(A <Data> ._)).DoesNothing(); A.CallTo(() => _processorFake.Say(A <Data> .Ignored)).Invokes(() => _ev.Set()); using (new TransactionScope(TransactionScopeOption.RequiresNew)) { channel.Say(data); channel.Say(data); // Do not call transaction complete } bool wait = _ev.Wait(TimeSpan.FromSeconds(10)); Assert.IsFalse(wait, "Service should not be invoked"); A.CallTo(() => _processorFake.Say(A <Data> ._)).MustNotHaveHappened(); }
public void RabbitMQBinding_DeliveryMessageInAllSupportedFromats_ReceiveInSingleChannel() { IOneWayService textChannel = _channelFactory.CreateChannel(); IOneWayService mtomChannel = _mtomFactory.CreateChannel(); IOneWayService binaryChannel = _binaryFactory.CreateChannel(); Blob data = new Blob { Id = 1, Data = new byte[1024] }; int receiveCounter = 0; A.CallTo(_errorProcessorFake).DoesNothing(); A.CallTo(() => _processorFake.LargeData(A <Blob> .Ignored)).Invokes(() => receiveCounter++); A.CallTo(() => _processorFake.Say(A <Data> .Ignored)).Invokes(() => _ev.Set()); textChannel.LargeData(data); mtomChannel.LargeData(data); binaryChannel.LargeData(data); textChannel.Say(new Data()); bool wait = _ev.Wait(TimeSpan.FromSeconds(10)); receiveCounter.Should().Be(3); wait.Should().BeTrue("Service were not being invoked"); }
public void SuccessfulOneWayCallGeneratesRequestEvent() { TestTelemetryChannel.Clear(); using (var host = new HostingContext <OneWayService, IOneWayService>()) { host.Open(); IOneWayService client = host.GetChannel(); client.SuccessfullOneWayCall(); } var req = TestTelemetryChannel.CollectedData() .FirstOrDefault(x => x is RequestTelemetry); Assert.IsNotNull(req); }
public void RabbitMQBinding_TransferLargeBinary_TextBaseSerialization() { IOneWayService channel = _channelFactory.CreateChannel(); Blob data = new Blob { Id = 1, Data = new byte[8 * 1024 * 1024] // 8MB }; A.CallTo(_errorProcessorFake).DoesNothing(); A.CallTo(() => _processorFake.LargeData(A <Blob> .Ignored)).Invokes(() => _ev.Set()); channel.LargeData(data); bool wait = _ev.Wait(TimeSpan.FromSeconds(10)); wait.Should().BeTrue(); A.CallTo(() => _processorFake.LargeData(A <Blob> ._)).MustHaveHappened(Repeated.Like(i => i == 1)); }
public void FailedOneWayCallGeneratesExceptionEvent() { TestTelemetryChannel.Clear(); var host = new HostingContext <OneWayService, IOneWayService>() .ExpectFailure(); using ( host ) { host.Open(); IOneWayService client = host.GetChannel(); try { client.FailureOneWayCall(); } catch { } } var req = TestTelemetryChannel.CollectedData() .FirstOrDefault(x => x is ExceptionTelemetry); Assert.IsNotNull(req); }
public void TestInitialize() { _processorFake = A.Fake<IOneWayService>(); _host = new ServiceHost(new OneWayService(_processorFake, _errorProcessorFake)); const string serviceAddress = "amqp://localhost/myQueue?routingKey=OneWayService"; _host.AddServiceEndpoint(typeof(IOneWayService), new RabbitMQBinding { AutoBindExchange = "amq.direct", // If not null, queue will be automatically binded to the exchange using provided routingKey (if any) ExactlyOnce = true, // Transactional consumption, OneWayOnly = true, // Use False only if calback communication required //TTL = 1000, // Message time to leave in milliseconds //PersistentDelivery = true // If true, every message will be written to disk on rabbitMQ broker side before dispatching to the destination(s) }, serviceAddress); _host.Open(); const string clientAddress = "amqp://localhost/amq.direct?routingKey=OneWayService"; _channelFactory = new ChannelFactory<IOneWayService>(new RabbitMQBinding { OneWayOnly = true }, clientAddress); _channelFactory.Open(); }
public OneWayService(IOneWayService processor, IOneWayService errorProcessor) { _processor = processor; _errorProcessor = errorProcessor; }