public void PayloadAsReadOnlySequence_MultiSegmentPayload(int segmentLen1, int segmentLen2, int segmentLen3)
        {
            var origBuffer1 = GetTestBuffer(segmentLen1);
            var origBuffer2 = GetTestBuffer(segmentLen2);
            var origBuffer3 = GetTestBuffer(segmentLen3);
            int totalLen    = origBuffer1.Length + origBuffer2.Length + origBuffer3.Length;

            var context = new DefaultDeserializationContext();

            context.Initialize(fakeBufferReaderManager.CreateMultiSegmentBufferReader(new List <byte[]> {
                origBuffer1, origBuffer2, origBuffer3
            }));

            Assert.AreEqual(totalLen, context.PayloadLength);

            var sequence = context.PayloadAsReadOnlySequence();

            Assert.AreEqual(totalLen, sequence.Length);

            var segmentEnumerator = sequence.GetEnumerator();

            Assert.IsTrue(segmentEnumerator.MoveNext());
            CollectionAssert.AreEqual(origBuffer1, segmentEnumerator.Current.ToArray());

            Assert.IsTrue(segmentEnumerator.MoveNext());
            CollectionAssert.AreEqual(origBuffer2, segmentEnumerator.Current.ToArray());

            Assert.IsTrue(segmentEnumerator.MoveNext());
            CollectionAssert.AreEqual(origBuffer3, segmentEnumerator.Current.ToArray());

            Assert.IsFalse(segmentEnumerator.MoveNext());
        }
        public void ResetContextAndReinitialize()
        {
            var origBuffer = GetTestBuffer(100);
            var context    = new DefaultDeserializationContext();

            context.Initialize(fakeBufferReaderManager.CreateSingleSegmentBufferReader(origBuffer));

            Assert.AreEqual(origBuffer.Length, context.PayloadLength);

            // Reset invalidates context
            context.Reset();

            Assert.AreEqual(0, context.PayloadLength);
            Assert.Throws(typeof(NullReferenceException), () => context.PayloadAsNewBuffer());
#if GRPC_CSHARP_SUPPORT_SYSTEM_MEMORY
            Assert.Throws(typeof(NullReferenceException), () => context.PayloadAsReadOnlySequence());
#endif

            // Previously reset context can be initialized again
            var origBuffer2 = GetTestBuffer(50);
            context.Initialize(fakeBufferReaderManager.CreateSingleSegmentBufferReader(origBuffer2));

            Assert.AreEqual(origBuffer2.Length, context.PayloadLength);
            CollectionAssert.AreEqual(origBuffer2, context.PayloadAsNewBuffer());
        }
        public void PayloadAsNewByteBuffer_SingleSegmentPayload(int segmentLength)
        {
            var origBuffer = GetTestBuffer(segmentLength);
            var context    = new DefaultDeserializationContext();

            context.Initialize(fakeBufferReaderManager.CreateSingleSegmentBufferReader(origBuffer));

            Assert.AreEqual(origBuffer.Length, context.PayloadLength);

            var payload = context.PayloadAsNewBuffer();

            CollectionAssert.AreEqual(origBuffer, payload);
        }
        public void PayloadAsNewByteBuffer_ZeroSegmentPayload()
        {
            var context = new DefaultDeserializationContext();

            context.Initialize(fakeBufferReaderManager.CreateMultiSegmentBufferReader(new List <byte[]> {
            }));

            Assert.AreEqual(0, context.PayloadLength);

            var payload = context.PayloadAsNewBuffer();

            Assert.AreEqual(0, payload.Length);
        }
        public void PayloadAsReadOnlySequence_ZeroSegmentPayload()
        {
            var context = new DefaultDeserializationContext();

            context.Initialize(fakeBufferReaderManager.CreateMultiSegmentBufferReader(new List <byte[]> {
            }));

            Assert.AreEqual(0, context.PayloadLength);

            var sequence = context.PayloadAsReadOnlySequence();

            Assert.AreEqual(ReadOnlySequence <byte> .Empty, sequence);
            Assert.IsTrue(sequence.IsEmpty);
            Assert.IsTrue(sequence.IsSingleSegment);
        }
        public void PayloadAsReadOnlySequence_SingleSegmentPayload(int segmentLength)
        {
            var origBuffer = GetTestBuffer(segmentLength);
            var context    = new DefaultDeserializationContext();

            context.Initialize(fakeBufferReaderManager.CreateSingleSegmentBufferReader(origBuffer));

            Assert.AreEqual(origBuffer.Length, context.PayloadLength);

            var sequence = context.PayloadAsReadOnlySequence();

            Assert.AreEqual(origBuffer.Length, sequence.Length);
            Assert.AreEqual(origBuffer.Length, sequence.First.Length);
            Assert.IsTrue(sequence.IsSingleSegment);
            CollectionAssert.AreEqual(origBuffer, sequence.First.ToArray());
        }
        public void GetPayloadMultipleTimesIsIllegal()
        {
            var origBuffer = GetTestBuffer(100);
            var context    = new DefaultDeserializationContext();

            context.Initialize(fakeBufferReaderManager.CreateSingleSegmentBufferReader(origBuffer));

            Assert.AreEqual(origBuffer.Length, context.PayloadLength);

            var payload = context.PayloadAsNewBuffer();

            CollectionAssert.AreEqual(origBuffer, payload);

            // Getting payload multiple times is illegal
            Assert.Throws(typeof(InvalidOperationException), () => context.PayloadAsNewBuffer());
            Assert.Throws(typeof(InvalidOperationException), () => context.PayloadAsReadOnlySequence());
        }
