예제 #1
0
        public void Should_catch_all_exception()
        {
            // Arrange
            var newChannel = Substitute.For<IModel>();
            newChannel.IsOpen.Returns(true);
            newChannel.When(x => x.QueueDeclarePassive(Arg.Any<string>()))
                      .Do(callInfo => { throw new Exception("Some errors happen");});
            
            var routeFinder = Substitute.For<IRouteFinder>();
            var durableConnection = Substitute.For<IDurableConnection>();
            durableConnection.IsConnected.Returns(true);
            //durableConnection.ConnectionFactory.Returns(Substitute.For<ConnectionFactory>());
            durableConnection.CreateChannel().Returns(newChannel);
            var tunnel = new RabbitTunnelWithPriorityQueuesSupport(routeFinder, durableConnection);

            // Action
            var count = tunnel.GetMessageCount(new PrioritySubscriptionOption<Customer>
            {
                SubscriptionName = "subscriptionName",
                MaxPriorityLevel = 4
            });

            // Assert
            Assert.AreEqual(0, count);
            newChannel.Received(1).QueueDeclarePassive(Arg.Any<string>());
        }
        public static RabbitTunnelWithPriorityQueuesSupport CreateTunnel(IModel channel, out IDurableConnection durableConnection, bool isChannelOpen = true)
        {
            if (channel != null)
            {
                channel.IsOpen.Returns(isChannelOpen);
            }

            var routeFinder = Substitute.For <IRouteFinder>();

            routeFinder.FindQueueName <Customer>(null).ReturnsForAnyArgs("Queue");
            durableConnection = Substitute.For <IDurableConnection>();
            //durableConnection.ConnectionFactory.Returns(Substitute.For<ConnectionFactory>());
            var conn = durableConnection;

            durableConnection.When(x => x.Connect()).Do(callInfo => // Because this is a mock objectd
            {
                //Rase connected event
                conn.Connected += Raise.Event <Action>();
                conn.IsConnected.Returns(true);
            });
            durableConnection.CreateChannel().Returns(channel);

            var tunnel = new RabbitTunnelWithPriorityQueuesSupport(routeFinder, durableConnection);

            tunnel.OnOpened += () => { };
            tunnel.OnClosed += () => { };
            return(tunnel);
        }
예제 #3
0
        public void Should_catch_all_exception()
        {
            // Arrange
            var newChannel = Substitute.For <IModel>();

            newChannel.IsOpen.Returns(true);
            newChannel.When(x => x.QueueDeclarePassive(Arg.Any <string>()))
            .Do(callInfo => { throw new Exception("Some errors happen"); });

            var routeFinder       = Substitute.For <IRouteFinder>();
            var durableConnection = Substitute.For <IDurableConnection>();

            durableConnection.IsConnected.Returns(true);
            durableConnection.ConnectionFactory.Returns(Substitute.For <ConnectionFactory>());
            durableConnection.CreateChannel().Returns(newChannel);
            var tunnel = new RabbitTunnelWithPriorityQueuesSupport(routeFinder, durableConnection);

            // Action
            var count = tunnel.GetMessageCount(new PrioritySubscriptionOption <Customer>
            {
                SubscriptionName = "subscriptionName",
                MaxPriorityLevel = 4
            });

            // Assert
            Assert.AreEqual((uint)0, count);
            newChannel.Received(1).QueueDeclarePassive(Arg.Any <string>());
        }
예제 #4
0
        public void Should_not_overwrite_the_priority_if_customer_headers_has_Priority_value_set()
        {
            // Arrange
            var newChannel = Substitute.For <IModel>();

            newChannel.IsOpen.Returns(true);
            var routeFinder       = Substitute.For <IRouteFinder>();
            var durableConnection = Substitute.For <IDurableConnection>();

            durableConnection.ConnectionFactory.Returns(Substitute.For <ConnectionFactory>());
            durableConnection.When(x => x.Connect()).Do(callInfo =>
            {
                durableConnection.Connected += Raise.Event <Action>();
                durableConnection.IsConnected.Returns(true);
            });


            durableConnection.CreateChannel().Returns(newChannel);
            var tunnel = new RabbitTunnelWithPriorityQueuesSupport(routeFinder, durableConnection);

            // Action
            tunnel.Publish("Muahaha", 10, new Dictionary <string, object> {
                { "Priority", "100" }, { "AnotherHeaderKey", "something" }
            });

            // Assert
            routeFinder.Received(1).FindRoutingKey <string>();
            newChannel.Received(1).BasicPublish(Arg.Any <string>(),
                                                Arg.Any <string>(),
                                                Arg.Is <IBasicProperties>(arg => arg.Headers["Priority"].ToString() == "10" && arg.Headers["AnotherHeaderKey"].ToString() == "something"),
                                                Arg.Any <byte[]>());
        }
