예제 #1
0
        public void Should_create_exchange_and_auto_delete_request_queue_if_provide_serverId_and_exchange_not_empty()
        {
            // Arrange
            var model       = Substitute.For <IModel>();
            var routeFinder = Substitute.For <IRpcRouteFinder>();
            var instance    = Substitute.For <ISomeService>();
            var server      = new BurrowRpcServerCoordinator <ISomeService>(instance, routeFinder, "queue-connnection-string", "serverId");

            InternalDependencies.RpcQueueHelper = Substitute.For <IRpcQueueHelper>();
            InternalDependencies.RpcQueueHelper
            .When(x => x.CreateQueues(Arg.Any <string>(), Arg.Any <Action <IModel> >()))
            .Do(callInfo => callInfo.Arg <Action <IModel> >()(model));

            routeFinder.RequestQueue.Returns("ISomeService.serverId.RequestQueue");
            routeFinder.RequestExchangeType.Returns("direct");
            routeFinder.RequestExchangeName.Returns("ISomeService.Exchange");
            routeFinder.CreateExchangeAndQueue.Returns(true);

            // Action
            server.Start();

            // Assert
            model.Received(1).QueueDeclare("ISomeService.serverId.RequestQueue", true, false, true, Arg.Any <IDictionary>());
            model.Received(1).ExchangeDeclare("ISomeService.Exchange", "direct", true, false, null);
            model.Received(1).QueueBind("ISomeService.serverId.RequestQueue", "ISomeService.Exchange", "ISomeService.serverId.RequestQueue");
        }
예제 #2
0
        public void Should_create_exchange_and_auto_delete_request_queue_if_provide_serverId_and_exchange_not_empty()
        {
            // Arrange
            var model = Substitute.For<IModel>();
            var routeFinder = Substitute.For<IRpcRouteFinder>();
            var instance = Substitute.For<ISomeService>();
            var server = new BurrowRpcServerCoordinator<ISomeService>(instance, routeFinder, "queue-connnection-string", "serverId");
            InternalDependencies.RpcQueueHelper = Substitute.For<IRpcQueueHelper>();
            InternalDependencies.RpcQueueHelper
                .When(x => x.CreateQueues(Arg.Any<string>(), Arg.Any<Action<IModel>>()))
                .Do(callInfo => callInfo.Arg<Action<IModel>>()(model));

            routeFinder.RequestQueue.Returns("ISomeService.serverId.RequestQueue");
            routeFinder.RequestExchangeType.Returns("direct");
            routeFinder.RequestExchangeName.Returns("ISomeService.Exchange");
            routeFinder.CreateExchangeAndQueue.Returns(true);

            // Action
            server.Start();

            // Assert
            model.Received(1).QueueDeclare("ISomeService.serverId.RequestQueue", true, false, true, Arg.Any<IDictionary<string, object>>());
            model.Received(1).ExchangeDeclare("ISomeService.Exchange", "direct", true, false, null);
            model.Received(1).QueueBind("ISomeService.serverId.RequestQueue", "ISomeService.Exchange", "ISomeService.serverId.RequestQueue");
        }
예제 #3
0
        public void Should_subscribe_to_request_queue()
        {
            // Arrange
            var routeFinder = Substitute.For <IRpcRouteFinder>();
            var instance    = Substitute.For <ISomeService>();
            var server      = new BurrowRpcServerCoordinator <ISomeService>(instance, routeFinder, "queue-connnection-string");

            // Action
            server.Start();

            // Assert
            tunnel.Received(1).SubscribeAsync(Arg.Any <string>(), Arg.Any <Action <RpcRequest> >());
        }
예제 #4
0
        public void Should_create_tunnel_and_set_serializer_and_route_finder()
        {
            // Arrange
            var routeFinder = Substitute.For <IRpcRouteFinder>();
            var instance    = Substitute.For <ISomeService>();
            var server      = new BurrowRpcServerCoordinator <ISomeService>(instance, routeFinder, "queue-connnection-string");

            // Action
            server.Start();

            // Assert
            tunnel.Received(1).SetRouteFinder(Arg.Any <IRouteFinder>());
            tunnel.Received(1).SetSerializer(Arg.Any <ISerializer>());
        }