Ejemplo n.º 8
0
        public static async ValueTask <TResponse?> ReadMessageAsync <TResponse>(
            this Stream responseStream,
            DefaultDeserializationContext deserializationContext,
            ILogger logger,
            Func <DeserializationContext, TResponse> deserializer,
            string grpcEncoding,
            int?maximumMessageSize,
            Dictionary <string, ICompressionProvider> compressionProviders,
            bool singleMessage,
            CancellationToken cancellationToken)
            where TResponse : class
        {
            byte[]? buffer = null;

            try
            {
                GrpcCallLog.ReadingMessage(logger);
                cancellationToken.ThrowIfCancellationRequested();

                // Buffer is used to read header, then message content.
                // This size was randomly chosen to hopefully be big enough for many small messages.
                // If the message is larger then the array will be replaced when the message size is known.
                buffer = ArrayPool <byte> .Shared.Rent(minimumLength : 4096);

                int read;
                var received = 0;
                while ((read = await responseStream.ReadAsync(buffer.AsMemory(received, GrpcProtocolConstants.HeaderSize - received), cancellationToken).ConfigureAwait(false)) > 0)
                {
                    received += read;

                    if (received == GrpcProtocolConstants.HeaderSize)
                    {
                        break;
                    }
                }

                if (received < GrpcProtocolConstants.HeaderSize)
                {
                    if (received == 0)
                    {
                        GrpcCallLog.NoMessageReturned(logger);
                        return(default);
        public void PayloadAsNewByteBuffer_MultiSegmentPayload(int segmentLen1, int segmentLen2, int segmentLen3)
        {
            var origBuffer1 = GetTestBuffer(segmentLen1);
            var origBuffer2 = GetTestBuffer(segmentLen2);
            var origBuffer3 = GetTestBuffer(segmentLen3);

            var context = new DefaultDeserializationContext();

            context.Initialize(fakeBufferReaderManager.CreateMultiSegmentBufferReader(new List <byte[]> {
                origBuffer1, origBuffer2, origBuffer3
            }));

            var payload = context.PayloadAsNewBuffer();

            var concatenatedOrigBuffers = new List <byte>();

            concatenatedOrigBuffers.AddRange(origBuffer1);
            concatenatedOrigBuffers.AddRange(origBuffer2);
            concatenatedOrigBuffers.AddRange(origBuffer3);

            Assert.AreEqual(concatenatedOrigBuffers.Count, context.PayloadLength);
            Assert.AreEqual(concatenatedOrigBuffers.Count, payload.Length);
            CollectionAssert.AreEqual(concatenatedOrigBuffers, payload);
        }
Ejemplo n.º 10
0
        public async Task AsyncDuplexStreamingCall_MessagesStreamed_MessagesReceived()
        {
            // Arrange
            var streamContent = new SyncPointMemoryStream();

            PushStreamContent <HelloRequest, HelloReply>?content = null;

            var httpClient = ClientTestHelpers.CreateTestClient(async request =>
            {
                content = (PushStreamContent <HelloRequest, HelloReply>)request.Content !;
                await content.PushComplete.DefaultTimeout();

                return(ResponseUtils.CreateResponse(HttpStatusCode.OK, new StreamContent(streamContent)));
            });
            var invoker = HttpClientCallInvokerFactory.Create(httpClient);

            // Act
            var call = invoker.AsyncDuplexStreamingCall <HelloRequest, HelloReply>(ClientTestHelpers.ServiceMethod, string.Empty, new CallOptions());

            var requestStream  = call.RequestStream;
            var responseStream = call.ResponseStream;

            // Assert
            await call.RequestStream.WriteAsync(new HelloRequest { Name = "1" }).DefaultTimeout();

            await call.RequestStream.WriteAsync(new HelloRequest { Name = "2" }).DefaultTimeout();

            await call.RequestStream.CompleteAsync().DefaultTimeout();

            var deserializationContext = new DefaultDeserializationContext();

            Assert.IsNotNull(content);
            var requestContent = await content !.ReadAsStreamAsync().DefaultTimeout();
            var requestMessage = await requestContent.ReadMessageAsync(
                deserializationContext,
                NullLogger.Instance,
                ClientTestHelpers.ServiceMethod.RequestMarshaller.ContextualDeserializer,
                GrpcProtocolConstants.IdentityGrpcEncoding,
                maximumMessageSize : null,
                GrpcProtocolConstants.DefaultCompressionProviders,
                singleMessage : false,
                CancellationToken.None).AsTask().DefaultTimeout();

            Assert.AreEqual("1", requestMessage !.Name);
            requestMessage = await requestContent.ReadMessageAsync(
                deserializationContext,
                NullLogger.Instance,
                ClientTestHelpers.ServiceMethod.RequestMarshaller.ContextualDeserializer,
                GrpcProtocolConstants.IdentityGrpcEncoding,
                maximumMessageSize : null,
                GrpcProtocolConstants.DefaultCompressionProviders,
                singleMessage : false,
                CancellationToken.None).AsTask().DefaultTimeout();

            Assert.AreEqual("2", requestMessage !.Name);

            Assert.IsNull(responseStream.Current);

            var moveNextTask1 = responseStream.MoveNext(CancellationToken.None);

            Assert.IsFalse(moveNextTask1.IsCompleted);

            await streamContent.AddDataAndWait(await ClientTestHelpers.GetResponseDataAsync(new HelloReply
            {
                Message = "Hello world 1"
            }).DefaultTimeout()).DefaultTimeout();

            Assert.IsTrue(await moveNextTask1.DefaultTimeout());
            Assert.IsNotNull(responseStream.Current);
            Assert.AreEqual("Hello world 1", responseStream.Current.Message);

            var moveNextTask2 = responseStream.MoveNext(CancellationToken.None);

            Assert.IsFalse(moveNextTask2.IsCompleted);

            await streamContent.AddDataAndWait(await ClientTestHelpers.GetResponseDataAsync(new HelloReply
            {
                Message = "Hello world 2"
            }).DefaultTimeout()).DefaultTimeout();

            Assert.IsTrue(await moveNextTask2.DefaultTimeout());
            Assert.IsNotNull(responseStream.Current);
            Assert.AreEqual("Hello world 2", responseStream.Current.Message);

            var moveNextTask3 = responseStream.MoveNext(CancellationToken.None);

            Assert.IsFalse(moveNextTask3.IsCompleted);

            await streamContent.AddDataAndWait(Array.Empty <byte>()).DefaultTimeout();

            Assert.IsFalse(await moveNextTask3.DefaultTimeout());

            var moveNextTask4 = responseStream.MoveNext(CancellationToken.None);

            Assert.IsTrue(moveNextTask4.IsCompleted);
            Assert.IsFalse(await moveNextTask3.DefaultTimeout());
        }
        public void NullPayloadNotAllowed()
        {
            var context = new DefaultDeserializationContext();

            Assert.Throws(typeof(InvalidOperationException), () => context.Initialize(fakeBufferReaderManager.CreateNullPayloadBufferReader()));
        }