예제 #5
0
        public void Should_not_overwrite_the_priority_if_customer_headers_has_Priority_value_set()
        {
            // Arrange
            var newChannel = Substitute.For<IModel>();
            newChannel.IsOpen.Returns(true);
            var routeFinder = Substitute.For<IRouteFinder>();
            var durableConnection = Substitute.For<IDurableConnection>();
            //durableConnection.ConnectionFactory.Returns(Substitute.For<ConnectionFactory>());
            durableConnection.When(x => x.Connect()).Do(callInfo =>
            {
                durableConnection.Connected += Raise.Event<Action>();
                durableConnection.IsConnected.Returns(true);
            });


            durableConnection.CreateChannel().Returns(newChannel);
            var tunnel = new RabbitTunnelWithPriorityQueuesSupport(routeFinder, durableConnection);

            // Action
            tunnel.Publish("Muahaha", 10, new Dictionary<string, object> { { "Priority", "100" }, { "AnotherHeaderKey", "something" } });

            // Assert
            routeFinder.Received(1).FindRoutingKey<string>();
            newChannel.Received(1).BasicPublish(Arg.Any<string>(), 
                                                Arg.Any<string>(),
                                                Arg.Is<IBasicProperties>(arg => arg.Headers["Priority"].ToString() == "10" && arg.Headers["AnotherHeaderKey"].ToString() == "something"), 
                                                Arg.Any<byte[]>());
        }
예제 #6
0
        public void Should_return_the_messagecount()
        {
            // Arrange
            var newChannel = Substitute.For <IModel>();

            newChannel.QueueDeclarePassive(Arg.Any <string>()).Returns(new QueueDeclareOk("", 100, 0));
            newChannel.IsOpen.Returns(true);
            var routeFinder       = Substitute.For <IRouteFinder>();
            var durableConnection = Substitute.For <IDurableConnection>();

            durableConnection.IsConnected.Returns(true);
            durableConnection.ConnectionFactory.Returns(Substitute.For <ConnectionFactory>());
            durableConnection.CreateChannel().Returns(newChannel);
            var tunnel = new RabbitTunnelWithPriorityQueuesSupport(routeFinder, durableConnection);

            // Action
            var count = tunnel.GetMessageCount(new PrioritySubscriptionOption <Customer>
            {
                SubscriptionName = "subscriptionName",
                MaxPriorityLevel = 4
            });

            // Assert
            Assert.AreEqual((uint)500, count);
        }
예제 #7
0
        public void Should_use_route_finder_to_find_routing_key_then_publish_serialized_msg()
        {
            // Arrange
            var newChannel = Substitute.For<IModel>();
            newChannel.IsOpen.Returns(true);
            var routeFinder = Substitute.For<IRouteFinder>();
            var durableConnection = Substitute.For<IDurableConnection>();
            //durableConnection.ConnectionFactory.Returns(Substitute.For<ConnectionFactory>());
            durableConnection.When(x => x.Connect()).Do(callInfo =>
            {
                durableConnection.Connected += Raise.Event<Action>();
                durableConnection.IsConnected.Returns(true);
            });


            durableConnection.CreateChannel().Returns(newChannel);
            var tunnel = new RabbitTunnelWithPriorityQueuesSupport(routeFinder, durableConnection);

            // Action
            tunnel.Publish("Muahaha", 10);

            // Assert
            routeFinder.Received().FindRoutingKey<string>();
            newChannel.Received().BasicPublish(Arg.Any<string>(), Arg.Any<string>(), Arg.Is<IBasicProperties>(arg => arg.Headers["Priority"].ToString() == "10"), Arg.Any<byte[]>());
        }