예제 #5
0
        public void Should_create_tunnel_and_set_serializer_and_route_finder()
        {
            // Arrange
            var routeFinder = Substitute.For<IRpcRouteFinder>();
            var instance = Substitute.For<ISomeService>();
            var server = new BurrowRpcServerCoordinator<ISomeService>(instance, routeFinder, "queue-connnection-string");

            // Action
            server.Start();

            // Assert
            tunnel.Received(1).SetRouteFinder(Arg.Any<IRouteFinder>());
            tunnel.Received(1).SetSerializer(Arg.Any<ISerializer>());
        }
예제 #6
0
        public void Should_invoke_method_on_real_instance_and_map_response_params()
        {
            // Arrange
            var routeFinder = Substitute.For <IRpcRouteFinder>();
            var instance    = Substitute.For <ISomeService>();
            var server      = new BurrowRpcServerCoordinator <ISomeService>(instance, routeFinder, "queue-connnection-string", "10");
            var request     = new RpcRequest
            {
                Id = Guid.NewGuid(),
                ResponseAddress = "Address",
                MethodName      = "Search",
                Params          = new Dictionary <string, object> {
                    { "page", (long)1 /* long value will be converted to proper int value */ }, { "query", new SomeMessage
                                                                                                  {
                                                                                                      Name = "vantheshark"
                                                                                                  } }
                }
            };
            var methodInfo = typeof(ISomeService).GetMethod("Search");

            methodMatcher.Match <ISomeService>(request)
            .Returns(methodInfo);

            var returnValue = new List <SomeMessage> {
                new SomeMessage {
                    Money = "$1"
                }, new SomeMessage {
                    Money = "$1"
                }
            };

            instance.Search(1, Arg.Is <SomeMessage>(arg => arg.Name == "vantheshark"))
            .Returns(returnValue);

            // Action
            server.Start();
            server.HandleMesage(request);

            // Assert
            tunnel.Received(1).Publish(Arg.Is <RpcResponse>(arg => arg.Exception == null &&
                                                            arg.ReturnValue == returnValue &&
                                                            arg.ChangedParams["query"] is SomeMessage &&
                                                            1.Equals(arg.ChangedParams["page"]) &&
                                                            arg.RequestId == request.Id), "Address");
        }
예제 #7
0
        public void Should_publish_nothing_if_msg_is_Async()
        {
            // Arrange
            var routeFinder = Substitute.For<IRpcRouteFinder>();
            var instance = Substitute.For<ISomeService>();
            var server = new BurrowRpcServerCoordinator<ISomeService>(instance, routeFinder, "queue-connnection-string", "10");
            var request = new RpcRequest
            {
                Id = Guid.NewGuid(),
            };

            // Action
            server.Start();
            server.HandleMesage(request);

            // Assert
            tunnel.DidNotReceive().Publish(Arg.Any<RpcResponse>(), Arg.Any<string>());
        }
예제 #8
0
        public void Should_publish_nothing_if_msg_is_Async()
        {
            // Arrange
            var routeFinder = Substitute.For <IRpcRouteFinder>();
            var instance    = Substitute.For <ISomeService>();
            var server      = new BurrowRpcServerCoordinator <ISomeService>(instance, routeFinder, "queue-connnection-string", "10");
            var request     = new RpcRequest
            {
                Id = Guid.NewGuid(),
            };

            // Action
            server.Start();
            server.HandleMesage(request);

            // Assert
            tunnel.DidNotReceive().Publish(Arg.Any <RpcResponse>(), Arg.Any <string>());
        }
예제 #9
0
        public void Should_publish_respones_with_Exception_if_method_not_match()
        {
            // Arrange
            var routeFinder = Substitute.For<IRpcRouteFinder>();
            var instance = Substitute.For<ISomeService>();
            var server = new BurrowRpcServerCoordinator<ISomeService>(instance, routeFinder, "queue-connnection-string", "10");
            var request = new RpcRequest
            {
                Id = Guid.NewGuid(),
                ResponseAddress = "Address"
            };

            // Action
            server.Start();
            server.HandleMesage(request);

            // Assert
            tunnel.Received(1).Publish(Arg.Is<RpcResponse>(arg => arg.Exception != null && arg.RequestId == request.Id), "Address");
        }
