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); }
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); }
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); }
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>()); }
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")); }
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); }
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); }
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); }
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); }
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); }