예제 #8
0
        public void Should_use_route_finder_to_find_routing_key_then_publish_serialized_msg()
        {
            // Arrange
            var newChannel = Substitute.For <IModel>();

            newChannel.IsOpen.Returns(true);
            var routeFinder       = Substitute.For <IRouteFinder>();
            var durableConnection = Substitute.For <IDurableConnection>();

            durableConnection.ConnectionFactory.Returns(Substitute.For <ConnectionFactory>());
            durableConnection.When(x => x.Connect()).Do(callInfo =>
            {
                durableConnection.Connected += Raise.Event <Action>();
                durableConnection.IsConnected.Returns(true);
            });


            durableConnection.CreateChannel().Returns(newChannel);
            var tunnel = new RabbitTunnelWithPriorityQueuesSupport(routeFinder, durableConnection);

            // Action
            tunnel.Publish("Muahaha", 10);

            // Assert
            routeFinder.Received().FindRoutingKey <string>();
            newChannel.Received().BasicPublish(Arg.Any <string>(), Arg.Any <string>(), Arg.Is <IBasicProperties>(arg => arg.Headers["Priority"].ToString() == "10"), Arg.Any <byte[]>());
        }
        public static RabbitTunnelWithPriorityQueuesSupport CreateTunnel(IModel channel, out IDurableConnection durableConnection, bool isChannelOpen = true)
        {
            if (channel != null)
            {
                channel.IsOpen.Returns(isChannelOpen);
            }

            var routeFinder = Substitute.For<IRouteFinder>();
            routeFinder.FindQueueName<Customer>(null).ReturnsForAnyArgs("Queue");
            durableConnection = Substitute.For<IDurableConnection>();
            durableConnection.ConnectionFactory.Returns(Substitute.For<ConnectionFactory>());
            var conn = durableConnection;
            durableConnection.When(x => x.Connect()).Do(callInfo => // Because this is a mock objectd
            {
                //Rase connected event
                conn.Connected += Raise.Event<Action>();
                conn.IsConnected.Returns(true);
            });
            durableConnection.CreateChannel().Returns(channel);

            var tunnel = new RabbitTunnelWithPriorityQueuesSupport(routeFinder, durableConnection);
            tunnel.OnOpened += () => { };
            tunnel.OnClosed += () => { };
            return tunnel;
        }
예제 #10
0
        public void Can_construct_with_provided_route_finder_and_durable_connection()
        {
            // Arrange
            var routeFinder       = Substitute.For <IRouteFinder>();
            var durableConnection = Substitute.For <IDurableConnection>();
            ////durableConnection.ConnectionFactory.Returns(Substitute.For<ConnectionFactory>());

            // Action
            var tunnel = new RabbitTunnelWithPriorityQueuesSupport(routeFinder, durableConnection);

            // Assert
            Assert.IsNotNull(tunnel);
        }
예제 #11
0
        public void Can_construct_with_provided_route_finder_and_durable_connection()
        {
            // Arrange
            var routeFinder = Substitute.For<IRouteFinder>();
            var durableConnection = Substitute.For<IDurableConnection>();
            durableConnection.ConnectionFactory.Returns(Substitute.For<ConnectionFactory>());

            // Action
            var tunnel = new RabbitTunnelWithPriorityQueuesSupport(routeFinder, durableConnection);

            // Assert
            Assert.IsNotNull(tunnel);
        }
예제 #12
0
        private ITunnel Create(DurableConnection durableConnection, IRabbitWatcher rabbitWatcher)
        {
            var errorHandler = new ConsumerErrorHandler(() => durableConnection.ConnectionFactory, Global.DefaultSerializer, rabbitWatcher);
            var msgHandlerFactory = new PriorityMessageHandlerFactory(errorHandler, Global.DefaultSerializer, rabbitWatcher);
            var consumerManager = new ConsumerManager(rabbitWatcher, msgHandlerFactory, Global.DefaultSerializer);

            var tunnel = new RabbitTunnelWithPriorityQueuesSupport(consumerManager,
                                                                   rabbitWatcher,
                                                                   new DefaultRouteFinder(),
                                                                   durableConnection,
                                                                   Global.DefaultSerializer,
                                                                   Global.DefaultCorrelationIdGenerator,
                                                                   Global.DefaultPersistentMode);
            tunnel.AddSerializerObserver(errorHandler);
            tunnel.AddSerializerObserver(msgHandlerFactory);
            tunnel.AddSerializerObserver(consumerManager);
            return tunnel;
        }
