Beispiel #1
0
        public static void WriteMessage <T>(Stream stream, T message, HttpContextServerCallContext?callContext = null)
            where T : class, IMessage
        {
            var pipeWriter = PipeWriter.Create(stream);

            PipeExtensions.WriteMessageAsync(pipeWriter, message, callContext ?? HttpContextServerCallContextHelper.CreateServerCallContext(), (r, c) => c.Complete(r.ToByteArray()), canFlush: true).GetAwaiter().GetResult();
        }
Beispiel #2
0
        public async Task ReadSingleMessageAsync_EmptyMessage_ReturnNoData()
        {
            // Arrange
            var base64 = Convert.ToBase64String(
                new byte[]
            {
                0x00,     // compression = 0
                0x00,
                0x00,
                0x00,
                0x00,     // length = 0
            });

            var data = Encoding.UTF8.GetBytes(base64);
            var ms   = new MemoryStream(data);

            var pipeReader = new TestPipeReader(new Base64PipeReader(PipeReader.Create(ms)));

            // Act
            var messageData = await pipeReader.ReadSingleMessageAsync(HttpContextServerCallContextHelper.CreateServerCallContext(), MarshallerEchoRequest.ContextualDeserializer);

            // Assert
            Assert.AreEqual(string.Empty, messageData.Message);
            Assert.AreEqual(5, pipeReader.Consumed);
        }
Beispiel #3
0
        public void GlobalSetup()
        {
            var message = new ChatMessage
            {
                Name =
                    "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed at ligula nec orci placerat mollis. " +
                    "Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut aliquet non nunc id lobortis. " +
                    "In tincidunt ac sapien sit amet consequat. Interdum et malesuada fames ac ante ipsum primis in faucibus. " +
                    "Duis vel tristique ipsum, eget hendrerit justo. Donec accumsan, purus quis cursus auctor, sapien nisi " +
                    "lacinia ligula, ut vehicula lorem augue vel est. Vestibulum finibus ornare vulputate."
            };

            var services = new ServiceCollection();

            services.TryAddSingleton <IGrpcInterceptorActivator <UnaryAwaitInterceptor> >(new TestGrpcInterceptorActivator <UnaryAwaitInterceptor>(new UnaryAwaitInterceptor()));
            var serviceProvider = services.BuildServiceProvider();

            var marshaller = CreateMarshaller();

            var method = new Method <ChatMessage, ChatMessage>(MethodType.Unary, typeof(TestService).FullName, nameof(TestService.SayHello), marshaller, marshaller);
            var result = Task.FromResult(message);

            _callHandler = new UnaryServerCallHandler <TestService, ChatMessage, ChatMessage>(
                new UnaryServerMethodInvoker <TestService, ChatMessage, ChatMessage>(
                    (service, request, context) => result,
                    method,
                    HttpContextServerCallContextHelper.CreateMethodOptions(
                        compressionProviders: CompressionProviders,
                        responseCompressionAlgorithm: ResponseCompressionAlgorithm,
                        interceptors: Interceptors),
                    new TestGrpcServiceActivator <TestService>(new TestService())),
                NullLoggerFactory.Instance);

            _trailers = new HeaderDictionary();

            _requestMessage = GetMessageData(message);

            _requestPipe = new TestPipeReader();

            _requestServices = serviceProvider;

            _httpContext = new DefaultHttpContext();
            _httpContext.RequestServices     = _requestServices;
            _httpContext.Request.ContentType = GrpcProtocolConstants.GrpcContentType;
            _httpContext.Request.Protocol    = GrpcProtocolConstants.Http2Protocol;

            _httpContext.Features.Set <IRequestBodyPipeFeature>(new TestRequestBodyPipeFeature(_requestPipe));
            _httpContext.Features.Set <IHttpResponseBodyFeature>(new TestResponseBodyFeature(new TestPipeWriter()));
            _httpContext.Features.Set <IHttpResponseTrailersFeature>(new TestHttpResponseTrailersFeature
            {
                Trailers = _trailers
            });
            _headers = _httpContext.Response.Headers;
            SetupHttpContext(_httpContext);
        }
        protected override byte[] GetMessageData(ChatMessage message)
        {
            var httpContext = new DefaultHttpContext();

            httpContext.Request.Headers.Add(GrpcProtocolConstants.MessageAcceptEncodingHeader, TestCompressionProvider.Name);

            var callContext = HttpContextServerCallContextHelper.CreateServerCallContext(httpContext, serviceOptions: ServiceOptions);

            var ms = new MemoryStream();

            MessageHelpers.WriteMessage(ms, message, callContext);
            return(ms.ToArray());
        }
