public void MapGrpcService_ConventionBuilder_AddsMetadata()
        {
            // Arrange
            var services = ServicesHelpers.CreateServices();

            var routeBuilder = CreateTestEndpointRouteBuilder(services.BuildServiceProvider(validateScopes: true));

            // Act
            routeBuilder.MapGrpcService <GreeterWithAttributeService>().Add(builder =>
            {
                builder.Metadata.Add(new CustomMetadata());
            });

            // Assert
            var endpoints = routeBuilder.DataSources
                            .SelectMany(ds => ds.Endpoints)
                            .Where(e => e.Metadata.GetMetadata <GrpcMethodMetadata>() != null)
                            .ToList();

            Assert.AreEqual(2, endpoints.Count);

            var routeEndpoint1 = (RouteEndpoint)endpoints[0];

            Assert.AreEqual("/greet.Greeter/SayHello", routeEndpoint1.RoutePattern.RawText);
            Assert.NotNull(routeEndpoint1.Metadata.GetMetadata <CustomMetadata>());

            var routeEndpoint2 = (RouteEndpoint)endpoints[1];

            Assert.AreEqual("/greet.Greeter/SayHellos", routeEndpoint2.RoutePattern.RawText);
            Assert.NotNull(routeEndpoint2.Metadata.GetMetadata <CustomMetadata>());
        }
Exemplo n.º 2
0
        public void MapGrpcService_ServiceWithAttributeAndBuilder_TestMetdataPrecedence()
        {
            // Arrange
            var services = ServicesHelpers.CreateServices();

            var routeBuilder = CreateTestEndpointRouteBuilder(services.BuildServiceProvider(validateScopes: true));

            // Act
            routeBuilder.MapGrpcService <GreeterServiceWithMetadataAttributes>().Add(builder =>
            {
                builder.Metadata.Add(new CustomAttribute("Builder"));
            });

            // Assert
            var endpoints = routeBuilder.DataSources
                            .SelectMany(ds => ds.Endpoints)
                            .Where(e => e.Metadata.GetMetadata <GrpcMethodMetadata>() != null)
                            .ToList();

            Assert.AreEqual(2, endpoints.Count);

            var routeEndpoint1 = (RouteEndpoint)endpoints[0];

            Assert.AreEqual("/greet.Greeter/SayHello", routeEndpoint1.RoutePattern.RawText);

            var orderedMetadata = routeEndpoint1.Metadata.GetOrderedMetadata <CustomAttribute>().ToList();

            Assert.AreEqual("Class", orderedMetadata[0].Value);
            Assert.AreEqual("Method", orderedMetadata[1].Value);
            Assert.AreEqual("Builder", orderedMetadata[2].Value);

            Assert.AreEqual("Builder", routeEndpoint1.Metadata.GetMetadata <CustomAttribute>()?.Value);
        }
Exemplo n.º 3
0
        public void MapGrpcService_ServiceWithAttribute_AddsAttributesAsMetadata()
        {
            // Arrange
            var services = ServicesHelpers.CreateServices();

            var routeBuilder = CreateTestEndpointRouteBuilder(services.BuildServiceProvider(validateScopes: true));

            // Act
            routeBuilder.MapGrpcService <GreeterServiceWithMetadataAttributes>();

            // Assert
            var endpoints = routeBuilder.DataSources
                            .SelectMany(ds => ds.Endpoints)
                            .Where(e => e.Metadata.GetMetadata <GrpcMethodMetadata>() != null)
                            .ToList();

            Assert.AreEqual(2, endpoints.Count);

            var routeEndpoint1 = (RouteEndpoint)endpoints[0];

            Assert.AreEqual("/greet.Greeter/SayHello", routeEndpoint1.RoutePattern.RawText);
            Assert.AreEqual("Method", routeEndpoint1.Metadata.GetMetadata <CustomAttribute>()?.Value);

            var routeEndpoint2 = (RouteEndpoint)endpoints[1];

            Assert.AreEqual("/greet.Greeter/SayHellos", routeEndpoint2.RoutePattern.RawText);
            Assert.AreEqual("Class", routeEndpoint2.Metadata.GetMetadata <CustomAttribute>()?.Value);
        }