예제 #13
0
        public void Should_throw_exception_if_dedicated_publish_channel_is_not_created_properly()
        {
            // Arrange
            var newChannel = Substitute.For<IModel>();
            newChannel.IsOpen.Returns(true);
            var routeFinder = Substitute.For<IRouteFinder>();
            var durableConnection = Substitute.For<IDurableConnection>();
            //durableConnection.ConnectionFactory.Returns(Substitute.For<ConnectionFactory>());
            durableConnection.When(x => x.Connect()).Do(callInfo =>
            {
                durableConnection.Connected += Raise.Event<Action>();
                durableConnection.IsConnected.Returns(true);
            });
            
            var tunnel = new RabbitTunnelWithPriorityQueuesSupport(routeFinder, durableConnection);

            // Action
            tunnel.Publish("Muahaha", 10);
        }
예제 #14
0
        public void Should_throw_exception_if_dedicated_publish_channel_is_not_created_properly()
        {
            // Arrange
            var newChannel = Substitute.For <IModel>();

            newChannel.IsOpen.Returns(true);
            var routeFinder       = Substitute.For <IRouteFinder>();
            var durableConnection = Substitute.For <IDurableConnection>();

            durableConnection.ConnectionFactory.Returns(Substitute.For <ConnectionFactory>());
            durableConnection.When(x => x.Connect()).Do(callInfo =>
            {
                durableConnection.Connected += Raise.Event <Action>();
                durableConnection.IsConnected.Returns(true);
            });

            var tunnel = new RabbitTunnelWithPriorityQueuesSupport(routeFinder, durableConnection);

            // Action
            tunnel.Publish("Muahaha", 10);
        }
예제 #15
0
        public void Should_return_the_messagecount()
        {
            // Arrange
            var newChannel = Substitute.For<IModel>();
            newChannel.QueueDeclarePassive(Arg.Any<string>()).Returns(new QueueDeclareOk("", 100, 0));
            newChannel.IsOpen.Returns(true);
            var routeFinder = Substitute.For<IRouteFinder>();
            var durableConnection = Substitute.For<IDurableConnection>();
            durableConnection.IsConnected.Returns(true);
            //durableConnection.ConnectionFactory.Returns(Substitute.For<ConnectionFactory>());
            durableConnection.CreateChannel().Returns(newChannel);
            var tunnel = new RabbitTunnelWithPriorityQueuesSupport(routeFinder, durableConnection);

            // Action
            var count = tunnel.GetMessageCount(new PrioritySubscriptionOption<Customer>
            {
                SubscriptionName = "subscriptionName",
                MaxPriorityLevel = 4
            });

            // Assert
            Assert.AreEqual(500, count);
        }
예제 #16
0
        public void Should_throw_exception_if_publish_failed()
        {
            // Arrange
            var newChannel = Substitute.For <IModel>();

            newChannel.IsOpen.Returns(true);
            var routeFinder = Substitute.For <IRouteFinder>();

            routeFinder.When(x => x.FindExchangeName <string>()).Do(callInfo => { throw new Exception("Test message"); });
            var durableConnection = Substitute.For <IDurableConnection>();

            durableConnection.ConnectionFactory.Returns(Substitute.For <ConnectionFactory>());
            durableConnection.When(x => x.Connect()).Do(callInfo =>
            {
                durableConnection.Connected += Raise.Event <Action>();
                durableConnection.IsConnected.Returns(true);
            });

            durableConnection.CreateChannel().Returns(newChannel);
            var tunnel = new RabbitTunnelWithPriorityQueuesSupport(routeFinder, durableConnection);

            // Action
            tunnel.Publish("Muahaha", 10);
        }
예제 #17
0
        public void Should_throw_exception_if_publish_failed()
        {
            // Arrange
            var newChannel = Substitute.For<IModel>();
            newChannel.IsOpen.Returns(true);
            var routeFinder = Substitute.For<IRouteFinder>();
            routeFinder.When(x =>x.FindExchangeName<string>()).Do(callInfo => { throw new Exception("Test message");});
            var durableConnection = Substitute.For<IDurableConnection>();
            //durableConnection.ConnectionFactory.Returns(Substitute.For<ConnectionFactory>());
            durableConnection.When(x => x.Connect()).Do(callInfo =>
            {
                durableConnection.Connected += Raise.Event<Action>();
                durableConnection.IsConnected.Returns(true);
            });

            durableConnection.CreateChannel().Returns(newChannel);
            var tunnel = new RabbitTunnelWithPriorityQueuesSupport(routeFinder, durableConnection);

            // Action
            tunnel.Publish("Muahaha", 10);
        }