예제 #10
0
        public void Should_print_warn_msg_and_return_if_msg_is_expired()
        {
            // Arrange
            var routeFinder = Substitute.For<IRpcRouteFinder>();
            var instance = Substitute.For<ISomeService>();
            var server = new BurrowRpcServerCoordinator<ISomeService>(instance, routeFinder, "queue-connnection-string", "10");

            var request = new RpcRequest
            {
                UtcExpiryTime = DateTime.UtcNow.AddSeconds(-10)
            };

            // Action
            server.HandleMesage(request);

            // Assert
            Global.DefaultWatcher.Received(1).WarnFormat(Arg.Any<string>(), Arg.Any<object[]>());
            tunnel.DidNotReceive().Publish(Arg.Any<RpcResponse>(), Arg.Any<string>());
        }
예제 #11
0
        public void Should_publish_respones_with_Exception_if_method_not_match()
        {
            // Arrange
            var routeFinder = Substitute.For <IRpcRouteFinder>();
            var instance    = Substitute.For <ISomeService>();
            var server      = new BurrowRpcServerCoordinator <ISomeService>(instance, routeFinder, "queue-connnection-string", "10");
            var request     = new RpcRequest
            {
                Id = Guid.NewGuid(),
                ResponseAddress = "Address"
            };

            // Action
            server.Start();
            server.HandleMesage(request);

            // Assert
            tunnel.Received(1).Publish(Arg.Is <RpcResponse>(arg => arg.Exception != null && arg.RequestId == request.Id), "Address");
        }
예제 #12
0
        public void Should_print_warn_msg_and_return_if_msg_is_expired()
        {
            // Arrange
            var routeFinder = Substitute.For <IRpcRouteFinder>();
            var instance    = Substitute.For <ISomeService>();
            var server      = new BurrowRpcServerCoordinator <ISomeService>(instance, routeFinder, "queue-connnection-string", "10");

            var request = new RpcRequest
            {
                UtcExpiryTime = DateTime.UtcNow.AddSeconds(-10)
            };

            // Action
            server.HandleMesage(request);

            // Assert
            Global.DefaultWatcher.Received(1).WarnFormat(Arg.Any <string>(), Arg.Any <object[]>());
            tunnel.DidNotReceive().Publish(Arg.Any <RpcResponse>(), Arg.Any <string>());
        }
예제 #13
0
        public void Should_invoke_method_on_real_instance_and_map_response_params()
        {
            // Arrange
            var routeFinder = Substitute.For<IRpcRouteFinder>();
            var instance = Substitute.For<ISomeService>();
            var server = new BurrowRpcServerCoordinator<ISomeService>(instance, routeFinder, "queue-connnection-string", "10");
            var request = new RpcRequest
            {
                Id = Guid.NewGuid(),
                ResponseAddress = "Address",
                MethodName = "Search",
                Params = new Dictionary<string, object> { { "page", 1 }, {"query", new SomeMessage
                {
                    Name = "vantheshark"
                }}}
            };
            var methodInfo = typeof(ISomeService).GetMethod("Search");
            methodMatcher.Match<ISomeService>(request)
                         .Returns(methodInfo);

            var returnValue = new List<SomeMessage> { new SomeMessage { Money = "$1" }, new SomeMessage { Money = "$1" } };
            instance.Search(1, Arg.Is<SomeMessage>(arg => arg.Name == "vantheshark"))
                    .Returns(returnValue);

            // Action
            server.Start();
            server.HandleMesage(request);

            // Assert
            tunnel.Received(1).Publish(Arg.Is<RpcResponse>(arg => arg.Exception == null && 
                                                                  arg.ReturnValue == returnValue &&
                                                                  arg.ChangedParams["query"] is SomeMessage &&
                                                                  1.Equals(arg.ChangedParams["page"]) &&
                                                                  arg.RequestId == request.Id), "Address");
        }
예제 #14
0
        public void Should_subscribe_to_request_queue()
        {
            // Arrange
            var routeFinder = Substitute.For<IRpcRouteFinder>();
            var instance = Substitute.For<ISomeService>();
            var server = new BurrowRpcServerCoordinator<ISomeService>(instance, routeFinder, "queue-connnection-string");

            // Action
            server.Start();

            // Assert
            tunnel.Received(1).SubscribeAsync(Arg.Any<string>(), Arg.Any<Action<RpcRequest>>());
        }