Exemplo n.º 4
0
        private void BindServiceCore <TService>() where TService : class
        {
            // Arrange
            var services = ServicesHelpers.CreateServices();

            var routeBuilder = CreateTestEndpointRouteBuilder(services.BuildServiceProvider(validateScopes: true));

            // Act
            routeBuilder.MapGrpcService <TService>();

            // Assert
            var endpoints = routeBuilder.DataSources
                            .SelectMany(ds => ds.Endpoints)
                            .Where(e => e.Metadata.GetMetadata <GrpcMethodMetadata>() != null)
                            .ToList();

            Assert.AreEqual(2, endpoints.Count);

            var routeEndpoint1 = (RouteEndpoint)endpoints[0];

            Assert.AreEqual("/greet.Greeter/SayHello", routeEndpoint1.RoutePattern.RawText);
            Assert.AreEqual("POST", routeEndpoint1.Metadata.GetMetadata <IHttpMethodMetadata>()?.HttpMethods.Single());
            Assert.AreEqual("/greet.Greeter/SayHello", routeEndpoint1.Metadata.GetMetadata <GrpcMethodMetadata>()?.Method.FullName);

            var routeEndpoint2 = (RouteEndpoint)endpoints[1];

            Assert.AreEqual("/greet.Greeter/SayHellos", routeEndpoint2.RoutePattern.RawText);
            Assert.AreEqual("POST", routeEndpoint2.Metadata.GetMetadata <IHttpMethodMetadata>()?.HttpMethods.Single());
            Assert.AreEqual("/greet.Greeter/SayHellos", routeEndpoint2.Metadata.GetMetadata <GrpcMethodMetadata>()?.Method.FullName);
        }
Exemplo n.º 5
0
        public void MapGrpcService_CantBind_RaiseError()
        {
            // Arrange
            var services = ServicesHelpers.CreateServices();

            var routeBuilder = CreateTestEndpointRouteBuilder(services.BuildServiceProvider(validateScopes: true));

            // Act & Assert
            var ex = Assert.Throws <InvalidOperationException>(() => routeBuilder.MapGrpcService <ErrorService>());

            Assert.AreEqual("Error binding gRPC service 'ErrorService'.", ex.Message);
            Assert.AreEqual("Error!", ex.InnerException?.InnerException?.Message);
        }
        public void MapGrpcService_IgnoreUnknownServicesDefault_RegisterUnknownHandler()
        {
            // Arrange
            var services = ServicesHelpers.CreateServices();

            var routeBuilder = CreateTestEndpointRouteBuilder(services.BuildServiceProvider(validateScopes: true));

            // Act
            routeBuilder.MapGrpcService <GreeterServiceWithMetadataAttributes>();

            // Assert
            var endpoints = routeBuilder.DataSources
                            .SelectMany(ds => ds.Endpoints)
                            .ToList();

            Assert.IsNotNull(endpoints.SingleOrDefault(e => e.DisplayName == "gRPC - Unimplemented service"));
            Assert.IsNotNull(endpoints.SingleOrDefault(e => e.DisplayName == "gRPC - Unimplemented method for greet.Greeter"));
        }
Exemplo n.º 7
0
        public void MapGrpcService_NoMatchingCompressionProvider_ThrowError()
        {
            // Arrange
            var services = ServicesHelpers.CreateServices(options =>
            {
                options.ResponseCompressionAlgorithm = "DOES_NOT_EXIST";
            });

            var routeBuilder = CreateTestEndpointRouteBuilder(services.BuildServiceProvider(validateScopes: true));

            // Act
            var ex = Assert.Throws <InvalidOperationException>(() =>
            {
                routeBuilder.MapGrpcService <GreeterWithAttributeService>();
            });

            // Assert
            Assert.AreEqual("The configured response compression algorithm 'DOES_NOT_EXIST' does not have a matching compression provider.", ex.Message);
        }
Exemplo n.º 8
0
        public async Task Create_ConfiguredGrpcEndpoint_EndpointReturnedFromReflectionService()
        {
            // Arrange
            var endpointRouteBuilder = new TestEndpointRouteBuilder();

            var services = ServicesHelpers.CreateServices();

            services.AddGrpcReflection();
            services.AddRouting();
            services.AddSingleton <EndpointDataSource>(s =>
            {
                return(new CompositeEndpointDataSource(endpointRouteBuilder.DataSources));
            });

            var serviceProvider = services.BuildServiceProvider(validateScopes: true);

            endpointRouteBuilder.ServiceProvider = serviceProvider;
            endpointRouteBuilder.MapGrpcService <GreeterService>();

            // Act
            var service = serviceProvider.GetRequiredService <ReflectionServiceImpl>();

            var reader = new TestAsyncStreamReader
            {
                Current = new ServerReflectionRequest
                {
                    ListServices = "" // list all services
                }
            };
            var writer  = new TestServerStreamWriter <ServerReflectionResponse>();
            var context = HttpContextServerCallContextHelper.CreateServerCallContext();

            await service.ServerReflectionInfo(reader, writer, context);

            // Assert
            Assert.AreEqual(1, writer.Responses.Count);
            Assert.AreEqual(1, writer.Responses[0].ListServicesResponse.Service.Count);

            var serviceResponse = writer.Responses[0].ListServicesResponse.Service[0];

            Assert.AreEqual("greet.Greeter", serviceResponse.Name);
        }