Beispiel #5
0
        public async Task WriteMessageAsync_NoFlush_WriteNoData()
        {
            // Arrange
            var ms         = new MemoryStream();
            var pipeWriter = new Base64PipeWriter(PipeWriter.Create(ms));

            // Act
            await pipeWriter.WriteMessageAsync(new EchoRequest { Message = "test" }, HttpContextServerCallContextHelper.CreateServerCallContext(), MarshallerEchoRequest.ContextualSerializer, canFlush : false);

            // Assert
            var messageData = ms.ToArray();

            Assert.AreEqual(0, messageData.Length);
        }
Beispiel #6
0
        public async Task ReadStreamMessageAsync_MultipleMessages_Success()
        {
            // Arrange
            var data = Encoding.UTF8.GetBytes("AAAAAAYKBHRlc3Q=AAAAAAYKBHRlc3Q=AAAAAAYKBHRlc3Q=AAAAAAYKBHRlc3Q=AAAAAAYKBHRlc3Q=");
            var ms   = new MemoryStream(data);

            var pipeReader = new TestPipeReader(new Base64PipeReader(PipeReader.Create(ms)));

            // Act 1
            var messageData = await pipeReader.ReadStreamMessageAsync(HttpContextServerCallContextHelper.CreateServerCallContext(), MarshallerEchoResponse.ContextualDeserializer);

            // Assert 1
            Assert.AreEqual("test", messageData !.Message);
            Assert.AreEqual(11, pipeReader.Consumed);

            // Act 2
            messageData = await pipeReader.ReadStreamMessageAsync(HttpContextServerCallContextHelper.CreateServerCallContext(), MarshallerEchoResponse.ContextualDeserializer);

            // Assert 2
            Assert.AreEqual("test", messageData !.Message);
            Assert.AreEqual(22, pipeReader.Consumed);

            // Act 3
            messageData = await pipeReader.ReadStreamMessageAsync(HttpContextServerCallContextHelper.CreateServerCallContext(), MarshallerEchoResponse.ContextualDeserializer);

            // Assert 3
            Assert.AreEqual("test", messageData !.Message);
            Assert.AreEqual(33, pipeReader.Consumed);

            // Act 4
            messageData = await pipeReader.ReadStreamMessageAsync(HttpContextServerCallContextHelper.CreateServerCallContext(), MarshallerEchoResponse.ContextualDeserializer);

            // Assert 4
            Assert.AreEqual("test", messageData !.Message);
            Assert.AreEqual(44, pipeReader.Consumed);

            // Act 5
            messageData = await pipeReader.ReadStreamMessageAsync(HttpContextServerCallContextHelper.CreateServerCallContext(), MarshallerEchoResponse.ContextualDeserializer);

            // Assert 5
            Assert.AreEqual("test", messageData !.Message);
            Assert.AreEqual(55, pipeReader.Consumed);

            // Act 6
            messageData = await pipeReader.ReadStreamMessageAsync(HttpContextServerCallContextHelper.CreateServerCallContext(), MarshallerEchoResponse.ContextualDeserializer);

            // Assert 6
            Assert.IsNull(messageData);
        }
Beispiel #7
0
        public async Task ReadSingleMessageAsync_SmallMessage_Success()
        {
            // Arrange
            var data = Encoding.UTF8.GetBytes("AAAAAAYKBHRlc3Q=");
            var ms   = new MemoryStream(data);

            var pipeReader = new TestPipeReader(new Base64PipeReader(PipeReader.Create(ms)));

            // Act
            var messageData = await pipeReader.ReadSingleMessageAsync(HttpContextServerCallContextHelper.CreateServerCallContext(), MarshallerEchoRequest.ContextualDeserializer);

            // Assert
            Assert.AreEqual("test", messageData.Message);
            Assert.AreEqual(11, pipeReader.Consumed);
        }
