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();
        }
Ejemplo n.º 7
0
        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);
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 11
0
        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();
        }
Ejemplo n.º 12
0
 public OneWayService(IOneWayService processor, IOneWayService errorProcessor)
 {
     _processor = processor;
     _errorProcessor = errorProcessor;
 }
Ejemplo n.º 13
0
 public OneWayService(IOneWayService processor, IOneWayService errorProcessor)
 {
     _processor      = processor;
     _errorProcessor = errorProcessor;
 }