Exemplo n.º 9
0
        private static async Task <TestServerStreamWriter <ServerReflectionResponse> > ConfigureReflectionServerAndCallAsync(Action <IEndpointRouteBuilder> action)
        {
            // Arrange
            var endpointRouteBuilder = new TestEndpointRouteBuilder();

            var services = ServicesHelpers.CreateServices();

            services.AddGrpcReflection();
            services.AddRouting();
            services.AddSingleton <EndpointDataSource>(s =>
            {
                return(new CompositeEndpointDataSource(endpointRouteBuilder.DataSources));
            });

            var serviceProvider = services.BuildServiceProvider(validateScopes: true);

            endpointRouteBuilder.ServiceProvider = serviceProvider;

            action(endpointRouteBuilder);

            // Act
            var service = serviceProvider.GetRequiredService <ReflectionServiceImpl>();

            var reader = new TestAsyncStreamReader
            {
                Current = new ServerReflectionRequest
                {
                    ListServices = "" // list all services
                }
            };
            var writer  = new TestServerStreamWriter <ServerReflectionResponse>();
            var context = HttpContextServerCallContextHelper.CreateServerCallContext();

            await service.ServerReflectionInfo(reader, writer, context);

            return(writer);
        }
Exemplo n.º 10
0
        public void MapGrpcService_LoggerAttachedAndNoMethodsDiscovered_AddsWarningLog()
        {
            // Arrange
            var testSink   = new TestSink();
            var testLogger = new TestLogger(string.Empty, testSink, true);

            var mockLoggerFactory = new Mock <ILoggerFactory>();

            mockLoggerFactory
            .Setup(m => m.CreateLogger(It.IsAny <string>()))
            .Returns((string categoryName) => testLogger);

            var services = ServicesHelpers.CreateServices();

            services.AddSingleton <ILoggerFactory>(mockLoggerFactory.Object);

            var routeBuilder = CreateTestEndpointRouteBuilder(services.BuildServiceProvider(validateScopes: true));

            // Act
            routeBuilder.MapGrpcService <object>();

            // Assert
            var writes = testSink.Writes.ToList();

            var s1 = writes[0].State.ToString();

            Assert.AreEqual("Discovering gRPC methods for System.Object.", s1);

            var s2 = writes[1].State.ToString();

            Assert.AreEqual("Could not find bind method for System.Object.", s2);

            var s3 = writes[2].State.ToString();

            Assert.AreEqual("No gRPC methods discovered for System.Object.", s3);
        }
Exemplo n.º 11
0
        public void MapGrpcService_LoggerAttachedAndMethodsDiscovered_AddsLogForBoundMethod()
        {
            // Arrange
            var testSink   = new TestSink();
            var testLogger = new TestLogger(string.Empty, testSink, true);

            var mockLoggerFactory = new Mock <ILoggerFactory>();

            mockLoggerFactory
            .Setup(m => m.CreateLogger(It.IsAny <string>()))
            .Returns((string categoryName) => testLogger);

            var services = ServicesHelpers.CreateServices();

            services.AddSingleton <ILoggerFactory>(mockLoggerFactory.Object);

            var routeBuilder = CreateTestEndpointRouteBuilder(services.BuildServiceProvider(validateScopes: true));

            // Act
            routeBuilder.MapGrpcService <GreeterWithAttributeService>();

            // Assert
            var writes = testSink.Writes.ToList();

            var s1 = writes[0].State.ToString();

            Assert.AreEqual("Discovering gRPC methods for Grpc.AspNetCore.Server.Tests.TestObjects.Services.WithAttribute.GreeterWithAttributeService.", s1);

            var s2 = writes[1].State.ToString();

            Assert.AreEqual("Added gRPC method 'SayHello' to service 'Greet.Greeter'. Method type: 'Unary', route pattern: '/Greet.Greeter/SayHello'.", s2);

            var s3 = writes[2].State.ToString();

            Assert.AreEqual("Added gRPC method 'SayHellos' to service 'Greet.Greeter'. Method type: 'ServerStreaming', route pattern: '/Greet.Greeter/SayHellos'.", s3);
        }