Beispiel #8
0
        public async Task WriteMessageAsync_MultipleMessagesWithFlush_WriteMessagesAsSegments()
        {
            // Arrange
            var ms         = new MemoryStream();
            var pipeWriter = new Base64PipeWriter(PipeWriter.Create(ms));

            // Act
            await pipeWriter.WriteMessageAsync(new EchoRequest { Message = "test" }, HttpContextServerCallContextHelper.CreateServerCallContext(), MarshallerEchoRequest.ContextualSerializer, canFlush : true);

            await pipeWriter.WriteMessageAsync(new EchoRequest { Message = "test" }, HttpContextServerCallContextHelper.CreateServerCallContext(), MarshallerEchoRequest.ContextualSerializer, canFlush : true);

            await pipeWriter.WriteMessageAsync(new EchoRequest { Message = "test" }, HttpContextServerCallContextHelper.CreateServerCallContext(), MarshallerEchoRequest.ContextualSerializer, canFlush : true);

            // Assert
            var base64 = Encoding.UTF8.GetString(ms.ToArray());

            Assert.AreEqual("AAAAAAYKBHRlc3Q=AAAAAAYKBHRlc3Q=AAAAAAYKBHRlc3Q=", base64);
        }
Beispiel #9
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);
        }
        public async Task Create_ConfiguredGrpcEndpoint_EndpointReturnedFromReflectionService()
        {
            // Arrange
            var services = new ServiceCollection();

            services.AddGrpc();
            services.AddLogging();
            var serviceProvider = services.BuildServiceProvider();

            var endpointRouteBuilder = new TestEndpointRouteBuilder(serviceProvider);

            endpointRouteBuilder.MapGrpcService <GreeterService>();

            var dataSource = new CompositeEndpointDataSource(endpointRouteBuilder.DataSources);

            var activator = new ReflectionGrpcServiceActivator(dataSource, NullLoggerFactory.Instance);

            // Act
            var service = activator.Create();

            var reader = new TestAsyncStreamReader
            {
                Current = new ServerReflectionRequest
                {
                    ListServices = "" // list all services
                }
            };
            var writer  = new TestServerStreamWriter();
            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);
        }
Beispiel #11
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);
        }
Beispiel #12
0
        public async Task WriteMessageAsync_EmptyMessage_WriteMessageWithNoData()
        {
            // Arrange
            var ms         = new MemoryStream();
            var pipeWriter = new Base64PipeWriter(PipeWriter.Create(ms));

            // Act
            await pipeWriter.WriteMessageAsync(new EchoRequest(), HttpContextServerCallContextHelper.CreateServerCallContext(), MarshallerEchoRequest.ContextualSerializer, canFlush : true);

            // Assert
            var base64      = Encoding.UTF8.GetString(ms.ToArray());
            var messageData = Convert.FromBase64String(base64);

            CollectionAssert.AreEqual(
                new byte[]
            {
                0x00,     // compression = 0
                0x00,
                0x00,
                0x00,
                0x00,     // length = 0
            },
                messageData);
        }
Beispiel #13
0
        public async Task WriteStreamedMessageAsync_MultipleMessagesNoFlush_WriteMessages()
        {
            // Arrange
            var ms           = new MemoryStream();
            var pipeWriter   = new Base64PipeWriter(PipeWriter.Create(ms));
            var writeOptions = new WriteOptions(WriteFlags.BufferHint);

            // Act
            await pipeWriter.WriteStreamedMessageAsync(new EchoRequest { Message = "test" }, HttpContextServerCallContextHelper.CreateServerCallContext(writeOptions: writeOptions), MarshallerEchoRequest.ContextualSerializer);

            await pipeWriter.WriteStreamedMessageAsync(new EchoRequest { Message = "test" }, HttpContextServerCallContextHelper.CreateServerCallContext(writeOptions: writeOptions), MarshallerEchoRequest.ContextualSerializer);

            await pipeWriter.WriteStreamedMessageAsync(new EchoRequest { Message = "test" }, HttpContextServerCallContextHelper.CreateServerCallContext(writeOptions: writeOptions), MarshallerEchoRequest.ContextualSerializer);

            pipeWriter.Complete();

            // Assert
            var base64 = Encoding.UTF8.GetString(ms.ToArray());

            Assert.AreEqual("AAAAAAYKBHRlc3QAAAAABgoEdGVzdAAAAAAGCgR0ZXN0", base64);
        }